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