2016-03-28 4 views
2

Ich brauche @ JsonView für das Werfen von Ausnahmen während der Deserialisierung.@jsonview fehlgeschlagen auf unbekannte Eigenschaften

Mein POJO:

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

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

Mein Service:

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; 
} 

Was muss ich erreichen, ist, dass, wenn ich eine Person zu schaffen versuche, ich brauche nur 'personname' zu übergeben. Wenn ich 'companyName' übergebe, muss ich eine Ausnahme auslösen. Wie kann ich dies mit @JsonView erreichen? Gibt es eine Alternative?

+0

Sie können versuchen, zwei Klassen erstellen 'Unternehmen erstreckt Contact' und' PersonContact erstreckt Contact' – varren

+0

@varren - Sie meinen, 2 neue Klassen für 'Unternehmen' und 'PersonContact'? –

+0

yep, wenn Sie solche Option haben, wird es helfen, die Logik zu trennen – varren

Antwort

0

Ich denke, @JsonView ist nicht genug, um das für Sie zu lösen. Hier ist mehr Info warum: UnrecognizedPropertyException is not thrown when deserializing properties that are not part of the view

Aber ich sah gerade im Quellcode und schaffte es irgendwie dieses Problem mit der Kombination von @JsonView und benutzerdefinierte BeanDeserializerModifier "hacken". It'is nicht schön, aber hier ist wesentlicher Bestandteil:

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; 
    } 
} 

und hier ist, wie Sie es auf Ihrem Objekt Mapper registrieren:

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

Dies funktioniert für mich, und ich bin immer UnrecognizedPropertyException jetzt:

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

Vielen Dank !!! Du hast mir viele Stunden damit erspart, durch viele Posts zu graben. Es funktionierte! Danke noch einmal!! –