Quarkus如何捕获FAIL_ON_UNKNOWN_PROPERTIES开启时JSON未知字段异常并返回响应
解决方案
不需要为请求对象编写自定义反序列化器,通过全局异常处理器即可捕获该类异常并返回自定义响应,具体实现方式如下:
核心原理
你开启FAIL_ON_UNKNOWN_PROPERTIES = true后,请求携带多余字段时,Jackson会在反序列化阶段抛出UnrecognizedPropertyException异常,该异常属于JAX-RS标准可捕获的异常范畴,直接全局处理即可,无需针对每个请求类做单独适配。
实现步骤
- 编写
ExceptionMapper实现类,用@Provider注解注册为全局异常处理器import com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException; import javax.ws.rs.core.Response; import javax.ws.rs.ext.ExceptionMapper; import javax.ws.rs.ext.Provider; import java.util.Map; @Provider public class UnknownPropertyExceptionHandler implements ExceptionMapper<UnrecognizedPropertyException> { @Override public Response toResponse(UnrecognizedPropertyException e) { // 提取异常的核心信息返回 String invalidField = e.getPropertyName(); String targetClassName = e.getReferringClass().getSimpleName(); Map<String, Object> resp = Map.of( "error_code", "INVALID_REQUEST_FIELD", "error_msg", String.format("字段[%s]不允许出现在%s类型的请求中", invalidField, targetClassName) ); // 返回400错误和自定义的响应体 return Response.status(Response.Status.BAD_REQUEST).entity(resp).build(); } } - 无需额外配置,Quarkus启动时会自动扫描
@Provider注解的类并注册,直接生效。
可选扩展
如果需要统一处理所有Jackson反序列化相关的参数错误(比如类型不匹配、字段格式错误等),可以将捕获的异常类型改为JsonProcessingException,在方法内根据异常子类型返回不同的提示即可。
内容的提问来源于stack exchange,提问作者Disteonne
相关产品推荐
相关产品推荐

