CXF构建webservice
以下是使用CXF2.74的构建过程,其他版本要另作细微修改 首先,CXF2.74和spring3.2整合需要准备如下jar包文件: 包下载地址:http://cxf.apache.org/download.html 我下载的是Binary distributionapache-cxf-2.7.4.tar.gz 这五个是服务器端必须的五个,还有Spirng 3.0以上的包,为了避免项目中出现包的版本问题,直接使用spring3.2.1没有使用下载附带的jar包 添加jar包后在web.xml中添加如下配置: <!-- 加载Spring容器配置 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- 设置Spring容器加载配置文件路径 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/applicationContext-server.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class> </listener> <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>/*</url-pattern> </servlet-mapping>
在WEB-INF中新建applicationContext-server.xml如下: 其中红色下划线的schema为手动添加内容
添加完这个文件后,在文件中导入下面的文件 <import resource="classpath:META-INF/cxf/cxf.xml"/>
文件配置好后下面书写服务器端代码 首先编写服务器端接口
package com.gdie.service; import javax.jws.WebParam; import javax.jws.WebService; import com.gdie.service.entities.User; @WebService public interface IComplexUserService { public User getUserByName(@WebParam(name="name")String name) ; public void setUser(User user) ; }
下面是webService的实现类
package com.gdie.service.impl; import javax.jws.WebParam; import javax.jws.WebService; import org.springframework.stereotype.Component; import com.gdie.service.IComplexUserService; import com.gdie.service.entities.User; public class ComplexUserService implements IComplexUserService { public User getUserByName(@WebParam(name="name")String name) { User user = new User() ; user.setId(System.currentTimeMillis()) ; user.setName(name) ; user.setAddress("china") ; user.setEmail(name+"@qq.com") ; return user; } public void setUser(User user) { System.out.println("-------Server setUser------------"); System.out.println("setUser:"+user); } } 然后在配置文件中添加如下: <jaxws:endpointid="userService"address="/userService" implementor="com.gdie.service.impl.ComplexUserService"/>
这样启动tomcat服务器后,在webBrowser中输入如下地址http://localhost:8080/cxfwebservice/就能看到如下界面(注:cxfwebservice是我的项目名)
Cxf客户端如下: 在src目录下添加applicatonContext-client.xml内容如下:
<?xmlversion="1.0"encoding="UTF-8"?> <beansxmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws" 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">
<beanid="client"class="com.gdie.service.IComplexUserService"factory-bean="clientFactory"factory-method="create"/>
<beanid="clientFactory"class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean"> <propertyname="serviceClass"value="com.gdie.service.IComplexUserService"/> <propertyname="address"value="http://localhost:8080/cxfwebservice/userService"/> </bean> 如果是新建的Java application 必须要把刚才的接口类和User类复制过来,并把相关的jar包配置好
package com.gdie.service.main; import java.util.List; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.gdie.service.IComplexUserService; import com.gdie.service.OperatorsService; import com.gdie.service.entities.Thread; import com.gdie.service.entities.User; public class UserServiceTest { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext-client.xml") ; IComplexUserService service = (IComplexUserService)context.getBean("client") ; User user = service.getUserByName("linben") ; System.out.println("result : "+user); service.setUser(user) ; } } 以下是cxf与Spring整合使用autoAwire annotaton的注意点Demo 如下: 新建接口如下:
package com.gdie.service; import java.util.List; import javax.jws.WebService; import com.gdie.service.entities.Thread; @WebService public interface OperatorsService { public int getOperators() ; public List<Thread> getThreads(int page,int size,String info)throws Exception ; } 实现类代码如下,其中:
package com.gdie.service.impl; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.gdie.service.OperatorsService; import com.gdie.service.entities.Thread; import com.gdie.service.services.ForumService; import com.gdie.service.services.OperatorService; @Component(value="operatorServiceImpl") public class OperatorServiceImpl implements OperatorsService{ @Autowired(required=true) private OperatorService service ; @Autowired private ForumService forumService ; @Override public int getOperators() { System.out.println("size"); int size = 8 ; if(null != service) try { size = this.forumService.getThreadCount() ; } catch (Exception e) { e.printStackTrace(); } return size ; } public List<Thread> getThreads(int page,String info) throws Exception{ System.out.println("info ---- >"+info); return this.forumService.getThreads(page,size) ; } } 其中类上必须加上@Component(value="operatorServiceImpl")否则接口类无法注入,同时配置文件的改写为添加应用,格式为#+beanName <jaxws:endpointid="operatorsService"address="/operatorsService"implementor="#operatorServiceImpl"/> 这种格式也是建议使用的格式而不是在 implementor 直接配置类 同时还要加入 <context:annotation-config/> <context:component-scanbase-package="com.gdie.service"/> 这样在程序加载时就会扫描相关的类,完整的格式如下 <context:annotation-config/> <context:component-scanbase-package="com.gdie.service"/> <importresource="classpath:META-INF/cxf/cxf.xml"/> <jaxws:endpointid="userService"address="/userService"implementor="com.gdie.service.impl.ComplexUserService"/> <jaxws:endpointid="operatorsService"address="/operatorsService"implementor="#operatorServiceImpl"/>
上面的OperatorService和ForumService可以自己编写,通过使用@Service可是实现 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |