版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014248473/article/details/87914625
CXF+Spring发布一个Restful WebService
一、写在前面
>>> 1.简单介绍一下环境
IDE:IDEA14
JDK:1.7
CXF:2.6.2
Spring:3.0.7
>>> 2.核心话题
(-) 通过在xml中配置 jaxrs:server 发布服务
(-) 如何处理Get请求返回xml或者json
二、走入正题
1.项目所需 jar 包
asm-3.3.1.jar
commons-logging-1.1.1.jar
cxf-2.6.2.jar
geronimo-servlet_2.5_spec-1.1.2.jar
jaxb-impl-2.2.5.jar
jettison-1.3.2.jar
jsr311-api-1.1.1.jar
neethi-3.0.2.jar
spring-aop-3.0.7.RELEASE.jar
spring-asm-3.0.7.RELEASE.jar
spring-beans-3.0.7.RELEASE.jar
spring-context-3.0.7.RELEASE.jar
spring-core-3.0.7.RELEASE.jar
spring-expression-3.0.7.RELEASE.jar
spring-tx-3.0.7.RELEASE.jar
spring-web-3.0.7.RELEASE.jar
wsdl4j-1.6.2.jar
xmlschema-core-2.0.3.jar
2.准备一个实体类
Student.java
需配置@XmlRootElement,在处理Get请求时返回xml时用到。
package com.yale.entity;
import javax.xml.bind.annotation.XmlRootElement;
import java.util.Date;
@XmlRootElement
public class Student {
private Long id;
private String name;
private Date birth;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getBirth() {
return birth;
}
public void setBirth(Date birth) {
this.birth = birth;
}
}
3.准备一个接口以及实现类
StudentService.java
package com.yale.service;
import com.yale.entity.Student;
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;
@Path("/student")
public interface StudentService {
@GET
@Path("/query/{id}")
@Produces(MediaType.APPLICATION_XML)
Student queryStudent(@PathParam("id") Long id);
@GET
@Path("/query_json/{id}")
@Produces(MediaType.APPLICATION_JSON)
Student queryStudentJson(@PathParam("id") Long id);
@GET
@Path("/query_xml_json/{id}")
@Produces({MediaType.APPLICATION_XML,MediaType.APPLICATION_JSON})
Student queryStudentXmlOrJson(@PathParam("id") Long id);
}
StudentServiceImpl.java
package com.yale.service.impl;
import com.yale.entity.Student;
import com.yale.service.StudentService;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
public class StudentServiceImpl implements StudentService {
private Map<Long,Student> studentMap = new HashMap<>();
public StudentServiceImpl() {
init();
}
@Override
public Student queryStudent(Long id) {
System.out.println("queryStudent id is " + id);
return studentMap.get(id);
}
@Override
public Student queryStudentJson(Long id) {
System.out.println("queryStudentJson id is " + id);
return studentMap.get(id);
}
@Override
public Student queryStudentXmlOrJson(Long id) {
System.out.println("queryStudentXmlOrJson id is " + id);
return studentMap.get(id);
}
private void init(){
Student student = new Student();
student.setId(1L);
student.setName("何炅");
student.setBirth(new Date());
studentMap.put(1L,student);
}
}
4.配置文件
applicationContext.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:jaxrs="http://cxf.apache.org/jaxrs"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd">
<bean id="studentService" class="com.yale.service.impl.StudentServiceImpl"/>
<bean id="jsonProvider" class="org.apache.cxf.jaxrs.provider.json.JSONProvider">
<property name="dropRootElement" value="true"/>
<property name="dropCollectionWrapperElement" value="true"/>
<property name="serializeAsArray" value="true"/>
</bean>
<jaxrs:server address="/rest">
<jaxrs:serviceBeans>
<ref bean="studentService"/>
</jaxrs:serviceBeans>
<jaxrs:providers>
<ref bean="jsonProvider"/>
</jaxrs:providers>
</jaxrs:server>
</beans>
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<!-- 设置spring的环境 -->
<context-param>
<!--contextConfigLocation是不能修改的 -->
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 配置CXF的Servlet -->
<servlet>
<servlet-name>CXF</servlet-name>
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CXF</servlet-name>
<url-pattern>/ws/*</url-pattern>
</servlet-mapping>
</web-app>
5.测试
启动tomcat,打开浏览器
访问:http://localhost:8080/ws/rest/student/query/1
返回:
<student>
<birth>2019-02-25T10:55:46.550+08:00</birth>
<id>1</id>
<name>何炅</name>
</student>
访问:http://localhost:8080/ws/rest/student/query_json/1
返回:
{"birth":"2019-02-25T11:10:19.159+08:00","id":1,"name":"何炅"}
访问:http://localhost:8080/ws/rest/student/query_xml_json/1
返回:
<student>
<birth>2019-02-25T10:55:46.550+08:00</birth>
<id>1</id>
<name>何炅</name>
</student>
访问:http://localhost:8080/ws/rest/student/query_xml_json/1?_type=json
返回:
{"birth":"2019-02-25T11:10:19.159+08:00","id":1,"name":"何炅"}