quarkus-resteasy-jackson 映射时未知字段时的自定义消息

Kan*_*pai 3 jackson quarkus

我想为无法识别的字段和请求正文的其他错误设置自定义错误消息。我尝试了 ExceptionMapper 但它不起作用:/使用 quarkus 和 Jackson

public class ReqDTO {
    private String a;
}
Run Code Online (Sandbox Code Playgroud)

发送请求时:

{
    "a": "a"
}
Run Code Online (Sandbox Code Playgroud)

它看起来不错。但是发送时:

{
    "a": "a",
    "b": "b"
}
Run Code Online (Sandbox Code Playgroud)

有错误响应:

Unrecognized field "b"; (class ReqDTO), not marked as ignorable
Run Code Online (Sandbox Code Playgroud)

想要自定义此消息和其他错误的 json 正文(如太多字段)以拥有“BAD_JSON_SCHEMA”等消息。

尝试过

@Provider
public class ExHandler implements ExceptionMapper<JsonMappingException>{

    public Respone toResponse(JsonMappingException e) { 
        //response bad field impl
    }
}
Run Code Online (Sandbox Code Playgroud)

但它不起作用。看起来像 json 处理异常更快。尝试使用“Exception”、“JsonParseException”但没有任何改变:/

@Path("/")
public class Controller {
    @Post
    @Consume(APPLICATION_JSON)
    @Produces(TEXT_PLAIN)
    public Response getA(@Valid ReqDTO reqDTO){
        //logic
    }
}
Run Code Online (Sandbox Code Playgroud)

@编辑

找到类似 DeserializationProblemHandler 的东西,但不知道如何更改 handleUnknownProperty 的消息:/

Kan*_*pai 5

@Singleton
RegisterCustomModuleCustomizer implements ObjectMapperCustomizer {

    public void customize(ObjectMapper mapper){
        mapper.addHandler(new DeserializationProblemHandler(){
            @SneakyThrows
            @Override
            public boolean handleUnknownProperty(...... params){
                throw new ApplicationException("ERRO_BODY_MESS");
            }
        }
    }
}

@Provider
public class ExHandler implements ExceptionMapper<ApplicationException>{

    public Respone toResponse(ApplicationException ex) { 
        return Response.status(BAD_REQUEST).entity(ex.getMessage()).build();
    }
}
Run Code Online (Sandbox Code Playgroud)