我使用杰克逊作为球衣的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,因为它是客户端错误。在球衣请求处理中我可以处理这种失败吗?
答案 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