2012-09-26 22 views
10

ich habe eine Klasse mit den folgenden Anmerkungen:Jersey/Jackson @JsonIgnore auf Setter

class A { 
public Map<String,List<String>> references; 

@JsonProperty 
public Map<String,List<String>> getReferences() { 
... 
} 

@JsonIgnore 
public void setReferences(Map<String,List<String>>) { 
} 
... 
} 
} 

Was ich versuche, ist die json auf Deserialisierung zu ignorieren. Aber es funktioniert nicht. Immer wenn JSON String ankommt, füllt die Jackson-Bibliothek das references-Attribut. Wenn ich nur die @ JsonIgnore Annotation verwende, funktioniert der Getter nicht. Gibt es Lösungen für dieses Problem?

Dank

Antwort

0

ich nur eines nicht-jackson Lösung denken kann, eine Basisklasse zu verwenden, die auf die tatsächliche Klasse keine Referenzen für die Zuordnung haben und werfen dann:

// expect a B on an incoming request 
class B { 
// ... 
} 

// after the data is read, cast to A which will have empty references 
class A extends B { 
public Map<String,List<String>> references; 
} 

Warum tun Sie senden sogar die Referenzen, wenn Sie sie nicht wollen?

Oder sind die eingehenden Daten aus Ihren Händen und Sie wollen nur die Mapping-Ausnahme vermeiden, die Ihnen sagt, dass Jackson keine Eigenschaft für eingehende Referenzen finden kann? Dafür verwenden wir eine Basisklasse, die alle unsere Json Modellklassen erben:

public abstract class JsonObject { 

    @JsonAnySetter 
    public void handleUnknown(String key, Object value) { 

     // for us we log an error if we can't map but you can skip that 
     Log log = LogFactory.getLog(String.class);  
     log.error("Error mapping object of type: " + this.getClass().getName());  
     log.error("Could not map key: \"" + key + "\" and value: \"" + "\"" + value.toString() + "\""); 

    } 

Dann in der POJO fügen Sie @JsonIgnoreProperties so dass eingehende Eigenschaften wird handleUnknown()

@JsonIgnoreProperties 
class A extends JsonObject { 
    // no references if you don't need them 
} 

erhalten weitergeleitet bearbeiten

This SO Thread beschreibt, wie Sie Mixins verwenden. Dies könnte die Lösung sein, wenn Sie Ihre Struktur genau so beibehalten wollen wie ich es ist, aber ich habe es nicht versucht.

+0

Das stimmt. Die eingehenden Daten sind nicht wirklich in unseren Händen. Aber die Clients senden immer Referenzattribute im richtigen Format, so dass handleUnknown niemals aufgerufen wird. – guerilla

+0

Ah, mein Schlechter, habe ein bisschen Information vergessen. Sie benötigen '@ JsonIgnoreProperties' am POJO, wenn Sie eingehende Daten ignorieren wollen. Ich werde meinen Beitrag aktualisieren. (PS: Wir verwenden dies, um die REST-Ressource von Facebook zu verbrauchen und alle von Facebook gesendeten Eigenschaften, die nicht in unserem POJO enthalten sind, werden nur eingeloggt und dann entscheiden wir, ob wir sie hinzufügen wollen oder nicht) – Pete

+0

Aber Referenzen sind in meinem POJO so passt immer zum Setter – guerilla

15

Ich denke, es gibt zwei Schlüsselelemente, die es Ihnen ermöglichen sollten, "schreibgeschützte Sammlungen" wie gewünscht zu haben. Erstens, zusätzlich zu den Setter ignorieren, stellen Sie sicher, dass Ihr Feld auch mit @JsonIgnore gekennzeichnet:

class A { 

    @JsonIgnore 
    public Map<String,List<String>> references; 

    @JsonProperty 
    public Map<String,List<String>> getReferences() { ... } 

    @JsonIgnore 
    public void setReferences(Map<String,List<String>>) { ... } 

} 

Zweitens, um die Getter zu verhindern, als Setter verwendet wird, deaktivieren Sie die USE_GETTERS_AS_SETTERS Funktion:

ObjectMapper mapper = new ObjectMapper(); 
mapper.disable(MapperFeature.USE_GETTERS_AS_SETTERS); 
+0

Ich ignorierte dummerweise Ihren ersten Rat und markiert das Feld nicht als ignoriert, da es in meinem Fall privat ist. Allerdings musste ich das trotzdem tun, damit es richtig funktioniert. Ist das richtig oder ein Missverständnis auf meiner Seite? Wenn ja, lohnt es sich, dies in Ihrer Antwort ausdrücklich zu erwähnen. –

4

Sie müssen sicherstellen, dass @JsonIgnore-Annotation sowohl auf Feldebene als auch auf dem Setter vorhanden ist und Getter mit @ JsonProperty annotiert wird.

public class Echo { 

    @Null 
    @JsonIgnore 
    private String doNotDeserialise; 

    private String echo; 

    @JsonProperty 
    public String getDoNotDeserialise() { 
     return doNotDeserialise; 
    } 

    @JsonIgnore 
    public void setDoNotDeserialise(String doNotDeserialise) { 
     this.doNotDeserialise = doNotDeserialise; 
    } 

    public String getEcho() { 
     return echo; 
    } 

    public void setEcho(String echo) { 
     this.echo = echo; 
    } 
} 

@Controller 
public class EchoController { 

@ResponseBody 
@RequestMapping(value = "/echo", consumes = APPLICATION_JSON_VALUE, produces = APPLICATION_JSON_VALUE) 
    public Echo echo(@RequestBody @Valid Echo echo) { 
     if (StringUtils.isEmpty(echo.getDoNotDeserialise())) { 
      echo.setDoNotDeserialise("Value is set by the server, not by the client!"); 
     } 

     return echo; 
    } 
} 
  • Wenn Sie eine JSON-Anforderung mit einem „doNotDeserialise“ Wert auf etwas gesetzt einreichen, wenn JSON zu einem Objekt deserialised wird es auf null gesetzt werden (wenn nicht ich eine Validierung Einschränkung auf dem Feld eingeben, damit die es wird Fehler aus)
  • Wenn Sie den „doNotDeserialise“ Wert auf etwas auf dem Server dann wird es richtig zu JSON serialisiert werden gesetzt und an den Client geschoben
3

I @JsonIgnore auf meinem Getter verwendet und es didn‘ t arbeiten und ich konnte den Mapper nicht konfigurieren (I w wie Jackson Jackson Jaxrs Anbieter).Dieser arbeitete für mich:

@JsonIgnoreProperties(ignoreUnknown = true, value = { "actorsAsString", 
    "writersAsString", "directorsAsString", "genresAsString" }) 
0

Ab Jackson 2.6 gibt es eine neue und verbesserte Art und Weise ist read-only und write-only Eigenschaften zu definieren, mit JsonProperty#access() Anmerkung. Dies wird über die Verwendung separater JsonIgnore und JsonProperty Anmerkungen empfohlen.

@JsonProperty(access = JsonProperty.Access.READ_ONLY) 
public Map<String,List<String>> references; 
Verwandte Themen