• Spring REST


    示例实现

    1. 请求REST接口返回类转换的JSON或XML数据

    2. POST JSON数据到REST接口自动转为类数据

    服务端

    Bean

    package com.qunar.bean;
    
    import javax.xml.bind.annotation.XmlAccessType;
    import javax.xml.bind.annotation.XmlAccessorType;
    import javax.xml.bind.annotation.XmlRootElement;
    
    /**
     * Created with IntelliJ IDEA.
     * User: zhenwei.liu
     * Date: 13-7-26
     * Time: 下午6:53
     * To change this template use File | Settings | File Templates.
     */
    @XmlRootElement // 标注类名为XML根节点
    @XmlAccessorType(XmlAccessType.FIELD)   // 表示将所有域作为XML节点
    public class User {
        private long id;
        private String username;
        private String password;
    
        public long getId() {
            return id;
        }
    
        public void setId(long id) {
            this.id = id;
        }
    
        public String getUsername() {
            return username;
        }
    
        public void setUsername(String username) {
            this.username = username;
        }
    
        public String getPassword() {
            return password;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
    }

    Controller

    package com.qunar.controller;
    
    import com.qunar.bean.User;
    import org.springframework.http.HttpStatus;
    import org.springframework.stereotype.Controller;
    import org.springframework.stereotype.Repository;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.*;
    
    /**
     * Created with IntelliJ IDEA.
     * User: zhenwei.liu
     * Date: 13-7-26
     * Time: 下午6:54
     * To change this template use File | Settings | File Templates.
     */
    @Controller
    @RequestMapping("/users")
    public class UserController {
        // headers属性标明该方法只接受该Accept头的请求
        @RequestMapping(value = "/{id}",
                method = RequestMethod.GET)
    //            headers = {"Accept=text/xml, application/json, application/xml"})
        // @ResponseBody 表示返回的对象将转换为客户端Accept头要求的表达形式
        // 假如客户端请求头没包含任何形式,则假设客户端可接受任何形式的返回
        // 返回的类型匹配方法默认值是先查看URL扩展名,没有扩展名则匹配Accept头,否则匹配defaultContentType
        // @PathVariable 表示参数值来自URL,如果参数名与URL括号内形参相同
        // 可以省略PathVariable内的参数名
        public
        @ResponseBody
        User getUser(@PathVariable("id") long id) {
            User user = new User();
            user.setUsername("root");
            user.setPassword("root123");
            user.setId(id);
            return user;
        }
    
        // 设置RequestMapping的headers参数标明请求体的内容是json数据
        @RequestMapping(value = "/add", method = RequestMethod.POST,
                headers = "Content-Type=application/json")
        // @ResponseStatus表示响应状态 NO_CONTENT表示无响应内容
        @ResponseStatus(HttpStatus.NO_CONTENT)
        // 没有配置ViewResolver的情况下@ResponseBody不能省略,否则404
        // @RequestBody表示将请求体的数据转为user类
        public @ResponseBody void addUser(@RequestBody User user) {
            System.out.println(user.getId() + "|" + user.getUsername());
        }
    }

    dispatcher-servlet.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:context="http://www.springframework.org/schema/context"
           xmlns:mvc="http://www.springframework.org/schema/mvc"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">
    
        <!-- 自动注册bean -->
        <context:component-scan base-package="com.qunar">
            <context:include-filter type="regex" expression=".controller.*"/>
        </context:component-scan>
        <!-- 依赖注入注释功能 -->
        <context:annotation-config/>
        <!-- 开启MVC注释功能 -->
        <mvc:annotation-driven/>
    
        <!-- 转换器配置:只有配置好了转换器才能进行类与JSON和XML的转换 -->
        <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
            <property name="messageConverters">
                <list>
                    <!-- String 转换器 -->
                    <ref bean="stringHttpMessageConverter"/>
                    <!-- JSON 转换器 -->
                    <ref bean="jsonHttpMessageConverter"/>
                    <!-- XML 转换器 -->
                    <ref bean="marshallingHttpMessageConverter"/>
                </list>
            </property>
        </bean>
    
    
        <bean id="stringHttpMessageConverter" class="org.springframework.http.converter.StringHttpMessageConverter"/>
    
        <bean id="jsonHttpMessageConverter"
              class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"/>
    
        <bean id="marshallingHttpMessageConverter"
              class="org.springframework.http.converter.xml.MarshallingHttpMessageConverter">
            <constructor-arg ref="jaxbMarshaller"/>
            <property name="supportedMediaTypes" value="application/xml" />
        </bean>
    
    
        <bean id="jaxbMarshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
            <!-- XML转换器需要绑定需要转换的类 -->
            <property name="classesToBeBound">
                <list>
                    <value>com.qunar.bean.User</value>
                </list>
            </property>
        </bean>
    
    
    </beans>

    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: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://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
    
        <context:component-scan base-package="com.qunar">
            <context:include-filter type="regex" expression=".bean.*"/>
        </context:component-scan>
    
    
    </beans>

    web.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://java.sun.com/xml/ns/javaee"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
              http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
               version="2.5">
    
        <!-- 定义根目录 -->
        <context-param>
            <param-name>webAppRootKey</param-name>
            <param-value>restServer.root</param-value>
        </context-param>
        <listener>
            <listener-class>
                org.springframework.web.util.WebAppRootListener
            </listener-class>
        </listener>
    
        <!-- 定义配置文件路径 -->
        <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>
                classpath*:spring/context/applicationContext.xml
            </param-value>
        </context-param>
    
        <listener>
            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
        </listener>
        <!-- 清理残留在ServletContext的弃用参数的Listener -->
        <listener>
            <listener-class>org.springframework.web.context.ContextCleanupListener</listener-class>
        </listener>
    
        <servlet>
            <servlet-name>dispatcher</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <init-param>
                <param-name>contextConfigLocation</param-name>
                <param-value>classpath*:spring/context/dispatcher-servlet.xml</param-value>
            </init-param>
            <load-on-startup>1</load-on-startup>
        </servlet>
        <servlet-mapping>
            <servlet-name>dispatcher</servlet-name>
            <url-pattern>/</url-pattern>
        </servlet-mapping>
    
    </web-app>

    另外很重要的是把依赖包配好,否则各种ClassNotDefined

            <!-- JSON 转换器 -->
            <dependency>
                <groupId>org.codehaus.jackson</groupId>
                <artifactId>jackson-mapper-asl</artifactId>
                <version>1.9.12</version>
            </dependency>
    
            <!-- XML 转换器 -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-oxm</artifactId>
                <version>3.1.4.RELEASE</version>
            </dependency>

    客户端

    import org.springframework.http.HttpEntity;
    import org.springframework.http.HttpHeaders;
    import org.springframework.http.HttpMethod;
    import org.springframework.http.MediaType;
    import org.springframework.util.LinkedMultiValueMap;
    import org.springframework.util.MultiValueMap;
    import org.springframework.web.client.RestTemplate;
    
    /**
     * Created with IntelliJ IDEA.
     * User: zhenwei.liu
     * Date: 13-7-26
     * Time: 下午10:41
     * To change this template use File | Settings | File Templates.
     */
    public class Test {
        public static String urlGet = "http://localhost:8080/users/{id}";
        public static String urlPost = "http://localhost:8080/users/add";
        public static RestTemplate rt = new RestTemplate();
    
        // 从Rest接口获取数据
        public static void getUser(long userId) {
            HttpHeaders headers = new HttpHeaders();
            // 设置Accept表示浏览器支持的MIME类型,此处意思是要返回的类型
            headers.setAccept(MediaType.parseMediaTypes(MediaType.APPLICATION_XML_VALUE));
            HttpEntity<Object> requestEntity = new HttpEntity<Object>(headers);
    
            System.out.println(
                    rt.exchange(
                            urlGet,
                            HttpMethod.GET,
                            requestEntity,
                            String.class,
                            userId
                    )
            );
            System.out.println(
                    rt.getForObject(urlGet, String.class, userId)
            );
        }
    
        // 传JSON数据到REST接口,自动将JSON数据转化成类
        public static void addUserByJson(String userJson) {
            HttpHeaders headers = new HttpHeaders();
            // 设置ContentType标明数据是JSON数据,否则报415(Unsupported Media Type)
            // 此处必须和REST接口的RequestMapping的ContentType对应
            headers.setContentType(MediaType.APPLICATION_JSON);
            HttpEntity<Object> requestEntity = new HttpEntity<Object>(userJson, headers);
    //        System.out.println(requestEntity.getBody().toString());
            rt.exchange(urlPost, HttpMethod.POST, requestEntity, null);
        }
    
        public static void main(String[] args) {
            getUser(1);
            addUserByJson("{"id":1,"username":"root","password":"root123"}");
        }
    }

    输出数据

    <200 OK,<?xml version="1.0" encoding="UTF-8" standalone="yes"?><user><id>1</id><username>root</username><password>root123</password></user>,{Server=[Apache-Coyote/1.1], Content-Type=[application/xml], Transfer-Encoding=[chunked], Date=[Sat, 27 Jul 2013 16:02:04 GMT]}>


    {"id":1,"username":"root","password":"root123"}

  • 相关阅读:
    递归实现随机数不重复问题
    今天写的一个工厂工具类
    Win7 x64 IIS运行ASP+Access故障完美解决方法(转)
    li中,标题和日期一排,且日期靠右
    [学习笔记] extends implements 的区别与联系 [转载]
    [学习笔记] vim使用大全 [转]
    MidPoint Displacement for Terrain Rendering
    CryEngine3 打造另一个真实世界
    Hello C++ AMP!
    DetailMap For Terrain Rendering
  • 原文地址:https://www.cnblogs.com/zemliu/p/3220517.html
Copyright © 2020-2023  润新知