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

基于@RequestMapping的produces条件返回错误响应的内容类型

勾海超
2023-03-14

我在REST WebService中有自定义错误处理。我有返回XML/JSON作为响应的方法。在SpringBoot 2.0.9版本上一切都很好。但是在迁移到最新的(2.2.4)之后,我的错误处理测试失败了:

Content type expected:<application/xml> but was:<application/json>
Expected :application/xml
Actual   :application/json

经过研究,我发现这与将Spring升级到5.1版本有关。文档:

错误响应的内容协商@RequestMapping的Products条件不再影响错误响应的内容类型。

如何在最新版本中重现Spring早期版本的行为?我只想返回produces条件中指定的错误的内容类型。

@PostMapping(path = "/{scriptName}", produces = { MediaType.APPLICATION_XML_VALUE })
public ResponseEntity<Object> xmlMethod(@RequestParam("payload") String payload, @PathVariable("scriptName") String scriptName) {

    Object result = service.call(payload, scriptName);
    return ResponseEntity.ok(new JsonBuilder(result).getContent());
}

@PostMapping(path = "/{scriptName}", produces = { MediaType.APPLICATION_JSON_VALUE })
public ResponseEntity<Object> jsonMethod(@RequestParam("payload") String payload, @PathVariable("scriptName") String scriptName) {
    Object result = service.call(payload, scriptName);
    return ResponseEntity.ok(new JsonBuilder(result).getContent());
}

CustomRestExceptionHandler:

@ControllerAdvice
public class CustomRestExceptionHandler extends ResponseEntityExceptionHandler {

    @ExceptionHandler(ResourceNotFoundException.class)
    public ResponseEntity<Object> handleResourceNotFoundException(ResourceNotFoundException ex, WebRequest request) {

        HTTPErrorDTO httpError = new HTTPErrorDTO(HttpStatus.NOT_FOUND, ex.getLocalizedMessage());
        return new ResponseEntity<>(httpError, new HttpHeaders(), httpError.getStatus());
    }

    ....
    // handlers for other exceptions
}

错误DTO:

@XmlRootElement(name = "Exception")
@XmlAccessorType(XmlAccessType.FIELD)
public class HTTPErrorDTO {

    private HttpStatus status;
    private String message;
    private List<String> errors;
}

相关主题:Spring mvc-为XML和JSON响应配置错误处理

---编辑

我尝试添加自定义内容协商配置。但是我的REST API的一个客户机向我发送content-type=“application/x-www-form-urlencoded”,并预期application/xml,但不发送任何accept头。

所以我只能在方法/控制器级别决定内容类型应该是什么格式

我能以某种方式从控制器通知异常处理程序,应该设置哪种内容类型吗?

共有1个答案

澹台正业
2023-03-14

CustomRestExceptionHandler中,可以为ResponseEntity设置媒体类型。

return ResponseEntity.status(httpError.getStatus().value())
        .contentType(MediaType.APPLICATION_XML)
        .body(httpError);
 类似资料:
  • 我试图使用第三方Web服务(基于php)在asp.netc#应用程序,但失败的服务配置。已经尝试添加服务/Web引用-所有相同的错误: 响应消息的内容类型 text/html 与绑定的内容类型不匹配(text/xml;charset=utf-8)。如果使用自定义编码器,请确保正确实现 IsContentTypeSupport 方法。响应的前 402 个字节是:” [已手动编辑响应以正确显示 对我来

  • 问题内容: 当我从带有403响应的URL获取数据时 它抛出IOException,我无法获取响应数据。 但是当我使用firefox并直接访问该URL时,ResponseCode仍然是403,但是我可以获取html内容 问题答案: 根据javadocs,该方法将返回,可用于从错误条件(例如404)中检索数据。

  • 有人能解释一下为什么我通过Postman和http从外部http API得到不同的响应吗。NetCore web Api HttpClient。 这是一个密码 结果是 但Postman返回完整有效的json结果。 为什么结果从。NetCore HttpClient是部分的? 我已经尝试了指定请求头这样的选项: 还补充道: 没有帮助。

  • 几周以来,我一直在使用Spring-MVC开发一个rest api。REST-API工作正常,我几乎完成了最后一个问题,当涉及到对特定错误对象的错误处理时。 REST-API使用JSON作为序列化Java-Objects的格式。当服务执行过程中发生错误时,将创建一个特定的错误对象并将其发送回客户机。 当我的REST服务被标记为“produces=application/json”时,一切都很好。但

  • 假设我已经包装了我的C类和,并且可以通过SWIG生成的模块从Python访问它们: 在Python中,我创建了面向用户的类,它是一个浅层代理,主要添加docstring,并允许IDE对参数名称进行制表符补全: 问题在于,返回类型为,它没有docstring,也不显示参数名称(swig将所有参数公开为)。相反,我希望它提供我自己的浅代理

  • 我们有一个使用node js(express js)构建的web应用程序,它位于nginx后面。 对于特定的API,我们希望将内容类型响应头设置为“text/plain”。控制器中有以下代码。 res.setHeader('Content-Type','text/plain');res.send(响应); 当服务器不在nginx后面时,这是有效的。但是当服务器在nginx后面时,响应头仍然是“应用