Java两种调用sap的方法

Java两种调用sap的方法,第1张

一、写一个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博客

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/874326.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-13
下一篇 2022-05-13

发表评论

登录后才能评论

评论列表(0条)

保存