【发布时间】:2020-08-31 21:42:32
【问题描述】:
我们有一个 spring boot 应用程序,我们的控制器需要一个 XML Document 元素在我们的端点之一:
@PostMapping(value = "/api/v1/do-stuff",
consumes = APPLICATION_XML_VALUE,
produces = APPLICATION_XML_VALUE)
public ResponseEntity<JAXBElement<my.company.stuff.resposnse.Document>> doStuff(
@RequestBody JAXBElement<my.company.stuff.request.Document> requestBody,
Principal principal) throws Exception {
// Doing some suff here and returning the result
return stuffService.doStuff(...);
}
我们有自己的 Jaxb2Marshaller 实例,我们在其中设置了请求文档和响应文档的模式,用于在请求和响应主体与我们的域对象之间进行编组和取消编组。当请求到来时,Spring Boot 框架将在请求正文和域请求文档之间进行转换。有时请求正文没有通过 XSD 架构验证,因此它甚至没有到达我们的控制器。
抛出的异常被传递给我们的自定义扩展org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler,我们希望在其中为我们的应用程序客户端创建最有意义的错误响应:
@Override
protected ResponseEntity<Object> handleHttpMessageNotReadable(HttpMessageNotReadableException ex,
HttpHeaders headers, HttpStatus status, WebRequest request) {
// Getting access to the request body would be very beneficial here
}
我们的问题是有时传递给我们的处理程序的异常没有足够的详细信息,我们希望能够访问请求正文以便能够自定义我们对客户端的响应。但是,请求的输入流不再可访问,因为它已经从部分模式验证(转换)处理中读取,因此任何以这种方式访问它的尝试都会失败。
另一方面,我们试图实现的目标是非常常识,只是想知道我们是否采用了错误的方法,以及实现相同目标的更好设计是什么。将控制器更改为期望纯文本并验证并将其转换为控制器内的请求文档并不是一个真正的选择。
提前感谢您或您的意见。
【问题讨论】:
-
嗨@Julian,我也有同样的问题。你找到解决这个问题的方法了吗?谢谢!
标签: java spring-boot