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