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

时间:2018-01-09 13:16:35

标签: java json tomcat jersey jax-rs

我有这个函数适用于POST请求,只有当它在HTTP数据包的数据字段中重新发送JSON时才有效。 然后自动将每个对象映射到JSON并将其放入数组 Persona [] lista 。但是如果POJO Persona中存在一个不存在的字段,它会给我一个错误(如“ 500内部服务器错误“),但我无法通过使用try catch在代码中处理它。我怎么处理呢?

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

1 个答案:

答案 0 :(得分:0)

一旦你消费并制作JSON,你可能正在使用杰克逊。

所以这里有一些你可以考虑的方法(你可以同时使用它们):

忽略未知的JSON属性

根据您的需要,您可以为ContextResolver实施ObjectMapper并禁用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;
    }
}

处理杰克逊例外

另一种选择是为ExceptionMapperJsonParseException实施JsonMappingException,因此您可以根据自己的需要处理此类例外情况:

@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子类,则可以使用ExceptionMapper注释@Priority

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

如果您已注册JacksonFeature,并希望覆盖JsonParseExceptionMapper模块附带的JsonMappingExceptionMapperjackson-jaxrs-json-provider的行为,则此解决方案特别有用。