Spring @RestController不返回纯文本响应

我正在试验新的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!"

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

当我访问/心跳/测试,然后我得到一个空回应,但我期待我活着! 文本。

UPDATE

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

HTTP / 1.1 200 OK Content-Type:application / json; charset = UTF-8服务器:Development / 1.0日期:2013年12月17日星期二18:59:08 GMT Cache-Control:no-cache过期时间:1990年1月1日星期五00:00:00 GMT内容长度:12

“我还活着!”

curl -i -H“Accept:application / json”http://myserver.com/rest/heartbeat HTTP / 1.1 200 OK Content-Type:application / json; charset = UTF-8 Server:Development / 1.0 Date:Tue, 17 Dec 2013 19:01:12 GMT Cache-Control:no-cache过期时间:星期五,01 Jan 1990 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 Cache-Control:no-cache过期时间:星期五,01 Jan 1990 00:00:00 GMT内容长度:0

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

HTTP / 1.1 406不可接受服务器:开发/ 1.0日期:2013年12月17日星期二19:02:06 Cache-Control:no-cache过期时间:星期五,01 Jan 1990 00:00:00 GMT内容长度:0


我发现我在我的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
}

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

但这意味着您的响应类型默认为JSON,因此需要用引号将其正确形成。


@RestController文档中所述, @Controller @ResponseBody在Controller类上结合了@Controller@ResponseBody

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

在你的情况下:

  • 你的心跳动作会得到一个application/json响应,因为你的HTTP客户端可能会要求这个Content-Type,并且Spring会进行内容协商。
  • 由于内容协商失败,您将为您的hearbeat2操作获取HTTP 406。 您在Controller上将text/plain指定为产生Content-Type,而您的HTTP客户端可能仅在其Accept请求标头中列出application/json
  • 更新 :我使用了完全相同的卷曲要求,但没有得到相同的结果。 也许过滤器或HTTP代理缓存正在修改HTTP头?

    默认格式是文本/纯文本:

    ➜ 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!%
    

    此示例应用程序执行相同的操作并获得良好结果。

    链接地址: http://www.djcxy.com/p/48179.html

    上一篇: Spring @RestController not returning plain text response

    下一篇: HTML 5 versus XHTML 1.0 Transitional?