spring boot 整合cfx,axis2创建webservice客户端

两种实现:

先定义一个服务接口:

/**
 * webservice 服务接口
 * @author hkk
 */
public interface IServiceAgent {
    String invoke(Object... params) throws Exception;
}

 

一. cfx实现:

 

/**
 * WebService访问代理类:cxf
 */
@Component
@Primary
@Slf4j
public class WebServiceCFXAgent implements IServiceAgent {

    /**
     * 创建动态客户端工厂
     */
    private CisJaxWsDynamicClientFactory dynamicClientFactory;

    /**
     * 创建动态客户端
     */
    private Client client;

    /**
     * 配置文件Bean,获取webservice url
     */
    private AppConfig appConfig;

    public WebServiceCFXAgent(AppConfig appConfig) {
        this.appConfig = appConfig;
        initConfig();
    }

    private void initConfig() {
        this.dynamicClientFactory = CisJaxWsDynamicClientFactory.newInstance();

        this.client = dynamicClientFactory.createClient(appConfig.getServiceUrl());

        JaxWsProxyFactoryBean factoryBean = new JaxWsProxyFactoryBean();

        // 设置超时时间
        HTTPConduit conduit = (HTTPConduit) this.client.getConduit();
        HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();
        //连接超时时间:30s
        httpClientPolicy.setConnectionTimeout(30000);
        //请求响应超时时间:60s
        httpClientPolicy.setReceiveTimeout(60000);
        conduit.setClient(httpClientPolicy);
    }

    /**
     * Webservice调用方法
     * @param methodName
     * @param params
     * @return
     * @throws Exception
     */
    public String invoke(String methodName, Object... params) throws Exception {

        Object[] objects = new Object[0];
        try {
            objects = this.client.invoke(methodName, params);
            return  objects[0].toString();
        }
        catch (Exception ex){
            log.error("上传报文:" + Arrays.toString(params));
            log.error("返回报文:" + Arrays.toString(objects));
            log.error(ex.getMessage());
            throw ex;
        }
    }

    /**
     * Webservice调用方法
     * @param params
     * @return
     * @throws Exception
     */
    @Override
    public String invoke(Object... params) throws Exception {
        return invoke(appConfig.getMethodName(), params);
    }
}

 

二. axis2实现

 

/**
 * WebService访问代理类:axis2
 */
@Component
public class WebServiceAxis2Agent implements IServiceAgent {

    private RPCServiceClient serviceClient;

    private Class[] responseParam;

    private QName requestMethod;

    /**
     * 配置文件Bean,获取webservice url
     */
    private AppConfig appConfig;

    public WebServiceAxis2Agent(AppConfig appConfig) throws AxisFault {
        this.appConfig = appConfig;
        serviceClient = new RPCServiceClient();
        Options options = serviceClient.getOptions();

        // 指定调用WebService的URL
        EndpointReference targetEPR = new EndpointReference(appConfig.getServiceUrl());
        options.setTo(targetEPR);

        // 指定方法返回值的数据类型的Class对象
        responseParam = new Class[] { String.class };
        // 指定要调用的getGreeting方法及WSDL文件的命名空间
        requestMethod = new QName(appConfig.getNamespaceUri(), appConfig.getMethodName());
    }
    @Override
    public String invoke(Object... params) {

        String result = null;
        try {
            // 调用方法并输出该方法的返回值
            result = "" + serviceClient.invokeBlocking(requestMethod, params, responseParam)[0];

        } catch (AxisFault e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }
}

以上的两种方法调用方法都是一样:通过接口注入,注意@Primary,将优先使用

    @Autowired
    private IServiceAgent webAgent;

    @RequestMapping("/test")
    public String webServiceTest() throws Exception {

        Object[] objs = {"2343", "435", "567", "678", "789", "789"};

        String result = webAgent.invoke(objs);

        return result;
    }

这个调用invoke方法其实不太友好,所以

/**
 * WebService访问代理类:cxf
 * @author hkk
 */
@Configuration
@Slf4j
public class WebServiceCFXConfiguration {

    /**
     * 配置文件Bean,获取webservice url
     */
    private AppConfig appConfig;

    public WebServiceCFXConfiguration(AppConfig appConfig) {
        this.appConfig = appConfig;
    }

    @Bean
    public Mhs5service mhs5service() {

        JaxWsProxyFactoryBean factoryBean = new JaxWsProxyFactoryBean();
        factoryBean.setServiceClass(Mhs5service.class);
        factoryBean.setAddress(appConfig.getServiceUrl());

        Mhs5service mhs5service = (Mhs5service) factoryBean.create();

        // 设置超时时间
//        HTTPConduit conduit = (HTTPConduit) this.client.getConduit();
//        HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();
//        //连接超时时间:30s
//        httpClientPolicy.setConnectionTimeout(30000);
//        //请求响应超时时间:60s
//        httpClientPolicy.setReceiveTimeout(60000);
//        conduit.setClient(httpClientPolicy);
        return mhs5service;
    }

}

接口类定义:

@WebService(targetNamespace = "http://service.server.hkk.com/")
public interface Mhs5service {
 
    @WebMethod(operationName="invokeCotton")
    String invokeCotton(String a, String b, String c,
                               String d, String e, String f);
}

注意要加:targetNamespace 

这个调用就友好多了

    @Autowired
    private Mhs5service mhs5service;    

    @RequestMapping("/mhs5service")
    public String mhs5service() throws Exception {

        String result = mhs5service.invokeCotton("2343", "435", "567", "678", "789", "789");

        return result;
    }

 

POM文件:

<properties>
        <java.version>1.8</java.version>
        <org.apache.axis2.version>1.7.8</org.apache.axis2.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <ojdbc8.version>12.2.0.1</ojdbc8.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.mybatis.spring.boot/mybatis-spring-boot-starter -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.3</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-typehandlers-jsr310</artifactId>
            <version>1.0.2</version>
        </dependency>

        <!--配置oracle数据库,从maven仓库中获取-->
        <dependency>
            <groupId>com.oracle.database.jdbc</groupId>
            <artifactId>ojdbc8</artifactId>
            <version>${ojdbc8.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
            <version>2.2.2.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-spring-boot-starter-jaxws</artifactId>
            <version>3.2.7</version>
        </dependency>

        <!--axis2 begin-->
        <dependency>
            <groupId>org.apache.axis2</groupId>
            <artifactId>axis2-spring</artifactId>
            <version>${org.apache.axis2.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.axis2</groupId>
            <artifactId>axis2-transport-http</artifactId>
            <version>${org.apache.axis2.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.axis2</groupId>
            <artifactId>axis2-transport-local</artifactId>
            <version>${org.apache.axis2.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.axis2</groupId>
            <artifactId>axis2-xmlbeans</artifactId>
            <version>${org.apache.axis2.version}</version>
        </dependency>
        <!--axis2 end-->
    </dependencies>

 

posted @ 2021-01-14 14:12  二奎  阅读(2067)  评论(0编辑  收藏  举报