Quarkus隐藏resteasy异常:请求格式错返回空400无服务端日志如何解决
配置Quarkus记录Resteasy Reactive Jackson序列化/反序列化异常的方案
Quarkus的resteasy-reactive模块默认将请求体反序列化这类客户端输入异常归类为常规客户端错误,默认不会输出服务端日志,也不会返回详细错误信息给客户端。你可以通过以下两种方式配置异常日志输出:
方式一:通过application.properties配置全局日志级别
直接调整相关组件的日志级别即可捕获这类异常,无需修改业务代码:
- 添加如下配置到
application.properties:
# 开启resteasy reactive请求处理异常的日志输出 quarkus.log.category."org.jboss.resteasy.reactive.server".level=WARN # 针对jackson反序列化异常单独配置日志级别,可定位到具体字段格式问题 quarkus.log.category."com.fasterxml.jackson.databind".level=WARN # 如果需要打印完整堆栈信息排查问题,可将上面的级别调整为DEBUG
- 配置生效后,当出现OffsetDateTime格式错误这类反序列化异常时,服务端日志会输出具体的错误原因、异常字段名、错误入参值,不会再吞异常。
方式二:自定义异常映射器(可选,可同时自定义客户端返回的错误提示)
如果需要统一处理这类反序列化异常,同时确保异常一定会被记录,还可以自己实现异常映射器,既可以打印服务端日志,也可以给客户端返回友好的结构化提示,不会泄露堆栈信息:
import com.fasterxml.jackson.databind.exc.InvalidFormatException; import org.jboss.resteasy.reactive.server.ServerExceptionMapper; import javax.ws.rs.core.Response; import org.jboss.logging.Logger; public class JsonDeserializationExceptionMapper { private static final Logger LOG = Logger.getLogger(JsonDeserializationExceptionMapper.class); @ServerExceptionMapper(InvalidFormatException.class) public Response handleInvalidFormatException(InvalidFormatException e) { // 服务端打印完整异常用于排查 LOG.warn("请求体JSON格式错误", e); // 客户端仅返回友好提示,不泄露服务端信息 return Response.status(Response.Status.BAD_REQUEST) .entity("请求参数格式错误:字段" + e.getPath().get(0).getFieldName() + "格式不符合要求") .build(); } }
注意事项
- 如果开启了
quarkus.rest.jackson.fail-on-unknown-properties=true这类Jackson校验配置,对应的未知字段异常也会被上述配置捕获到日志中。 - 生产环境不要将上述日志级别调整为TRACE,会产生大量冗余日志,影响服务性能。
内容的提问来源于stack exchange,提问作者Martin Nielsen
相关产品推荐
相关产品推荐

