2015-07-20 237 views
0

确实存在任何方式如何注册JSON解串器使用杰克逊2.X和Spring框架,而不是与标注每@JsonDeserialize(using = IdentifiableDeserializer.class)财产实现特定接口的所有类型的所有类型?如何注册通用JsonDeserializer为它实现给定的接口

通用解串器

public class IdentifiableDeserializer extends JsonDeserializer<IdentifiableEntity> implements ContextualDeserializer{ 

    @Override 
    public JsonDeserializer<?> createContextual(DeserializationContext ctxt, BeanProperty property) 
      throws JsonMappingException { 
     // ... 
    } 

    @Override 
    public IdentifiableEntity deserialize(JsonParser jp, DeserializationContext ctxt)throws IOException, JsonProcessingException { 
     // ... 
    } 

} 

实体应反序列化

public class MyEntity implements IdentifiableEntity{ 
    private Long id; 

    public getId(){ 
     return id; 
    } 
    //... 
} 

的贡献莫过于

@Service("myEntityService") 
private MyEntityService implements IdentifiableService<MyEntity>{ 

    MyEntity findById(Long id){ 
     //... 
    } 

} 

我尝试了以下方法,但它不起作用。

<bean class="org.springframework.web.servlet.view.json.MappingJackson2JsonView"> 
    <property name="objectMapper"> 
     <bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean"> 
      <property name="deserializersByType"> 
       <map key-type="java.lang.Class"> 
        <entry key="xx.yy.IdentifiableEntity"> 
         <bean class="xxx.yyy.IdentifiableDeserializer" /> 
        </entry> 
       </map> 
      </property> 
     </bean> 
    </property> 
</bean> 
+1

也许'Module'? – fge

回答

2

是的,你可以看看custom deserializers

ObjectMapper mapper = new ObjectMapper(); 
SimpleModule testModule = new SimpleModule("MyModule", new Version(1, 0, 0, null)) 
    .addDeserializer(IdentifiableEntity.class, new IdentifiableDeserializer()); 
mapper.registerModule(testModule); 
+0

我认为这种方式几乎等于我的。我注册了一个模块,但并未调用反序列化器。我想这个问题是不同类型的。杰克逊寻找的不是'IdentifiableEntity'的确切类型。 –

+0

我不这么认为,它也适用于亚型。尽管如此,你仍然可以尝试一种确切的类型,以确保它是(或不是)问题。 –

+0

我只是尝试了亚型和亚型,它正在如预期,但如果使用接口'IdentifiableEntity'它实现它不工作的所有实体。 –

相关问题