Jackson deserialization error handling

后端 未结 4 1775
情话喂你
情话喂你 2020-12-13 10:15

My problem is fairly simple : I have the following simple class:

public class Foo {
   private int id = -1;
   public void setId(int _id){ this.id = _id; }
          


        
4条回答
  •  执念已碎
    2020-12-13 11:10

    I succeeded to solve my problem, thanks to Tatu from Jackson ML.

    I had to use custom non blocking deserializers for every primitive types handled in Jackson. Something like this factory :

    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, 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 _jsonDeserializers){
            this.jsonDeserializers = _jsonDeserializers;
            return this;
        }
    }
    

    Then calling it like this way (pass as deserializers only those you want to be non blocking) :

    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();
    

提交回复
热议问题