问题1:spring4.0与jdk1.6与cxf3.0的兼容问题,之前项目用的是spring4.0与jdk1.6与cxf3.0,接口报错,之后换了jdk1.7,问题解决。

参考:http://bbs.csdn.net/topics/391812556

问题2:cxf的jar包有四个必须删掉,cxf-services-ws-discovery-api-3.1.4.jar,cxf-services-ws-discovery-service-3.1.4.jar,cxf-services-wsn-api-3.1.4.jar,cxf-services-wsn-core-3.1.4.jar.还有一个包:woodstox-core-asl-4.4.0.jar,由于加载顺序太靠后不能正常运行,将此包的名字前加字母a,使其优先加载,但是原先的jar包得保留,不然不行,很奇怪。

参考: http://blog.csdn.net/fengcheqidong/article/details/40423517

一、服务端:

接口类:

@WebService
public interface UserService {
    public String ywDataChange (String stringXml); 
}

接口实现类:

public class UserServiceImpl implements UserService{
    @Autowired
    private DataTbrzService service;    
    //天元访问联信接口,运维系统抄表数据变更通知接口,所需参数:
    //<RES_EAPDATACHANGE_REQ>
    //   <informContent>1</informContent>
    //   <cfd_code>缴费点编码</cfd_code>
    //   <caozuo_fangshi>操作方式</caozuo_fangshi>
    //</RES_EAPDATACHANGE_REQ>    
    public String ywDataChange (String stringXml) {
        String returnMess = "<RES_EAPDATACHANGE_RSP>";
        try {
            Document doc = DocumentHelper.parseText(stringXml);       // 将字符串转为XML
            Element rootElt = doc.getRootElement();              // 获取根节点
            String informContent = rootElt.elementTextTrim("informContent");// 拿到根节点下的子节点informContent值
            String cfd_code = rootElt.elementTextTrim("cfd_code");      // 拿到根节点下的子节点cfd_code值
            String fangshi = rootElt.elementTextTrim("caozuo_fangshi");   // 拿到根节点下的子节点caozuo_fangshi值
            if(cfd_code == null || cfd_code.length() == 0){
                service.SaveDataTbrz(log);
                returnMess += "<code>1</code>";
                returnMess += "<message>参数【cfd_code】不合法</message>";
                returnMess +="</RES_EAPDATACHANGE_RSP>";
                return returnMess;
            }
            if("1".equals(informContent)){             
                String result = tongbu("p_guwang_tongbu.proc_zhandian_tongbu",cfd_code,null,null);      
            }else{
                returnMess += "<code>1</code>";
                returnMess += "<message>参数【informContent】不合法</message>";
                returnMess +="</RES_EAPDATACHANGE_RSP>";
                return returnMess;
            }
            System.out.println("invoke webservice ...");
            returnMess += "<code>0</code>";
            returnMess += "<message>成功</message>";
        } catch (Exception e) {
            e.printStackTrace();
            returnMess += "<code>1</code>";
            returnMess += "<message>同步失败</message>";
        }
        returnMess +="</RES_EAPDATACHANGE_RSP>";
        return returnMess;
    }
}

 web.xml配置:

     <servlet>  
        <servlet-name>CXFService</servlet-name>  
        <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>  
    </servlet>  
    <servlet-mapping>  
        <servlet-name>CXFService</servlet-name>  
        <url-pattern>/webservice/*</url-pattern>  
    </servlet-mapping>

添加一个context_webservice.xml文件:

    <?xml version="1.0" encoding="utf-8"?>    
    <beans xmlns="http://www.springframework.org/schema/beans"  
        xmlns:context="http://www.springframework.org/schema/context"  
        xmlns:jaxws="http://cxf.apache.org/jaxws"   
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
        xsi:schemaLocation="http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans-4.0.xsd 
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context-3.0.xsd 
        http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">        
        <!-- cxf3以后,只需要引入这个配置文件即可,其他两个废弃掉了 -->  
        <jaxws:endpoint   
            id="userService"  
            implementor="com.webservice.UserServiceImpl"  
            address="/UserService">  
        </jaxws:endpoint>  
    </beans>

将web工程部署到tomcat中,然后 ,启动tomcat,在浏览器中输入发布后的,wsdl地址:

http://localhost:8080/epms_web/webservice/UserService?wsdl,若正确显示文档树,表示接口创建成功。

参考:http://blog.csdn.net/liuwenbiao1203/article/details/52452623

二。客户端:

客户端代码借助myeclipse自动生成,点击工具栏的web Service Client按钮,或者new->Other->搜索web Service Client即可,填入wsdl地址,可自动生成客户端代码。此过程中出现错误不影响代码生成。

参考: http://blog.csdn.net/linlzk/article/details/5848033

接口调用代码:

public static void main(String[] args) {
        try {
            JaxWsProxyFactoryBean svr = new JaxWsProxyFactoryBean(); //客户端对象           
            //Properties p = new Properties();
            //InputStream in = UserClient.class.getResourceAsStream("/com/webservice/ywAddress.properties");
            //p.load(in);//将地址存在properties文件中,可动态配置
            //String address = p.getProperty("address");           
             svr.setServiceClass(UserService.class);
            svr.setAddress("http://132.95.12.47:8881/epms_web/webservice/UserService");
            UserService hw = (UserService) svr.create();             //创建
            String mess = "<?xml version='1.0' encoding='UTF-8'?>" +
                    "<RES_EAPDATACHANGE_REQ>" +
                    "<informContent>1</informContent>" +
                    "<cfd_code>DW11-GW-TXJF-2017-10234</cfd_code>" +
                    "<caozuo_fangshi>1</caozuo_fangshi>" +
                    "</RES_EAPDATACHANGE_REQ>";
            String returnXml = hw.ywDataChange(mess);           //访问
            Document doc = DocumentHelper.parseText(returnXml); // 将返回值字符串转为XML
            Element rootElt = doc.getRootElement();
            String message = rootElt.elementTextTrim("code");
            String errMsg = rootElt.elementTextTrim("message");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

至此结束。