【问题标题】:New to Spring and Jackson 2. What does this bean declaration allow for in a Spring MVC application?Spring 和 Jackson 的新手 2. 这个 bean 声明在 Spring MVC 应用程序中允许什么?
【发布时间】:2013-11-13 19:56:22
【问题描述】:

我继承了一个基本上有几个控制器的 spring MVC 项目。我在一个 xml 文件中遇到了一个声明。显然,这个声明允许编写基于 rest 的服务和客户端。有人可以举例说明这些声明所带来的明显魔力吗?

<bean id="restClient" class="org.springframework.web.client.RestTemplate">
    <property name="messageConverters">
        <util:list>
            <bean id="jsonMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
            <bean id="formMessageConverter" class="org.springframework.http.converter.FormHttpMessageConverter"/>
        </util:list>
    </property>
</bean>

提前谢谢你。

【问题讨论】:

标签: java spring spring-mvc resttemplate


【解决方案1】:

resttemplate 由 spring 提供,用于在网络上的服务调用期间将您的 java 对象转换为所需的输出(html 字符串、xml、json 等),然后从服务接收到的响应将被解组回 java 对象或所需的数据类型。

<property name="messageConverters">
    <util:list>
        <bean id="jsonMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
        <bean id="formMessageConverter" class="org.springframework.http.converter.FormHttpMessageConverter"/>
        <bean id="messageConverter"
                    class="org.springframework.http.converter.StringHttpMessageConverter" />

    </util:list>

  //marhsaller and unmarshaller

    <bean class="org.springframework.http.converter.xml.MarshallingHttpMessageConverter">
    <property name="marshaller" ref="jaxbMarshaller"></property>
    <property name="unmarshaller" ref="jaxbMarshaller"></property>
    <property name="supportedMediaTypes">
    <list>
       <value>application/xml</value>
       <value>text/xml</value>
       <value>json</value>
     </list>
</property>

通过以上配置,resttemplate 将使用那些合适的转换器来处理不同的数据类型,正如我所说的,它可能是 html、json 或 application xml

我们所做的只是,在不编写 java 代码的情况下,我们正在配置 resttemplate 并将在 spring 上下文中,此配置适用于您使用过 resttemplate 的任何地方。

我这里有例子

假设我们调用一个服务来检查用户是否是有效用户

class User{
   string userId;

   string password;

}

并且某些代码为 1 的服务响应是有效的,而 0 是无效的

class ValidUser{
   int validCode;
}

首先你需要编入任何可接受的数据类型,让我们有 application/xml

我在这里所做的只是通过配置文件

在上面的配置中,我添加了 jaxb marshaller 和 unmarshaller(见上面的配置)

我已经配置了 marshaller 和 unmarshaller,并且我告诉了在编组和解组时都应该使用的可接受的数据类型

最后,下面的配置告诉 java 对象在编组(request.User 将转换为 xml)和解组(xml 转换回 response.validUser)期间是可接受的

<bean id="jaxbMarshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
    <property name="classesToBeBound">
        <list>
            <value>com.request.user</value>
            <value>com.response.validUser</value>

        </list>
    </property>

</bean>

java代码来了

在这里你直接传递你的 java 对象,你的 resttemplate 会毫不费力地编组它!!!

        User user = new User();
        user.setName('test');
        user.setPassword('password');
        // setting media type as xml, and telling convert my user java obj to xml
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_XML);
        HttpEntity<User> entity = new   HttpEntity<User>   (user , headers);

        ResponseEntity<validUser> responseEntity = rest.exchange(URL, HttpMethod.POST, entity, validUser.class);
    // let us assume that service response for valid user <validCode>1<validCode>
    //then validuserreponse obj will have code as 1, let us say valid user.
    ValidUser validUserResponse = responseEntity.getBody();

同样你也可以处理纯 html 文本

headers.setContentType(MediaType.TEXT_HTML);

    HttpEntity<String> entity = new HttpEntity<String>(htmlString, headers);
    ResponseEntity<String> htmlStringresponse = rest.postForEntity(URL, entity, String.class);

如果您看到,上面的 java 代码,没有任何消息转换器代码、编组器和解组器逻辑,所有这些都使用 spring 配置在一个衬垫中完成。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-02
    • 2012-08-22
    • 1970-01-01
    • 2015-11-16
    • 1970-01-01
    相关资源
    最近更新 更多