感谢Jackson
Jackson的Tatu,我成功解决了我的问题。
对于在Jackson中处理的每个原始类型,我必须使用自定义非阻塞解串器。像这样的工厂:
public class JacksonNonBlockingObjectMapperFactory { 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; }}然后以这种方式调用它(仅将要成为非阻塞对象的那些作为反序列化器传递):
JacksonNonBlockingObjectMapperFactory factory = new JacksonNonBlockingObjectMapperFactory();factory.setJsonDeserializers(Arrays.asList(new StdDeserializer[]{ // StdDeserializer, here, comes from Jackson (org.prehaus.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();


