12

我正在尝试使用新的 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!";
    }
}

当我访问 /heartbeat 然后我回来:

"I'm Alive!"

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

当我访问 /heartbeat/test 时,我得到一个空响应,但我希望我活着!文本。

更新

curl -i 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 18:59:08 GMT Cache-Control: no-cache Expires: Fri, 01 Jan 1990格林威治标准时间 00:00:00 内容长度:12

“我还活着!”

curl -i -H "Accept: application/json" http://myserver.com/rest/heartbeat HTTP/1.1 200 OK 内容类型: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 “接受:文本/纯文本” 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

4

5 回答 5

21

我发现我在 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
}
于 2013-12-18T17:37:48.743 回答
4

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

但这意味着您的响应类型默认为 JSON,因此用引号括起来以正确形成。

于 2013-12-16T15:55:10.383 回答
2

@RestController如文档中所述,在您的 Controller 类上组合@Controller和。@ResponseBody

当您使用 注释方法/控制器时@ResponseBody,Spring 使用AcceptHTTP 请求标头和produces注释上的属性帮助您进行内容协商。

在你的情况下:

  • 您会收到application/json心跳操作的响应,因为您的 HTTP 客户端可能会要求该 Content-Type 并且 Spring 进行了内容协商。
  • 您的 heartbeat2 操作会收到 HTTP 406,因为内容协商失败。您在 Controller 上指定text/plain为产生 Content-Type,而您的 HTTP 客户端可能仅application/json在其Accept请求标头中列出。

更新:我使用了完全相同的 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!%

并带有一个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!%

这个示例应用程序做同样的事情并获得了很好的结果。

于 2013-12-17T09:27:40.040 回答
1

这个解决方案对我有用。请检查以下内容。

  1. 确保您的 DTO 是可序列化的并且具有可序列化的字段、getter 和 setter
  2. 检查杰克逊的依赖关系。你应该有
    • com.fasterxml.jackson.core:jackson-core:2.4.1
    • com.fasterxml.jackson.core:jackson-databind:2.4.1
    • com.fasterxml.jackson.core:jackson-annotations:2.4.1
    • com.fasterxml.jackson.datatype:jackson-datatype-joda:2.4.1
    • com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.4.1
  3. 修复 RequesMapping 注解:

    @RequestMapping(value = "/test", consumes = "*/*")

  4. 检查你有<mvc:annotation-driven />指令

于 2014-07-14T09:11:11.067 回答
0

这对我有用:

  1. 在maven中添加这个

    com.fasterxml.jackson.core 杰克逊数据绑定 2.4.4

  2. 确保<mvc:annotation-driven />在 spring 中配置

于 2014-12-07T20:13:34.353 回答