JAX-RS (JSR-311/339/370) 是 Java RESTful Web Service 標準 API。Apache CXF 是成熟的 JAX-RS 實現,與 Spring 無縫整合。本文記錄從 Maven 依賴、web.xml、Spring XML 配置、服務實現到瀏覽器驗證的全流程,附 GitHub 源碼地址。
@Path, @GET, @POST, @Produces, @Consumes, @PathParam 等。
<properties>
<cxf.version>3.0.3</cxf.version>
<spring.version>4.1.4.RELEASE</spring.version>
<jax.ws.rs>2.0.1</jax.ws.rs>
<jackson.version>1.1.1</jackson.version>
</properties>
<dependencies>
<!-- CXF JAX-RS 前端 -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxrs</artifactId>
<version>${cxf.version}</version>
</dependency>
<!-- HTTP 傳輸 -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>${cxf.version}</version>
</dependency>
<!-- 服務描述 (WADL) -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-rs-service-description</artifactId>
<version>${cxf.version}</version>
</dependency>
<!-- JSON Provider -->
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-jaxrs</artifactId>
<version>${jackson.version}</version>
</dependency>
<!-- JAX-RS API -->
<dependency>
<groupId>javax.ws.rs</groupId>
<artifactId>javax.ws.rs-api</artifactId>
<version>${jax.ws.rs}</version>
</dependency>
<!-- Spring + MyBatis 略 -->
</dependencies>
<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>/ws/*</url-pattern>
</servlet-mapping>
所有 /ws/* 請求委派給 CXF 處理。
<bean id="userWSService" class="cn.edu.hdu.wsdemo.wsservice.UserWSService" />
<bean id="jsonProvider" class="org.codehaus.jackson.jaxrs.JacksonJsonProvider" />
<jaxrs:server id="users" address="/apis">
<jaxrs:serviceBeans>
<ref bean="userWSService" />
</jaxrs:serviceBeans>
<jaxrs:providers>
<ref bean="jsonProvider" />
</jaxrs:providers>
</jaxrs:server>
address="/apis":相對於 /ws,完整路徑 /ws/apis。jsonProvider:註冊 Jackson 序列化提供者,自動處理 JSON 轉換。
@Path("/userwsservice/")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public class UserWSService {
@Autowired
private IUserService userService;
@GET
@Path("/users/{id}/")
public User getUser(@PathParam("id") String id) {
Map param = new HashMap<>();
param.put("id", id);
List list = userService.query(param);
return list.isEmpty() ? null : list.get(0);
}
@POST
@Path("/users/getall")
public List getAllUsers() {
return userService.query(new HashMap<>());
}
}
mvn clean tomcat:run
https://localhost:8080/wsdemo/ws → 顯示已發布端點。https://localhost:8080/wsdemo/ws/apis?_wadl → 機器可讀服務描述。https://localhost:8080/wsdemo/ws/apis/userwsservice/users/4 → 返回 JSON 用戶對象。


https://github.com/peterchenhdu/demos/tree/master/wsdemo
jaxrs:server 需引入 xmlns:jaxrs="https://cxf.apache.org/jaxrs"。@PathParam、@QueryParam、@FormParam、@HeaderParam、@Context (注入 HttpServletRequest 等)。ExceptionMapper<E> 並註冊為 Provider,統一錯誤響應格式。JavaCodeGeeks - Creating JAX-RS Web Service Using Apache CXF