springmvc整合axis2 过程

项目需要使用springmvc发布一个对外的服务,原来使用spring+cxf的结合,使用axis2的客户端调用,没有任何问题,但是使用pb9的客户端调用,一直出现一个莫名奇妙的错误(PNBI),好几天没有解决,也有说PB9调用CXF的服务有BUG,不知道确切的问题。

原来对axis2的框架比较熟悉,所以,把项目改成spring+axis2的服务。过程如下:

1、建立一个web project,导入spring的支持jar包。

2、导入axis2的支持jar包。

201709_2UjY_2903180.png

3、配置web.xml的文件

<!-- spring核心配置 -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath*:applicationContext-*.xml</param-value>
    </context-param>

    <!-- axis -->
    <servlet>
        <display-name>Apache-Axis Servlet</display-name>
        <servlet-name>AxisServlet</servlet-name>
        <servlet-class>org.apache.axis2.transport.http.AxisServlet</servlet-class>
         <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet>
        <servlet-name>AxisAdminServlet</servlet-name>
        <servlet-class>org.apache.axis2.webapp.AxisAdminServlet
        </servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>AxisServlet</servlet-name>
        <url-pattern>*.jws</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>AxisServlet</servlet-name>
        <url-pattern>/services(此处services名称一定不能变,不然会有莫名奇妙的错误,切记切记,在此耽误了一天时间)/*</url-pattern>
    </servlet-mapping>

4、配置service.xml文件,位置在/WEB-INF/services/mydomain(此处名称任意)/META-INF/services.xml

<?xml version="1.0" encoding="UTF-8"?>
<serviceGroup>
    <service name="personService" targetNamespace="http://impl.service.as.com">
        <description>用户服务</description>

        <!--SpringBeanName不能变,personService是定义的ID,你懂的-->
        <parameter name="SpringBeanName">personService</parameter>
        <parameter name="ServiceObjectSupplier">
            org.apache.axis2.extensions.spring.receivers.SpringServletContextObjectSupplier
        </parameter>
        <parameter name="ServiceClass">
            com.as.service.impl.PersonServiceImp
        </parameter>
        <messageReceivers>
            <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out" 
                class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
            <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only" 
                class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver" />
        </messageReceivers>
    </service>
</serviceGroup>

5、spring的application.xml中配置如下

<bean id="applicationContext"                         class="org.apache.axis2.extensions.spring.receivers.ApplicationContextHolder"  />
    <bean id="personService"  class="com.as.service.impl.PersonServiceImp"/>

6、定义一个接口和实现接口的类

接口

package com.as.service;

import com.as.domain.Person;

public interface PersonService {
    /*public Person getPersonById(String id);*/
    public String helloWorld(String name);
}

实现类

package com.as.service.impl;

import javax.annotation.Resource;

import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.transaction.annotation.Transactional;

import com.as.domain.Person;
import com.as.service.PersonService;

@Transactional
public class PersonServiceImp implements PersonService {

    @Override
    public String helloWorld(String name) {
        // TODO Auto-generated method stub
        return "hello,"+name;
    }
}

然后,发布到tomcat中,访问地址:

http://localhost:8080/AxisSpring/servic202756_julK_2903180.png

总结,一个问题折磨了我一天时间,就是第三步提到的services的路径问题,我沿用了原来项目的webservice的定义,导致调用的时候,提示

org.apache.axis2.AxisFault: The service cannot be found for the endpoint reference (EPR)

怎么也检查不出问题所在,无意中看到这个路径,修改以后就正常了,不知道什么原因。

axis2客户端调用代码

public static void main(String[] args) {
        PersonServiceStub pss = null;
        try {
            pss = new PersonServiceStub("http://localhost:8080/AxisSpring/services/personService?wsdl");
        } catch (AxisFault e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        HelloWorld hw = new HelloWorld();
        hw.setName("unaras");

        HelloWorldResponse hwr=null;
        try {
            hwr = pss.helloWorld(hw);
        } catch (RemoteException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println(hwr.get_return());
    }

成功。

pb9的调用代码
soapconnection   conn_soap  
personservicehttpsoap11endpoint smsport
long  rVal
String endpoint="http://localhost:8080/AxisSpring/services/personService"
conn_soap = CREATE soapconnection
smsport = CREATE personservicehttpsoap11endpoint

rVal = conn_soap.CreateInstance(smsport,"personservicehttpsoap11endpoint",endpoint)
conn_soap.SetOptions("SoapLog=~"mySoapLog.log~"")
//conn_soap.SetOptions()
if rVal <> 0 then 
     messagebox('提示:','连接网络URL 出现错误,错误代码: '+string(rval))
     return
end if
String rs

rs = smsport.helloWorld("unaras")
messagebox('标题',rs)
 

destroy conn_soap
destroy smsport

转载于:https://my.oschina.net/maojindaoGG/blog/880138

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值