在RequestContext中处理com.fasterxml.jackson.databind.exc.InvalidFormatException

时间:2018-03-21 13:36:11

标签: java jackson jersey

我使用杰克逊作为球衣的json供应商,我遇到了一些麻烦。请注意以下场景:

An entity have a property defined by an Enum
Someone sends a request with an invalid value for the Enum

Jersey将尝试使用jackson反序列化请求,并且无法返回500 HTTP响应。我希望将其更改为422,因为它是客户端错误。在球衣请求处理中我可以处理这种失败吗?

1 个答案:

答案 0 :(得分:1)

您可以使用ExceptionMapper来捕获错误并返回另一个HTTP代码。示例:

MyEnum.java

public enum MyEnum {
    VALUE1,
    VALUE2
}

Entity.java

public class Entity {

    @JsonProperty
    protected String id;

    @JsonProperty
    protected MyEnum value;

    @JsonCreator
    public Entity(
        @JsonProperty("id") String id,
        @JsonProperty("value") MyEnum value) {
        this.id = id;
        this.value = value;
    }
}

WSTest.java

@POST
@Path("/test")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public boolean test(final Entity entity) { // will throw com.fasterxml.jackson.databind.exc.InvalidFormatException if the enum value is not valid
    System.out.println(entity);
    return true;
}

JsonExceptionMapper.java

import com.fasterxml.jackson.databind.exc.InvalidFormatException;
import javax.ws.rs.core.Response;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider;

@Provider
public class JsonExceptionMapper implements ExceptionMapper<InvalidFormatException> {

    @Override
    public Response toResponse(InvalidFormatException ex) {
        // TODO: log error
        return Response.status(422)
            .build();
    }
}

如果您使用{"id": "test", "value": "VALUE1"}致电 / test :HTTP 200

如果您使用{"id": "test", "value": "VALUE3"}调用它:HTTP 422