问题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();
}
}
至此结束。
转载于:https://blog.51cto.com/11018872/1902841