0

我继承了一个基本上有几个控制器的 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>

先感谢您。

4

1 回答 1

1

spring 提供的 resttemplate ,用于在网络上的服务调用期间将您的 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(见上面的配置)

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

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

<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 配置在一个内衬中完成。

于 2013-11-14T09:14:00.493 回答