一、写一个SDK供外部进行调用
1.用idea的工具通过提供的wsdl文件生成java文件。
将wsdl文件放入项目中,然后通过这个idea自带的工具就可以生成所需的java代码。
2.将生成的文件进行分类、分层级进行存放。
生成的文件都在一个包里,为了更方便的管理,严格按照层级与类型进行存放。
3.生成client与clientImpl文件,提供接口给外部调用,然后实现类进行webService调用。
@WebService(name = "SI_BatchInStock_Out_Syn", targetNamespace = "urn:newhopedariy.cn:MILK:MM:Outbound")
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)
@XmlSeeAlso({
BatchInStockFactory.class
})
public interface SIBatchInStockOutSyn {
/**
* @param parameters
* @return returns mypackage.ZMMBATCHINSTOCKResponse
*/
@WebMethod(operationName = "SI_BatchInStock_Out_Syn", action = "http://sap.com/xi/WebService/soap1.1")
@WebResult(name = "ZMM_BATCH_IN_STOCK.Response", targetNamespace = "urn:sap-com:document:sap:rfc:functions", partName = "parameters")
public ZMMBATCHINSTOCKResponse siBatchInStockOutSyn(
@WebParam(name = "ZMM_BATCH_IN_STOCK", targetNamespace = "urn:sap-com:document:sap:rfc:functions", partName = "parameters")
ZMMBATCHINSTOCK parameters);
}
生成的文件中有一个后缀为Syn的文件,这个文件就相当于sap提供的API,本SDK的主要作用就是调用此API,其他服务就不需要再一次搭建这个连接进行调用了。
自行定义一个client文件,提供给其他服务来调用这个SDK。
clientImpl文件进行调用的基础设置的拼装,并且获取连接,最后调用sap提供的API接口。作为一个SDK可以将返回参数进行一个简单的封装,类似于 状态码+result的方式,其他服务更方便确认调用是否成功。
基础设置:
private void bashInit(LocalAuthenticator localAuthenticator) {
Authenticator.setDefault(localAuthenticator);
//覆盖cxf默认设置Element最大限制50000
Properties props = System.getProperties();
props.setProperty("org.apache.cxf.stax.maxChildElements", "150000");
props.setProperty("UseSunHttpHandler", "true");
}
创建http连接:
@WebEndpoint(name = "HTTP_Port")
public SIBatchInStockOutSyn getHTTPPort() {
return super.getPort(new QName("urn:newhopedariy.cn:MILK:MM:Outbound", "HTTP_Port"), SIBatchInStockOutSyn.class);
}
调用实现:其中siBatchInStockOutSyn为生成的外部API
@Override
public ZMMBATCHINSTOCKResponse batchInStockOutSyn(ZMMBATCHINSTOCK zmmbatchinstock) {
LocalAuthenticator localAuthenticator = LocalAuthenticator.authen();
bashInit(localAuthenticator);
SIBatchInStockOutSynService ss = new SIBatchInStockOutSynService();
SIBatchInStockOutSyn port = ss.getHTTPPort();
return port.siBatchInStockOutSyn(zmmbatchinstock);
}
4.其他服务调用SDK提供的API就能调用到外部提供的API。
其他服务引用这个sdk过后,自己按照接口文档,将请求参数自行拼装,然后调用SDK提供的API即可。
经过尝试,这个方法可以进行用户名与密码的验证,且更简单。
用户名密码的验证方法:
LocalAuthenticator authenticator = LocalAuthenticator.authen();
authenticator.setUserName("userName");
authenticator.setPassword("passWord");
authenticator.setEnvironment("DEV");
二、通过Axis2生成文件进行调用
1.通过Axis2生成两个文件,后缀分别为handler、stub。
安装Axis2并设置环境变量,然后通过命令行来生成文件
打开cmd,执行命令 wsdl2java -uri http://localhost:8080/lwtms/services/ForElectronicRecordService?wsdl -p com.fxf.test -o e:\20150531
参数解释:-uri webservice接口地址 -p 是生成代码的包路径(类路径),-o 是代码的生成目录。
2.按照demo上的方法就可以调用到sap
public class Demo {
private static final String TARGET = "生成时自带的";
private static final String USERNAME = "";
private static final String PASSWORD = "";
public static void main(String[] args) {
try {
com.newhopedairy.ts.sd.outbound.wsdl2java.SI_SalesOrganization_Out_SynServiceStub stub = new SI_SalesOrganization_Out_SynServiceStub(TARGET);
//设置用户名口令
HttpTransportProperties.Authenticator auth = new HttpTransportProperties.Authenticator();
auth.setUsername(USERNAME);
auth.setPassword(PASSWORD);
stub._getServiceClient().getOptions().setProperty(HTTPConstants.AUTHENTICATE, auth);
//调用接口
SI_SalesOrganization_Out_SynServiceStub.ZSD_SALES_ORGANIZATION_RFCResponse response = stub.sI_SalesOrganization_Out_Syn(setRequest());
System.out.println(response.getET_LGORT().getItem());
} catch (AxisFault axisFault) {
axisFault.printStackTrace();
} catch (RemoteException e) {
e.printStackTrace();
} catch (RfcZSD_SALES_ORGANIZATION_RFCException e) {
e.printStackTrace();
}
}
//设置请求参数
public static SI_SalesOrganization_Out_SynServiceStub.ZSD_SALES_ORGANIZATION_RFC setRequest() {
SI_SalesOrganization_Out_SynServiceStub.ZSD_SALES_ORGANIZATION_RFC request = new SI_SalesOrganization_Out_SynServiceStub.ZSD_SALES_ORGANIZATION_RFC();
SI_SalesOrganization_Out_SynServiceStub.IT_BUKRS_type0 itBukrsType0 = new SI_SalesOrganization_Out_SynServiceStub.IT_BUKRS_type0();
//公司代码
SI_SalesOrganization_Out_SynServiceStub.FAGL_S_BUKRS item = new SI_SalesOrganization_Out_SynServiceStub.FAGL_S_BUKRS();
item.setBUKRS(SI_SalesOrganization_Out_SynServiceStub.BUKRS_type9.Factory.fromString("4001", null));
itBukrsType0.addItem(item);
request.setIT_BUKRS(itBukrsType0);
return request;
}
}
也许这种方法也可以设置用户名进行验证,但我自己目前还没有成功。具体这种方法更详细解答的可以参考:
java调用sap系统wsdl_Java调用Axis2用SAP WSDL生成的Stub文件_苏友学的博客-CSDN博客
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)