我有这个适用于 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;
}
}
处理杰克逊异常
另一种选择是为JsonParseException
和JsonMappingException
实现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
模块附带的JsonParseExceptionMapper
和JsonMappingExceptionMapper
的行为,则此解决方案特别有用。