我成功地解决了我的问题,谢谢
Tatu from Jackson ML.
我不得不为Jackson中处理的每个原始类型使用自定义的非阻塞解串器.
像这样的工厂:
public class JacksonNonBlockingObjectMapperFactory {
/**
* Deserializer that won't block if value parsing doesn't match with target type
* @param Handled type
*/
private static class NonBlockingDeserializer extends JsonDeserializer {
private StdDeserializer delegate;
public NonBlockingDeserializer(StdDeserializer _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 jsonDeserializers = new ArrayList();
public ObjectMapper createObjectMapper(){
ObjectMapper objectMapper = new ObjectMapper();
SimpleModule customJacksonModule = new SimpleModule("customJacksonModule",new Version(1,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 _jsonDeserializers){
this.jsonDeserializers = _jsonDeserializers;
return this;
}
}
然后以这种方式调用它(作为解串器传递只有那些你想要阻止的):
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,new StdDeserializer.CharacterDeserializer(Character.class,new StdDeserializer.LongDeserializer(Long.class,new StdDeserializer.FloatDeserializer(Float.class,new StdDeserializer.DoubleDeserializer(Double.class,new StdDeserializer.NumberDeserializer(),new StdDeserializer.BigDecimalDeserializer(),new StdDeserializer.BigIntegerDeserializer(),new StdDeserializer.CalendarDeserializer()
}));
ObjectMapper om = factory.createObjectMapper();