我正在尝试解决某些RequestMapping方法的某些参数,从请求体中提取值并验证它们并将它们注入到某些带注释的参数中.
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
// 1, get corresponding input parameter from NativeWebRequest
// 2, validate
// 3, type convertion and assemble value to return
return null;
}
Run Code Online (Sandbox Code Playgroud)
最大的问题是我发现HttpServletRequest(get from NativeWebRequest)无法读取输入流(某些参数在请求体中)不止一次.那么我怎样才能多次检索Inputstream/ Reader或请求体?
我们通过Spring MVC公开了REST服务.我们使用a HandlerExceptionResolver来记录异常.我们目前记录以下内容:
如果我们也可以记录JSON帖子数据,它将使调试更容易.关于如何获得这个的任何建议?
有没有办法使用默认的 Reactor NettyRequestBody在@ExceptionHandler使用 Spring WebFlux的方法中访问(最好以它的映射形式)?
考虑以下示例:
@RestController
class TestRestController {
@PostMapping("/test")
Mono<TestBody> testPost(@RequestBody TestBody testBody) {
return Mono.error(new NullPointerException());
}
@ExceptionHandler(NullPointerException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
Mono<Void> handleNullPointerException(ServerWebExchange serverWebExchange) {
return Mono.empty();
}
}
Run Code Online (Sandbox Code Playgroud)
在运行时,可以将某些类型的其他实例注入到@ExceptionHandler的方法签名中,如上面带有ServerWebExchange. 但是文档明确指出它不支持请求正文参数(请参阅本节中的注释)。
使用 Servlet 堆栈,您可以RequestContext按此处所示注入。WebFlux 堆栈是否有等效或类似的方法?
我们有一个 Spring Boot 应用程序,我们的控制器期望在我们的端点之一中有一个 XML 文档元素:
@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(...);
}
Run Code Online (Sandbox Code Playgroud)
我们有自己的 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
}
Run Code Online (Sandbox Code Playgroud)
我们的问题是,有时传递给处理程序的异常没有足够的详细信息,我们希望能够访问请求正文,以便能够自定义对客户端的响应。但是,请求的输入流不再可访问,因为它已从架构验证(转换)处理的一部分中读取,因此任何以这种方式访问它的尝试都会失败。
另一方面,我们想要实现的目标是非常常识性的,只是想知道我们是否采取了错误的方法以及什么是更好的设计来实现同样的目标。将控制器更改为期望纯文本并验证并将其转换为控制器内的请求文档并不是真正的选择。
提前感谢您或您的意见。
我有一个 @RestControllerAdvice,我在其中处理 Spring Boot 中的异常。我想记录通过请求正文发送的信息。如何从 Spring WebRequest 获取此信息?
这是我的示例异常处理程序。
@RestControllerAdvice
public class CustomExceptionHandler extends ResponseEntityExceptionHandler {
@Override
protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex,
HttpHeaders headers, HttpStatus status, WebRequest request) {
// I want to add something here that I could log an info that is in the request body.
return super.handleMethodArgumentNotValid(ex, headers, status, request);
}
Run Code Online (Sandbox Code Playgroud)
}
@M.Deinum 我尝试使用 ContentCachingRequestWrapper,但我无法访问正文内容。contentCachingRequestWrapper.getContentAsByteArray() 方法返回 null。
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
try {
ContentCachingRequestWrapper wrappedRequest = new ContentCachingRequestWrapper((HttpServletRequest) request); …Run Code Online (Sandbox Code Playgroud)