java - Spring Boot-postForEntity() : what is content type of the response?

标签 java spring-boot spring-rest

我正在尝试在一组通过 HTTP REST 通信的 Spring Boot 微服务上设置并运行集成测试。我使用 Citrus Framework 作为集成测试框架。

我有一个测试场景,其中涉及一个“主”服务调用另外两个服务来完成工作。我的测试有启动进程和“模拟”工作人员服务的调用。我将在下面包含源代码。

我遇到了一个问题,我收到一个异常,似乎表明测试期望接收的消息(如 application/json)以 text/形式通过plain 并且找不到要使用的消息转换器。奇怪的是,正在接收的消息应该是 JSON(或者至少看起来像 JSON)。

我在发送端(POSTer)上遇到了类似的问题,Citrus 在接收消息时遇到问题。我追溯到这样一个事实:我没有设置任何 HTTP header ,特别是 AcceptContent-Type。一旦我正确设置了这些,Citrus 就对其收到的结果感到满意。

服务代码:

HttpEntity<GenerateRouteCommand> entity =
    (HttpEntity<GenerateRouteCommand>) HttpEntityBuilder.createHttpEntity(...);
ResponseEntity<GenerateRouteStatus> response =
    rgTemplate.postForEntity(url, entity, GenerateRouteStatus.class);

异常(exception):

org.springframework.web.client.RestClientException: Could not extract response: no suitable HttpMessageConverter found for response type [class edu.mit.ll.mission_services.messages.GenerateRouteStatus] and content type [text/plain;charset=utf-8]                                                                                             
        at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:121)                                              
        at org.springframework.web.client.RestTemplate$ResponseEntityResponseExtractor.extractData(RestTemplate.java:994)                                                
        at org.springframework.web.client.RestTemplate$ResponseEntityResponseExtractor.extractData(RestTemplate.java:977)                                                
        at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:737)                                                                                  
        at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:670)                                                                                    
        at org.springframework.web.client.RestTemplate.postForEntity(RestTemplate.java:445)                                                                              
        at edu.mit.ll.mission_services.service.mission_planner.service.MissionPlanner.postGenerateRoute(MissionPlanner.java:214)                                         
        at edu.mit.ll.mission_services.service.mission_planner.service.MissionPlanner.planMission(MissionPlanner.java:144)                                               
        at edu.mit.ll.mission_services.service.mission_planner.controller.MissionPlannerController$Runner.executeTask(MissionPlannerController.java:51)                  
        at edu.mit.ll.mission_services.common.util.ITask.run(ITask.java:37)                                                                                              
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)                                                                               
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)                                                                               
        at java.lang.Thread.run(Thread.java:748)

在 POST 请求中发送的实体的 AcceptContent-Type header 设置为 application/json。我想我在那里还好。上面的堆栈跟踪似乎表明响应消息没有设置 header (或设置为错误的值),并且由于测试用例需要 JSON,因此测试失败。

当这些服务“正常”运行(即不通过 Citrus 驱动)时,一切正常。我没有发现任何问题。

最佳答案

我最近在尝试解码 REST 响应时两次使用 spring-boot 遇到此问题。我通过在 RestTemplate 上显式设置 HttpMessageConverters 解决了这个问题。

如果我是你,我会调试并查看响应的内容实际上是什么样子。如果它是 JSON,请尝试使用 GsonHttpMessageConverter,或者如果它确实只是文本,请尝试 StringHttpMessageConverter。或者通过以下方式将两者添加到 RestTemplate 中:

private final RestTemplate restTemplate = new RestTemplateBuilder()
        .messageConverters(Lists.newArrayList(new GsonHttpMessageConverter(GsonHelper.getInstance()), new StringHttpMessageConverter()))
        .build();

如果这些转换器似乎都无法解决您的异常,请查看 HttpMessageConverter 接口(interface)的所有不同实现,并推断出哪一个适合您的具体情况。有相当多的实现实现了这个接口(interface)。

关于java - Spring Boot-postForEntity() : what is content type of the response?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60120550/

相关文章:

javax.validation 2.0.1 List<Object> 在 spring boot 中不起作用

java - 如何修复缓慢的gradle干净版本

java - @WebMvcTest 测试类中的 UnsatisfiedDependencyException

java - Spring HttpServletRequest Stream 关​​闭 IOException

Spring 休息模板 readTimeOut

java - 在 :each 中包含新元素

JavaFX css id 选择器名称中带有点(句号)

java - 使用 Hystrix Feign 记录请求和响应 json 负载

java - Geocortext IMF框架空引用异常

java - 结合 Java、Python、PyTables 和 HDF5 的简单有效的解决方案