以下是使用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为手动添加内容
<?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"xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context" 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"> </beans> |
添加完这个文件后,在文件中导入下面的文件
<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,int size,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可是实现
转载于:https://blog.51cto.com/linben/1286834