我有这个函数适用于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)
{
//...
}
答案 0 :(得分:0)
一旦你消费并制作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;
}
}
另一种选择是为ExceptionMapper
和JsonParseException
实施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
模块附带的JsonMappingExceptionMapper
和jackson-jaxrs-json-provider
的行为,则此解决方案特别有用。