Jakarta ee 反序列化失败时如何自定义错误响应

Jakarta ee 反序列化失败时如何自定义错误响应,jakarta-ee,jersey,jackson,jax-rs,Jakarta Ee,Jersey,Jackson,Jax Rs,我有一个jaxrs端点服务,在我自己的ResourceConfig中注册了一个ExceptionMapper,因此当发生错误时,它将返回一个JSON{errorEnum:“something”}。服务类如下所示 @POST @Path("/query") @Produces(MediaType.APPLICATION_JSON) @Consumes(MediaType.APPLICATION_JSON) public Response query(final QueryDefinition qu

我有一个jaxrs端点服务,在我自己的
ResourceConfig
中注册了一个
ExceptionMapper
,因此当发生错误时,它将返回一个JSON
{errorEnum:“something”}
。服务类如下所示

@POST
@Path("/query")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public Response query(final QueryDefinition queryDefinition) {
    ...
}
但是,在我的有效负载中,有一个字段是Enum。如果任何用户在该字段中输入了错别字,则会显示错误消息

Can not deserialize value of type FIELD from String "AAA": value not
one of declared Enum instance names: [AAA, BBB, CCC]  at [Source:
org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$UnCloseableInputStream@62ac814;
line: 15, column: 17] (through reference chain:
QueryDefinition["FIELD"])
我尝试使用自定义的枚举反序列化器

public class EnumDeserializer extends JsonDeserializer<Enum   {
    @Override
    public Dimensions deserialize(JsonParser jp, DeserializationContext deserializationContext) throws IOException,
JsonProcessingException {
        JsonNode node = jp.getCodec().readTree(jp);
        String enumName = node.textValue();
        Enum e = Enums.fromString(enumName);
        if (e != null) { return e; }
        throw new CustomizedException("Not supported Enum");
    } }

公共类EnumDeserializer扩展了JsonDeserializerJackson提供程序已经有了
ExceptionMapper
s1,它在捕获异常时将只返回异常消息。如果需要,您可以为这些异常创建自己的
ExceptionMapper
,即
JsonParseException
JsonMappingException
,然后返回所需的消息。然后在Jersey应用程序中注册这些映射程序。这将覆盖Jackson注册的

您的异常映射器不工作的原因是来自Jackson的异常映射器更具体。更具体的一个总是被调用


1-即和

Jackson提供的默认实现没有@Provider注释,您知道如何将其自动配置为运行时吗?通过查看代码没有得到多少线索。