2016-03-28 15 views
2

デシリアライズ中に例外をスローするために@JsonViewを使用する必要があります。@jsonviewが不明なプロパティで失敗する

マイPOJO:

public class Contact 
{ 
    @JsonView(ContactViews.Person.class) 
    private String personName; 

    @JsonView(ContactViews.Company.class) 
    private String companyName; 
} 

私のサービスは:私は達成するために必要なもの

public static Contact createPerson(String json) { 

    ObjectMapper mapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES , true); 

    Contact person = mapper.readerWithView(ContactViews.Person.class).forType(Contact.class).readValue(json); 

    return person; 
} 


public static Contact createCompany(String json) { 

    ObjectMapper mapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES , true); 

    Contact company = mapper.readerWithView(ContactViews.Company.class).forType(Contact.class).readValue(json); 

    return company; 
} 

は、私は人を作成しようとしていますならば、私は唯一の 'PERSONNAME' を渡す必要がある、ということです。私は 'companyName'を渡す場合、私は例外をスローする必要があります。 @JsonViewでこれをどのように達成できますか?何か別の選択肢はありますか?

+0

あなたは2クラスを作成しようとすることができます 'CompanyContactがContact'と' PersonContactが伸びるContact' – varren

+0

@varrenを拡張 - あなたは 'CompanyContact' と 'PersonContact' の2つの新しいクラスを意味ですか? –

+0

あなたがそのようなオプションを持っていれば、ロジックを分離するのに役立ちます – varren

答えて

0

私は@JsonViewでこれを解決するには不十分だと思います。ここに詳細があります:UnrecognizedPropertyException is not thrown when deserializing properties that are not part of the view

しかし、私はちょうどソースコードを見て、@JsonViewとカスタムBeanDeserializerModifierの組み合わせでこの問題をちょっと "ハック"することができました。 It'isかなりが、ここではない重要な部分です:

public static class MyBeanDeserializerModifier extends BeanDeserializerModifier { 

    @Override 
    public BeanDeserializerBuilder updateBuilder(DeserializationConfig config, 
        BeanDescription beanDesc, BeanDeserializerBuilder builder) { 
     if (beanDesc.getBeanClass() != Contact.class) { 
      return builder; 
     } 

     List<PropertyName> properties = new ArrayList<>(); 
     Iterator<SettableBeanProperty> beanPropertyIterator = builder.getProperties(); 
     Class<?> activeView = config.getActiveView(); 


     while (beanPropertyIterator.hasNext()) { 
      SettableBeanProperty settableBeanProperty = beanPropertyIterator.next(); 
      if (!settableBeanProperty.visibleInView(activeView)) { 
       properties.add(settableBeanProperty.getFullName()); 
      } 
     } 

     for(PropertyName p : properties){ 
      builder.removeProperty(p); 
     } 

     return builder; 
    } 
} 

、ここでは、あなたのオブジェクトマッパーでそれを登録する方法である:

ObjectMapper mapper = new ObjectMapper(); 
SimpleModule module = new SimpleModule(); 
module.setDeserializerModifier(new MyBeanDeserializerModifier()); 
mapper.registerModule(module); 

これは私の作品と私は今UnrecognizedPropertyExceptionを取得しています:

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "companyName" (class Main2$Contact), not marked as ignorable (one known property: "personName"]) 
+0

ありがとう!あなたは私にたくさんの投稿を通して時間を掘ってくれました。出来た!再度、感謝します!! –

関連する問題