2015-07-20 147 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'它實現它不工作的所有實體。 –

相關問題