JAVA调用SAP报错信息,各位帮忙看看什么原因

Python010

JAVA调用SAP报错信息,各位帮忙看看什么原因,第1张

JAVA调用SAP报错叫做JCo二次部署异常。 JCo的原理是通过加载本地驱动实现的,因此在web项目里面在不重启server的情况下是无法重复加载sapjco3.dll驱动的,由于JCo是通过JNI实现的,即加载sapjco3.dll实现Java与SAP的通信,而JNI加载的class没办法被classloader卸载导致不能重复

将sapjco3.dll加到web容器(resin)的lib中,而将项目的WEB-INF\lib去掉,

获取SAP连接

* @return SAP连接对象

*/

public static JCoDestination connect(){

JCoDestination destination =null

try {

destination = JCoDestinationManager.getDestination(ABAP_AS_POOLED)

} catch (JCoException e) {

log.error("Connect SAP fault, error msg: " + e.toString())

}

给你举个例子吧,如下:

1:Sap 域模型

package abc

public class SapSystem implements java.lang.Cloneable {

private final String name

private final String host

private final String client

private final String systemNumber

private final String user

private final String password

private final String language ="en"// English will be used as login language

/**

* Constructor, Login language is assumed to be English

* @param name

* @param client

* @param user

* @param password

* @param host

* @param systemNumber

*/

public SapSystem(String name, String host, String client

, String systemNumber, String user, String password) {

this.name = name

this.client = client

this.user = user

this.password = password

this.host = host

this.systemNumber = systemNumber

}

public String getName() {

return name

}

public String getClient() {

return client

}

public String getUser() {

return user

}

public String getPassword() {

return password

}

public String getLanguage() {

return language

}

public String getHost() {

return host

}

public String getSystemNumber() {

return systemNumber

}

@Override

public String toString() {

return "Client " + client + " User " + user + " PW " + password

+ " Language " + language + " Host " + host + " SysID "

+ systemNumber

}

@Override

public int hashCode() {

final int prime = 31

int result = 1

result = prime * result + ((client == null) ? 0 : client.hashCode())

result = prime * result + ((host == null) ? 0 : host.hashCode())

result = prime * result

+ ((language == null) ? 0 : language.hashCode())

result = prime * result + ((name == null) ? 0 : name.hashCode())

result = prime * result

+ ((password == null) ? 0 : password.hashCode())

result = prime * result

+ ((systemNumber == null) ? 0 : systemNumber.hashCode())

result = prime * result + ((user == null) ? 0 : user.hashCode())

return result

}

@Override

public boolean equals(Object obj) {

if (this == obj)

return true

if (obj == null)

return false

if (getClass() != obj.getClass())

return false

SapSystem other = (SapSystem) obj

if (client == null) {

if (other.client != null)

return false

} else if (!client.equals(other.client))

return false

if (host == null) {

if (other.host != null)

return false

} else if (!host.equals(other.host))

return false

if (language == null) {

if (other.language != null)

return false

} else if (!language.equals(other.language))

return false

if (name == null) {

if (other.name != null)

return false

} else if (!name.equals(other.name))

return false

if (password == null) {

if (other.password != null)

return false

} else if (!password.equals(other.password))

return false

if (systemNumber == null) {

if (other.systemNumber != null)

return false

} else if (!systemNumber.equals(other.systemNumber))

return false

if (user == null) {

if (other.user != null)

return false

} else if (!user.equals(other.user))

return false

return true

}

@Override

public Object clone() {

try {

return super.clone()

} catch (CloneNotSupportedException e) {

e.printStackTrace()

}

return null

}

}

=====================================

2:建立连接

import java.util.Properties

import com.sap.conn.jco.ext.DestinationDataEventListener

import com.sap.conn.jco.ext.DestinationDataProvider

import de.vogella.sap.system.model.SapSystem

/**

* Represents the destination to a specific SAP system.

* The destination is maintained via a property file

*

*/

public class MyDestinationDataProvider implements DestinationDataProvider {

static String SAP_SERVER = "SAP_SERVER"

private final Properties ABAP_AS_properties

public MyDestinationDataProvider(SapSystem system) {

Properties properties = new Properties()

properties.setProperty(DestinationDataProvider.JCO_ASHOST, system

.getHost())

properties.setProperty(DestinationDataProvider.JCO_SYSNR, system

.getSystemNumber())

properties.setProperty(DestinationDataProvider.JCO_CLIENT, system

.getClient())

properties.setProperty(DestinationDataProvider.JCO_USER, system

.getUser())

properties.setProperty(DestinationDataProvider.JCO_PASSWD, system

.getPassword())

ABAP_AS_properties = properties

}

@Override

public Properties getDestinationProperties(String system) {

return ABAP_AS_properties

}

@Override

public void setDestinationDataEventListener(

DestinationDataEventListener eventListener) {

}

@Override

public boolean supportsEvents() {

return false

}

}

==================

import com.sap.conn.jco.JCoContext

import com.sap.conn.jco.JCoDestination

import com.sap.conn.jco.JCoDestinationManager

import com.sap.conn.jco.JCoException

import com.sap.conn.jco.JCoFunction

import com.sap.conn.jco.JCoRepository

import de.vogella.sap.system.model.SapSystem

/**

* Connection allows to get and execute SAP functions. The constructor expect a

* SapSystem and will save the connection data to a file. The connection will

* also be automatically be established.

*/

public class Connection {

static String SAP_SERVER = "SAP_SERVER"

private JCoRepository repos

private JCoDestination dest

public Connection(SapSystem system) {

MyDestinationDataProvider myProvider = new MyDestinationDataProvider(system)

com.sap.conn.jco.ext.Environment

.registerDestinationDataProvider(myProvider)

try {

dest = JCoDestinationManager.getDestination(SAP_SERVER)

System.out.println("Attributes:")

System.out.println(dest.getAttributes())

repos = dest.getRepository()

} catch (JCoException e) {

throw new RuntimeException(e)

}

}

/**

* Method getFunction read a SAP Function and return it to the caller. The

* caller can then set parameters (import, export, tables) on this function

* and call later the method execute.

*

* getFunction translates the JCo checked exceptions into a non-checked

* exceptions

*/

public JCoFunction getFunction(String functionStr) {

JCoFunction function = null

try {

function = repos.getFunction(functionStr)

} catch (Exception e) {

e.printStackTrace()

throw new RuntimeException(

"Problem retrieving JCO.Function object.")

}

if (function == null) {

throw new RuntimeException("Not possible to receive function. ")

}

return function

}

/**

* Method execute will call a function. The Caller of this function has

* already set all required parameters of the function

*

*/

public void execute(JCoFunction function) {

try {

JCoContext.begin(dest)

function.execute(dest)

} catch (JCoException e) {

e.printStackTrace()

} finally {

try {

JCoContext.end(dest)

} catch (JCoException e) {

e.printStackTrace()

}

}

}

}

======================

3:测试连接

import static org.junit.Assert.assertTrue

import org.junit.Test

import com.sap.conn.jco.JCoFunction

import com.sap.conn.jco.JCoTable

import de.vogella.sap.rfc.core.connection.Connection

import de.vogella.sap.system.model.SapSystem

public class ConnectionTester {

static String SAP = "SAP_SERVER"

@Test

public void checkConnection() {

// SAP System

SapSystem system = new SapSystem("PFT", "pwdf6394.wdf.sap.corp", "600", "76", "mytester", "welcome")

Connection connect = new Connection(system)

JCoFunction function = connect.getFunction("BAPI_USER_GETLIST")

function.getImportParameterList().setValue("MAX_ROWS", 10)

connect.execute(function)

JCoTable table = function.getTableParameterList().getTable("USERLIST")

assertTrue("User Tabelle should not be empty", !table.isEmpty())

}

}

======================

4:简化JCo存取

import com.sap.conn.jco.JCoTable

/**

* TableAdapter is used to simplify the reading of the values of the Jco tables

*/

public class TableAdapterReader {

protected JCoTable table

public TableAdapterReader(JCoTable table) {

this.table = table

}

public String get(String s) {

return table.getValue(s).toString()

}

public Boolean getBoolean(String s) {

String value = table.getValue(s).toString()

return value.equals("X")

}

public String getMessage() {

return table.getString("MESSAGE")

}

public int size() {

return table.getNumRows()

}

public void next() {

table.nextRow()

}

}

5:最后测试

import static org.junit.Assert.assertNotNull

import static org.junit.Assert.assertTrue

import org.junit.Test

import com.sap.conn.jco.JCoFunction

import com.sap.conn.jco.JCoTable

import de.vogella.sap.rfc.core.connection.Connection

import de.vogella.sap.rfc.helper.TableAdapterReader

import de.vogella.sap.system.model.SapSystem

public class TableAdapterTester {

@Test

public void checkConnection() {

// SAP System

SapSystem system = new SapSystem("PFT", "pwdf6394.wdf.sap.corp", "600",

"76", "mytester", "welcome")

Connection connect = new Connection(system)

JCoFunction function = connect.getFunction("BAPI_USER_GETLIST")

function.getImportParameterList().setValue("MAX_ROWS", 10)

connect.execute(function)

JCoTable table = function.getTableParameterList().getTable("USERLIST")

TableAdapterReader adapter = new TableAdapterReader(table)

System.out.println("Number of Users: " + adapter.size())

for (int i = 0i <adapter.size()i++) {

// USERNAME is a column in the table "USERLIST"

String s = adapter.get("USERNAME")

assertNotNull(s)

assertTrue(s.length() >0)

System.out.println(s)

adapter.next()

}

assertTrue("User Tabelle should not be empty", !table.isEmpty())

}

}