Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring@RestController不返回纯文本响应_Spring_Rest_Spring Mvc_Spring 4 - Fatal编程技术网

Spring@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

我正在试用新的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/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请求头和
在注释上生成
属性来帮助您进行内容协商

就你而言:

  • 您会得到心跳动作的
    application/json
    响应,因为您的HTTP客户端可能会请求该内容类型,而Spring进行了内容协商
  • 您的hearbeat2操作将获得HTTP 406,因为内容协商失败。您将
    text/plain
    指定为控制器上的生成内容类型,而HTTP客户端可能只在其
    Accept
    请求头中列出
    application/json
更新:我使用了完全相同的curl请求,但没有得到相同的结果。可能是筛选器或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!%

做同样的事情并得到很好的结果。

我发现我的网络配置的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
    }