Tôi đã thành công để giải quyết vấn đề của mình, nhờ vào Tatu from Jackson ML.
Tôi đã phải sử dụng các trình khử giải mã tùy chỉnh không chặn cho mọi loại nguyên thủy được xử lý ở Jackson. Something như nhà máy này:
public class JacksonNonBlockingObjectMapperFactory {
/**
* Deserializer that won't block if value parsing doesn't match with target type
* @param <T> Handled type
*/
private static class NonBlockingDeserializer<T> extends JsonDeserializer<T> {
private StdDeserializer<T> delegate;
public NonBlockingDeserializer(StdDeserializer<T> _delegate){
this.delegate = _delegate;
}
@Override
public T deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
try {
return delegate.deserialize(jp, ctxt);
}catch (JsonMappingException e){
// If a JSON Mapping occurs, simply returning null instead of blocking things
return null;
}
}
}
private List<StdDeserializer> jsonDeserializers = new ArrayList<StdDeserializer>();
public ObjectMapper createObjectMapper(){
ObjectMapper objectMapper = new ObjectMapper();
SimpleModule customJacksonModule = new SimpleModule("customJacksonModule", new Version(1, 0, 0, null));
for(StdDeserializer jsonDeserializer : jsonDeserializers){
// Wrapping given deserializers with NonBlockingDeserializer
customJacksonModule.addDeserializer(jsonDeserializer.getValueClass(), new NonBlockingDeserializer(jsonDeserializer));
}
objectMapper.registerModule(customJacksonModule);
return objectMapper;
}
public JacksonNonBlockingObjectMapperFactory setJsonDeserializers(List<StdDeserializer> _jsonDeserializers){
this.jsonDeserializers = _jsonDeserializers;
return this;
}
}
Sau đó gọi nó như cách này (vượt qua như deserializers chỉ những bạn muốn trở thành phi chặn):
JacksonNonBlockingObjectMapperFactory factory = new JacksonNonBlockingObjectMapperFactory();
factory.setJsonDeserializers(Arrays.asList(new StdDeserializer[]{
// StdDeserializer, here, comes from Jackson (org.codehaus.jackson.map.deser.StdDeserializer)
new StdDeserializer.ShortDeserializer(Short.class, null),
new StdDeserializer.IntegerDeserializer(Integer.class, null),
new StdDeserializer.CharacterDeserializer(Character.class, null),
new StdDeserializer.LongDeserializer(Long.class, null),
new StdDeserializer.FloatDeserializer(Float.class, null),
new StdDeserializer.DoubleDeserializer(Double.class, null),
new StdDeserializer.NumberDeserializer(),
new StdDeserializer.BigDecimalDeserializer(),
new StdDeserializer.BigIntegerDeserializer(),
new StdDeserializer.CalendarDeserializer()
}));
ObjectMapper om = factory.createObjectMapper();
Nguồn
2012-02-01 14:47:54
Tại sao bạn muốn bỏ qua lỗi này? Tôi muốn trả về một mã HTTP của '400' cho mọi khách hàng cố gắng' PUT' cho tôi một đại diện tài nguyên như thế này :) –
Tôi đang sử dụng Jackson với Spring MVC và xác thực bean. Vấn đề là Jackson đang phàn nàn về các vấn đề deserialization, trước khi tôi đạt đến lớp mvc mùa xuân .. vì vậy tôi không thể gửi cho khách hàng của tôi các lỗi một cách nhất quán. –
Ngoài ra tôi (đối với một) sử dụng Jackson khá thường xuyên để làm một bãi chứa có thể đọc được của một đối tượng để đăng nhập. Có thể lưu ý vấn đề serialization và di chuyển trên là rất hữu ích –