Spring提供的java正确JSON REST控制器
我是新写spring rest控制器的。我想创建一个简单的JSON格式的发送,但我不能处理它,我的代码是正确的吗
在我的代码中,有一个RestTemplate,它向REST url发送一个简单的POJO,REST控制器发回另一个POJO
我发现了很多以JSON形式发送和接收对象的例子,但其中一些已经有几年的历史了。我发现的最多的是,他们通过为配置bean添加MappingJackson2HttpMessageConverter
来配置dispatcher bean XML,以便将JSON转换为POJO,反之亦然:
...
<beans:bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<beans:property name="messageConverters">
<beans:list>
<beans:ref bean="jsonMessageConverter"/>
</beans:list>
</beans:property>
</beans:bean>
<beans:bean id="jsonMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
</beans:bean>
...
他们还将其设置为RestTemplate java代码:
List<HttpMessageConverter<?>> messageConverters = new ArrayList<HttpMessageConverter<?>>();
messageConverters.add(new MappingJackson2HttpMessageConverter());
messageConverters.add(new StringHttpMessageConverter());
restTemplate.setMessageConverters(messageConverters);
有时他们也会设置标题:
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.add("Accept", "application/json");
HttpEntity<MyObject> entity = new HttpEntity<MyObject>(inputRequest, headers);
有时,他们会将对象转换为JSON格式,并将其作为文本而不是实例发送
我还可以找到两种发送帖子的方式:
ResponseEntity<MyObject> responseEntity = restTemplate.exchange(url, HttpMethod.POST, entity, MyObject.class);
或者
MyObject response = restTemplate.postForObject(url, inputRequest, MyObject.class);
这是REST控制器:
@RequestMapping(value = "/send", method = RequestMethod.POST, consumes=MediaType.APPLICATION_JSON_VALUE, produces=MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public MyObject send(@RequestBody MyObject requestModel) {
return //whatever;
}
但是:如果我没有在XML中设置任何内容,也没有向RestTemplate添加任何消息转换器和头,那么它看起来工作得很好。我用PostMan测试它,如果我在MyClass示例中添加JSON格式,我就会收到JSON
所以我的问题是:对于JSON发送,我的代码真的这样正确吗
mvc调度程序。xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
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">
<!-- Enables the Spring MVC @Controller programming model -->
<annotation-driven />
<!-- to reach resources like css and images -->
<default-servlet-handler/>
<!-- the REST controllers are here -->
<context:component-scan base-package="hu.viktor" />
</beans:beans>
RestTemplate java:
@Controller
public class RequestSender {
public MyObject send(MyObject inputRequest) {
RestTemplate restTemplate = new RestTemplate();
String url = "http://localhost:8080/rest/send";
MyObject response = restTemplate.postForObject(url, inputRequest, MyObject.class);
return response;
}
}
和REST控制器:
@Controller
@RequestMapping("/rest")
public class CalculatorRestController {
@RequestMapping(value = "/send", method = RequestMethod.POST, consumes=MediaType.APPLICATION_JSON_VALUE, produces=MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public MyObject send(@RequestBody MyObject requestModel) {
return //whatever;
}
}
# 1 楼答案
根据documentation
RequestMappingHandlerMapping
和RequestMappingHandlerAdapter
,如果您在xml配置中指定了<mvc:annotation-driven/>
(在您的例子中,只需<annotation-driven>
)。同一文档包含HttpMessageConverters
列表,该列表将由<mvc:annotation-driven>'
设置。以及:这意味着,您不需要手动添加json消息转换器,只需在配置文件中指定
<mvc:annotation-driven>
,并在pom中声明依赖项即可。xml(如果您使用的是Maven):