Spring @RestController不返回纯文本响应

时间:2013-12-13 20:24:52

标签: spring rest spring-mvc spring-4

我正在尝试使用新的Spring 4.0 @RestController来从控制器返回一个简单的文本响应:

@RestController
@RequestMapping(value = "/heartbeat")
public class HeartbeatController {

    private static final Logger logger = LoggerFactory.getLogger(HeartbeatController.class);

    @RequestMapping
    public String heartbeat() {
        logger.info("Received heartbeat!");
        return "I'm Alive!";
    }

    @RequestMapping(value = "/test", produces = MediaType.TEXT_PLAIN_VALUE)
    public String heartbeat2() {
        logger.info("Received heartbeat!");
        return "I'm Alive!";
    }
}

当我访问/心跳时,我回来了:

"I'm Alive!"

结果包括双引号,我没想到的。

当我访问/ heartbeat / test然后我得到一个空响应,但我希望我活着!文本。

更新

curl -i http://myserver.com/rest/heartbeat

HTTP / 1.1 200好的 Content-Type:application / json; charset = UTF-8 服务器:开发/ 1.0 日期:2013年12月17日星期二18:59:08 GMT 缓存控制:无缓存 到期日:1990年1月1日星期五00:00:00 GMT 内容长度:12

“我活着!”

curl -i -H“接受:application / json”http://myserver.com/rest/heartbeat HTTP / 1.1 200好的 Content-Type:application / json; charset = UTF-8 服务器:开发/ 1.0 日期:2013年12月17日星期二19:01:12 GMT 缓存控制:无缓存 到期日:1990年1月1日星期五00:00:00 GMT 内容长度:12

“我活着!”

curl -i http://myserver.com/rest/heartbeat/test

HTTP / 1.1 406不可接受 服务器:开发/ 1.0 日期:2013年12月17日星期二19:00:13 GMT 缓存控制:无缓存 到期日:1990年1月1日星期五00:00:00 GMT 内容长度:0

curl -i -H“接受:text / plain”http://myserver.com/rest/heartbeat/test

HTTP / 1.1 406不可接受 服务器:开发/ 1.0 日期:2013年12月17日星期二19:02:06 GMT 缓存控制:无缓存 到期日:1990年1月1日星期五00:00:00 GMT 内容长度:0

5 个答案:

答案 0 :(得分:17)

我发现我在WebConfig的configureMessageConverters中缺少StringHttpMessageConverter。 我正在配置消息转换器来控制Jackson ObjectMapper。

@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
    MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
    mappingJackson2HttpMessageConverter.setPrettyPrint(SystemProperty.environment.value() == Development);
    mappingJackson2HttpMessageConverter.setObjectMapper(objectMapper());
    converters.add(mappingJackson2HttpMessageConverter);
    converters.add(new StringHttpMessageConverter()); // THIS WAS MISSING
}

答案 1 :(得分:4)

@RestController是一个便利注释,意味着您不再需要在方法上指定@ResponseBody注释。

但这意味着您的响应类型默认为JSON,因此包含在引号中以便正确形成。

答案 2 :(得分:2)

@RestController@Controller@ResponseBody结合在您的Controller类上,为stated in the documentation

当您使用@ResponseBody注释方法/控制器时,Spring会使用Accept HTTP请求标头和注释上的produces属性来协助您进行内容协商。

在你的情况下:

  • 您的心跳操作会得到application/json响应,因为您的HTTP客户端可能会要求Content-Type和Spring进行内容协商。
  • 您的listenbeat2操作会获得HTTP 406,因为内容协商失败。您在控制器上将text/plain指定为生成内容类型,而您的HTTP客户端可能仅在其application/json请求标头中列出Accept

更新:我使用了完全相同的curl请求,但没有得到相同的结果。也许Filter或HTTP代理缓存正在修改HTTP头?

默认格式为text / plain:

➜ curl -v http://localhost:8080/heartbeat
> GET /heartbeat HTTP/1.1
> User-Agent: curl/7.30.0
> Host: localhost:8080
> Accept: */*
>
< HTTP/1.1 200 OK
< Server: Apache-Coyote/1.1
< Content-Type: text/plain;charset=ISO-8859-1
< Content-Length: 13
< Date: Wed, 18 Dec 2013 13:34:12 GMT
<
Hello, World!%

并使用produces text/plain属性:

➜ curl -H "Accept: text/plain" -v http://localhost:8080/heartbeat/test
> GET /heartbeat/test HTTP/1.1
> User-Agent: curl/7.30.0
> Host: localhost:8080
> Accept: text/plain
>
< HTTP/1.1 200 OK
< Server: Apache-Coyote/1.1
< Content-Type: text/plain
< Content-Length: 13
< Date: Wed, 18 Dec 2013 13:39:07 GMT
<
Hello, World!%

This sample application做同样的事情并取得好成绩。

答案 3 :(得分:1)

这个解决方案对我有用。请检查以下内容。

  1. 确保您的DTO可序列化并具有可序列化的字段,getter和setter
  2. 检查杰克逊的依赖关系。你应该有
    • com.fasterxml.jackson.core:杰克逊 - 芯:2.4.1
    • com.fasterxml.jackson.core:杰克逊 - 数据绑定:2.4.1
    • com.fasterxml.jackson.core:杰克逊 - 注解:2.4.1
    • com.fasterxml.jackson.datatype:杰克逊 - 数据类型 - 约达:2.4.1
    • com.fasterxml.jackson.datatype:杰克逊 - 数据类型-jsr310:2.4.1
  3. 修复RequesMapping注释:

    @RequestMapping(value = "/test", consumes = "*/*")

  4. 检查您是否有<mvc:annotation-driven />指令

答案 4 :(得分:0)

这对我有用:

  1. 在maven中添加

        com.fasterxml.jackson.core     杰克逊 - 数据绑定     2.4.4

  2. 确保在{春天

  3. 中配置<mvc:annotation-driven />