我正在尝试使用新的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
答案 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进行内容协商。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)
这个解决方案对我有用。请检查以下内容。
修复RequesMapping注释:
@RequestMapping(value = "/test", consumes = "*/*")
检查您是否有<mvc:annotation-driven />
指令
答案 4 :(得分:0)
这对我有用:
在maven中添加
com.fasterxml.jackson.core 杰克逊 - 数据绑定 2.4.4
确保在{春天
<mvc:annotation-driven />
醇>