通过 Spring 更正 JSON REST 控制器

Correct JSON REST Controller by Spring

我是新来写spring休息控制器的。我想创建一个 JSON 格式的简单发送,但我无法处理它,我的代码是否正确?

在我的代码中,有一个 RestTemplate,它将一个简单的 POJO 发送到 REST url,REST Controller 发送回另一个 POJO。

我发现了很多发送和接收 object 的示例,如 JSON,但其中一些已经有几年的历史了。我发现最多的是他们通过为 添加 MappingJackson2HttpMessageConverter 配置调度程序 bean XML 配置 bean 以将 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);

有时他们也会设置 header:

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.add("Accept", "application/json");
HttpEntity<MyObject> entity = new HttpEntity<MyObject>(inputRequest, headers);

有时他们会将 object 格式转换为 JSON 格式,并将其作为文本而不是实例发送。

而且我还找到了两种发送 POST 消息的方法:

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 添加任何消息转换器和 header,它看起来工作正常。我通过 PostMan 对其进行测试,如果我添加 MyClass 示例的 JSON 格式,我会收到 JSON.

所以我的问题是:对于 JSON 发送,我的代码是否正确?:

mvc-dispatcher.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;
    }   
}

根据 documentation RequestMappingHandlerMappingRequestMappingHandlerAdapter 将自动添加,如果您在 xml 配置中指定 <mvc:annotation-driven/> (在您的情况下只是 <annotation-driven>).同一文档包含 HttpMessageConverters 的列表,将由 <mvc:annotation-driven>' 设置。并且:

MappingJackson2HttpMessageConverter converts to/from JSON — added if Jackson 2 is present on the classpath.

这意味着,您不需要手动添加 json 消息转换器,只需在配置文件中指定 <mvc:annotation-driven> 并在 pom.xml 中声明依赖项(如果您使用 Maven):

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.4.6</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.4.6.1</version>
</dependency>