您的位置:首页 > 运维架构 > Apache

apache-cxf-3.0.4和spring实现rest服务

2015-03-31 01:16 441 查看
1、新建动态web项目CXFRestService,结构如下:



2、引入jar包如下:

aopalliance-1.0.jar
commons-logging-1.1.3.jar
cxf-core-3.0.4.jar
cxf-rt-frontend-jaxrs-3.0.4.jar
cxf-rt-rs-client-3.0.4.jar
cxf-rt-rs-extension-providers-3.0.4.jar
cxf-rt-rs-extension-search-3.0.4.jar
cxf-rt-rs-security-cors-3.0.4.jar
cxf-rt-rs-security-jose-3.0.4.jar
cxf-rt-rs-security-oauth-3.0.4.jar
cxf-rt-rs-security-oauth2-3.0.4.jar
cxf-rt-rs-security-sso-saml-3.0.4.jar
cxf-rt-rs-security-xml-3.0.4.jar
cxf-rt-rs-service-description-3.0.4.jar
cxf-rt-transports-http-3.0.4.jar
javax.ws.rs-api-2.0.1.jar
jaxb-api-2.2.11.jar
jaxb-core-2.2.11.jar
jaxb-impl-2.2.11.jar
jcl-over-slf4j-1.7.9.jar
jettison-1.3.7.jar
log4j-1.2.13.jar
slf4j-api-1.7.9.jar
slf4j-jdk14-1.7.9.jar
spring-aop-3.2.6.RELEASE.jar
spring-beans-3.2.6.RELEASE.jar
spring-context-3.2.6.RELEASE.jar
spring-core-3.2.6.RELEASE.jar
spring-expression-3.2.6.RELEASE.jar
spring-web-3.2.6.RELEASE.jar
stax2-api-3.1.4.jar
woodstox-core-asl-4.4.1.jar
wsdl4j-1.6.3.jar
xmlschema-core-2.2.1.jar
同样参考WHICH_JARS中要点:

For JAX-RS support:
- abdera*  (optional: for AtomPub support, but also needed for the
Management log browser console)
- commons-codec.jar (Needed for Abdera)
- jaxen.jar (Needed for Abdera)
- axiom* (Needed for Abdera)
- javax.ws.rs-api.jar
- jettison.jar (Needed for JSON services only)
- oauth*.jar (Needed for OAuth support)
- cxf-rt-frontend-jaxrs.jar
- cxf-rt-rs-*.jar as needed
但实际执行时发现还是需要cxf-rt-transports-http-3.0.4.jar,不然会提示cxf-servlet.xml找不到。

3、配置文件

web.xml和log4j.properties还是一样没有变化,来看applicationContext-server.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:jaxrs="http://cxf.apache.org/jaxrs"
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-3.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 http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.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" />

<bean id="userRestServiceBean" class="com.java.service.impl.UserRestServiceImpl" />
<!-- 这里的地址很重要,客户端需要通过这个地址来访问WebService -->
<jaxrs:server id="restServiceContainer" address="/rest">
<jaxrs:serviceBeans>
<ref bean="userRestServiceBean" />
</jaxrs:serviceBeans>
<jaxrs:extensionMappings>
<entry key="json" value="application/json" />
<entry key="xml" value="application/xml" />
</jaxrs:extensionMappings>
<jaxrs:languageMappings>
<entry key="en" value="en-gb" />
</jaxrs:languageMappings>
</jaxrs:server>
</beans>


主要注意beans的引用和jaxrs:server定义。

4、实体和服务定义

User.java

import java.io.Serializable;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "UserInfo")
public class User implements Serializable {
private static final long serialVersionUID = 677484458789332877L;
private int id;
private String name;
private String email;
private String address;

@Override
public String toString() {
return this.id + "#" + this.name + "#" + this.email + "#"
+ this.address;
}

// getter/setter
public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getEmail() {
return email;
}

public void setEmail(String email) {
this.email = email;
}

public String getAddress() {
return address;
}

public void setAddress(String address) {
this.address = address;
}
}


IUserRestService.java

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

import com.java.entity.User;

@Path(value = "/rest/")
public interface IUserRestService {
@GET
@Path("/user/{id}")
@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
public User getUser(@PathParam("id") int id);
}


UserRestServiceImpl.java

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

import com.java.entity.User;
import com.java.service.IUserRestService;

@Path(value = "/user/")
public class UserRestServiceImpl implements IUserRestService {
@GET
@Path("/user/{id}")
@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
public User getUser(@PathParam("id") int id) {
User user = new User();
user.setId(id);
user.setName("test_name");
return user;
}
}


5、运行、测试

在tomcat中运行,

地址栏输入http://localhost:8080/CXFRestService/rest/user/user/123,执行结果如下:

<UserInfo>
<id>123</id>
<name>test_name</name>
</UserInfo>
这就是最简单的GET服务了,返回指定ID的用户信息,其他更详细的用法可以参考之前转载的文。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: