【发布时间】:2019-07-17 13:55:40
【问题描述】:
我有自己的异常处理程序,它正在扩展 ResponseEntityExceptionHandler
我能够捕获错误,但在创建错误响应时请求正文为空
override fun handleHttpMessageNotReadable(e:HttpMessageNotReadableException, headers:HttpHeaders , status:HttpStatus , webRequest: WebRequest):ResponseEntity<Any>{
val rsp = ErrResponse(
Data(
HttpStatus.BAD_REQUEST.name,
e.message!!
),**REQUEST-BODY-NEEDED**[customFilter.payload])
return super.handleExceptionInternal(e, rsp,headers, HttpStatus.BAD_REQUEST, webRequest)
}
所以我使用 customRequestfilter 来获取正文并在那里捕获正文,但是 customRequestFilter 的顺序优先级很低,它只会在请求之后执行。那么有什么方法可以在错误响应中捕获请求正文?
自定义请求过滤器
@Component
public class CustomRequestFilter extends OncePerRequestFilter{
public String payload;
public Map<String, Object> reqLog =null;
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
ContentCachingRequestWrapper wrappedRequest = new ContentCachingRequestWrapper(request);
int status = HttpStatus.BAD_REQUEST.value();
filterChain.doFilter(wrappedRequest, response);
if (status == response.getStatus()) {
reqLog = getTrace(wrappedRequest, status);
payload = getBody(wrappedRequest, reqLog);/** ITS CAPTURING THE BODY HERE SUCCESSFULLY**/
logTrace(wrappedRequest, reqLog);
}
}
【问题讨论】:
-
这是 Kotlin,不是 Java。我将编辑标签。
-
你在哪里抛出 HttpMessageNotReadable 异常?它是在 Spring Framework 内部抛出的吗?刚查了一下,是从HttpMessageConverter抛出的
-
是的,它被春天扔了
-
LppEdd Seconds 部分用 Java 编写的代码。只是 java 和 kotlin 的混合体,因为第二部分也将是其他基于 java 的项目的库
标签: java spring spring-boot kotlin