1. 程式人生 > >maven整合webservice(cxf)的時候可能會出現的問題

maven整合webservice(cxf)的時候可能會出現的問題

1 使用的maven包,將cxf的jar包資訊放到pom.xml中會出現錯誤。(cxf-rt-frontend-jaxws),將此包放入到pomxml中的時候會報錯,再加入cxf-rt-transports-http包時錯誤會消失

貼出以下資訊。

<!--webservice所需要的包-->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>3.1.6</version>

</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>3.1.6</version>
</dependency>

2.配置web.xml的時候注意將以下資訊放在DispatcherServlet之前。

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

<context-param>

3.在配置webxml時不要忘記將配置檔案引入到spring的掃描路徑中

4在使用@webservice註解時,可能會出現Access restriction: The type 'WebService' is not API (restriction on require....等警告,並且IDE中不會提示此標籤,修復了一下就好了,原因不明,有知道的可以告訴我,共同學習

5在執行的時候可能會報錯:Configuration problem: Failed to import bean definitions from URL location [classpath:META-INF/cxf/cxf-extension-soap.xml]

原因是使用了2.4以下的配置卻使用的2.4以上的jar包,官方有說明如下:

Changes in CXF 2.4.x

The below is applicable for CXF versions 2.3.x and older. Starting in CXF 2.4.0, the extensions are loaded internally by CXF automatically and you do not need to import all the cxf-extension-*.xml file. You only need to import classpath:META-INF/cxf/cxf.xml.

在使用2.3或者更早的版本的時候你需要引入cxf-extension-*.xml 從2.4開始你就不用引入這個xml了只需要引入<import resource="classpath:META-INF/cxf/cxf.xml" />  


5在編寫cxf的同時,要注意一點為不要將@webservice的註解新增在介面上,請直接新增到實現類上,不然可能會出現的問題是,在用jaxws呼叫時出現XXXX是介面,而jaxws無法處理介面。

最後貼一下cxf的配置檔案和helloworld


spring-cxf.xml


<?xml version="1.0" encoding="utf-8"?>  
<beans xmlns="http://www.springframework.org/schema/beans"    
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    
    xmlns:jaxws="http://cxf.apache.org/jaxws"  
    xmlns:http-conf = "http://cxf.apache.org/transports/http/configuration"    
    xsi:schemaLocation="http://www.springframework.org/schema/beans   
        http://www.springframework.org/schema/beans/spring-beans.xsd     
        http://cxf.apache.org/jaxws   
        http://cxf.apache.org/schemas/jaxws.xsd  
        http://cxf.apache.org/transports/http/configuration      
        http://cxf.apache.org/schemas/configuration/http-conf.xsd">         
  <import resource="classpath:META-INF/cxf/cxf.xml" />  
  <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />  
  <import resource="classpath:META-INF/cxf/cxf-servlet.xml" />  


<jaxws:endpoint id="hello"
implementor="com.nuotai.webservice.impl.helloWorldImpl" address="/hello" />
</beans> 



helloWorld.java


package com.nuotai.webservice;


import javax.jws.WebMethod;
import javax.jws.WebService;


import com.nuotai.model.User;




@WebService
public interface  helloWorld {

@WebMethod
public String sayHello(String name); 
 


@WebMethod
public String sayHello2(User user); 


}


helloWorldImpl.java


package com.nuotai.webservice.impl;


import javax.jws.WebService;


import com.alibaba.fastjson.JSONObject;
import com.nuotai.model.User;
import com.nuotai.webservice.helloWorld;


@WebService
public class helloWorldImpl implements helloWorld {


public String sayHello(String name) {
JSONObject myJsonObject = JSONObject.parseObject(name);
String nameTemp = myJsonObject.getString("name");
/*
* String nameTemp = name.getString("name");
* System.out.println(nameTemp);
*/
return nameTemp;
}


public String sayHello2(User user) {
JSONObject json = new JSONObject();
String name = user.getUser_name();
json.put("name", name);
return json.toJSONString();
}
}