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会进行内容协商。 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