当前位置: 首页 > 知识库问答 >
问题:

Spring@RestController不返回纯文本响应

林正平
2023-03-14

我正在试用新的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时,我会得到一个空响应,但我希望我还活着!文本

使现代化

卷曲-ihttp://myserver.com/rest/heartbeat

HTTP/1.1 200 OK内容类型: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“接受:应用程序/json”http://myserver.com/rest/heartbeatHTTP/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-ihttp://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日期:星期二,17 Dec2013 19:02:06GMT缓存控制:无缓存过期:星期五,01 Jan1990 00:00:00GMT内容长度: 0

共有3个答案

仉伟兆
2023-03-14

@RestController在Controller类上结合了@Controller@响应体,如留档中所述。

当您使用@ResponseBody注释方法/a控制器时,Spring会使用AcceptHTTP请求头和在注释上生成属性来帮助您进行内容协商。

在您的情况下:

  • 您会得到心跳动作的application/json响应,因为您的HTTP客户端可能会请求该内容类型,而Spring进行了内容协商

更新:我使用了完全相同的卷曲请求,但没有得到相同的结果。也许过滤器或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!%

并使用生成文本/普通属性:

➜ 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!%

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

朱啸
2023-03-14

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

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

卢德惠
2023-03-14

我发现我的网络配置的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
}
 类似资料:
  • 我想在Spring Boot Controller方法中返回一条没有@ResponseBody注释的纯文本消息。 通常,当我返回一个字符串时,会出现一个错误。(实际上,它会查找html文件。) 当我使用此代码时,这将返回一个错误 错误解决模板[这是一个纯文本],模板可能不存在或可能无法访问任何配置的模板解析程序org.thymeleaf.exceptions.TemplateInputExc001

  • 我试图测试我的RestController代码(Spring Boot项目),但我总是得到404。以下是我目前掌握的情况: } } 结果总是这样: 我做错了什么?我已经尝试过直接在setUp方法中用标准设置()初始化mockmvc,我还使用了@SpringBootTest和@AutoConfigreMockMvc相结合。 有人有什么有用的提示吗?我使用spring boot 2.1.4。 谢谢

  • 我有一个spring boot webapp,我在其中定义了REST API。我将Spring Security性用于REST API安全性。 我已经用RESTController注释了我的控制器类。我最近更新了spring boot,mvc和安全性到最新版本。 我现在看到,在我的负面情况下,在更新之前,它返回json错误响应,但现在在更新之后,它返回html错误响应。 在更新之前,它给出了以下错

  • 使用@RepositoryRestResource生成路径并为 REST API 注入所有必要的 HATEOAS 链接,但是当我使用控制器从存储库返回相同的结果时,JSON 结构是不同的,并且没有 HATEOAS 链接。 我如何返回从控制器获得与RepositoryRestResource生成的路径相同的JSON结构? REST存储库: REST控制器:

  • 我有一个Spring MVC控制器,方法如下: 它位于一个开始如下所示的控制器内部: 我使用的是Spring WebMVC 4.1.3和Jackson 2.4.3。我尝试在RequestMapping中添加一个“produces”属性,表示它应该返回JSON。在本例中,发回的Content-Type属性是“application/json”,但仍然没有引用测试字符串。 我可以通过调用JSON库将J

  • 我正在构建我的第一个Spring Boot应用程序。但是我不能正确地得到我的requestMapping控制器的回答。 这是我的主要课程: 这是我的RestController: 如果我看一下日志,我可以看到“/hi”映射: 但是当我访问:http:localhost:8080/hi时,我看到了一个空白页面,我期望看到“Hello World”文本。 为什么我得到一个空白页面? ---编辑----