Spring@RestController不返回纯文本响应
我正在试用新的Spring 4.0@RestController,以从控制器返回一个简单的文本响应:Spring@RestController不返回纯文本响应,spring,rest,spring-mvc,spring-4,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); @RequestMap
@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/1.1200ok
内容类型:application/json;字符集=UTF-8
服务器:开发/1.0
日期:2013年12月17日星期二18:59:08 GMT
缓存控制:没有缓存
过期时间:1990年1月1日星期五00:00:00 GMT
内容长度:12
“我还活着!”
curl-i-H“接受:应用程序/json”
HTTP/1.1200ok
内容类型:application/json;字符集=UTF-8
服务器:开发/1.0
日期:2013年12月17日星期二19:01:12 GMT
缓存控制:没有缓存
过期时间:1990年1月1日星期五00:00:00 GMT
内容长度:12
“我还活着!”
curl-i
HTTP/1.1406不可接受
服务器:开发/1.0
日期:2013年12月17日星期二19:00:13 GMT
缓存控制:没有缓存
过期时间:1990年1月1日星期五00:00:00 GMT
内容长度:0
curl-i-H“接受:文本/普通”
HTTP/1.1406不可接受
服务器:开发/1.0
日期:2013年12月17日星期二19:02:06 GMT
缓存控制:没有缓存
过期时间:1990年1月1日星期五00:00:00 GMT
内容长度:0@RestController是一种方便的注释,这意味着您不再需要在方法上指定@ResponseBody注释
但这将意味着您的响应类型被默认为JSON,因此将被正确地用引号括起来。
@RestController
在您的控制器类上结合了@Controller
和@ResponseBody
,如下所示
当您使用@ResponseBody
注释方法/a控制器时,Spring会使用Accept
HTTP请求头和在注释上生成
属性来帮助您进行内容协商
就你而言:
- 您会得到心跳动作的
响应,因为您的HTTP客户端可能会请求该内容类型,而Spring进行了内容协商application/json
- 您的hearbeat2操作将获得HTTP 406,因为内容协商失败。您将
指定为控制器上的生成内容类型,而HTTP客户端可能只在其text/plain
请求头中列出Accept
application/json
➜ 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!%
做同样的事情并得到很好的结果。我发现我的网络配置的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
}
@覆盖
public void configureMessageConverters(列表此解决方案对我有效。请检查以下内容
确保DTO是可序列化的,并且具有可序列化的字段、getter和setter
检查jackson的依赖项。你应该
- com.fasterxml.jackson.core:jackson-core:2.4.1
- 核心:jackson数据绑定:2.4.1
- core:jackson注释:2.4.1
- 数据类型:jackson数据类型joda:2.4.1
- datatype:jackson-datatype-jsr310:2.4.1
修复RequesMapping注释:
@RequestMapping(value=“/test”,consumes=“*/*”)
检查您是否有
指令
这对我很有用:
将此添加到maven中
com.fasterxml.jackson.core
杰克逊数据绑定
2.4.4
确保在spring中配置了
您是在浏览器中还是从其他HTTP客户端执行此操作?我不熟悉Spring 4,但您不再需要@ResponseBody
了吗?我只是好奇。使用chrome调试器或firebug发布完整的HTTP响应,这样我们就可以看到返回代码等@reagten,如果您在类上添加RestController而不是Controller,那么从Spring 4.0开始,您不需要添加ResponseBy您的意思是@RestController只支持JSON响应吗?当我添加products=MediaType.TEXT_PLAIN_值时,我得到了406。您的curl响应很奇怪,我无法在这里复制这些响应。heartBeat2()只有在请求头与生产者冲突时才给出406。对于引号,您可以在类路径中注册jackson和/或注册JSON消息转换器吗?嗨,Brian,谢谢您的回答。请参阅我的示例请求和响应。我想第一个/heartbeat示例添加引号以将其转换为JSON…我不明白为什么h会这样eartbeat/test我得到406…用新的curl测试更新了我的答案。在方法上删除@RestController
和添加@ResponseBody
时,你有类似的结果吗?感谢你的广泛回答,非常感谢。发现我缺少StringHttpMessageConverter。这个问题可能会让你感兴趣,然后感谢你添加这正是我需要的。
@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
}