CXF+Spring发布一个Restful WebService

版权声明:本文为博主原创文章,未经博主允许不得转载。 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":"何炅"}

猜你喜欢

转载自blog.csdn.net/u014248473/article/details/87914625