JAX-RS 在自动 POJO 映射之前处理异常



我有这个适用于 POST 请求的函数,并且仅当它在 HTTP 数据包的数据字段中接收 JSON 时才有效。然后它自动将每个对象映射到JSON中,并将其放入数组Persona[] lista中。但是,如果 POJO 角色中不存在一个字段,它会给我一个错误(例如"500 内部服务器错误"(,但我无法使用 try catch 在代码中处理它。我该如何处理它?

@POST
@Path("/post")
@Consumes(MediaType.APPLICATION_JSON)
@Produces (MediaType.APPLICATION_JSON)
public ResponseClass createPersonaInJSON(Persona[] lista)
{
    //...
}

一旦你消费和生产 JSON,你可能正在使用 Jackson。

因此,您可以考虑以下几种方法(您可以同时使用这两种方法(:

忽略未知的 JSON 属性

根据需要,您可以实现ObjectMapper ContextResolver并禁用FAIL_ON_UNKNOWN_PROPERTIES反序列化功能,这样如果在 JSON 有效负载中发送未知属性,Jackson 就不会失败:

@Provider
public class ObjectMapperContextResolver implements ContextResolver<ObjectMapper> {
    private final ObjectMapper mapper;
    public ObjectMapperContextResolver() {
        this.mapper = createObjectMapper();
    }
    @Override
    public ObjectMapper getContext(Class<?> type) {
        return mapper;
    }
    private ObjectMapper createObjectMapper() {
        ObjectMapper mapper = new ObjectMapper();
        mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
        return mapper;
    }
}

处理杰克逊异常

另一种选择是为JsonParseExceptionJsonMappingException实现ExceptionMapper s,因此您可以根据需要处理此类异常:

@Provider
public class JsonParseExceptionMapper implements ExceptionMapper<JsonParseException> {
    @Override
    public Response toResponse(JsonParseException exception) {
        return Response.status(Response.Status.BAD_REQUEST).entity("Cannot parse JSON")
                       .type(MediaType.TEXT_PLAIN).build();
    }
}
@Provider
public class JsonMappingExceptionMapper implements ExceptionMapper<JsonMappingException> {
    @Override
    public Response toResponse(JsonMappingException exception) {
        return Response.status(Response.Status.BAD_REQUEST).entity("Cannot parse JSON")
                       .type(MediaType.TEXT_PLAIN).build();
    }
}

然后在ResourceConfig子类中使用绑定优先级注册它们:

@ApplicationPath("api")
public class JerseyConfig extends ResourceConfig {
    public JerseyConfig() {
        register(JsonMappingExceptionMapper.class, 1);
        register(JsonParseExceptionMapper.class, 1);
    }
}

如果不使用 ResourceConfig 子类,则可以使用 @Priority 注释ExceptionMapper s:

@Provider
@Priority(1)
public class JsonParseExceptionMapper implements ExceptionMapper<JsonParseException> {
    ...
}
@Provider
@Priority(1)
public class JsonMappingExceptionMapper implements ExceptionMapper<JsonMappingException> {
    ...
}

如果已注册JacksonFeature,并且想要覆盖jackson-jaxrs-json-provider模块附带的JsonParseExceptionMapperJsonMappingExceptionMapper的行为,则此解决方案特别有用。

最新更新