2017-01-04 2 views
3

ich einige JPA Modelle haben: "Kategorie" und "Artikel":Frühling und Jackson: set json ignorieren dynamisch

@Entity 
@Table(name = "categories") 
public class Category { 
private int id; 
private String caption; 
private Category parent; 
private List<Category> childrenList; 

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
public int getId() { 
    return id; 
} 

public void setId(int id) { 
    this.id = id; 
} 

@Column 
public String getCaption() { 
    return caption; 
} 

public void setCaption(String caption) { 
    this.caption = caption; 
} 

@ManyToOne 
@JoinColumn(name = "parent_id") 
public Category getParent() { 
    return parent; 
} 

public void setParent(Category parent) { 
    this.parent = parent; 
} 

@OneToMany 
@JoinColumn(name = "parent_id") 
public List<Category> getChildrenList() { 
    return childrenList; 
} 

public void setChildrenList(List<Category> childrenList) { 
    this.childrenList = childrenList; 
} 
} 



@Entity 
@Table(name = "articles") 
public class Article { 
private int id; 
private String caption; 
private boolean isAvailable; 
private String description; 
private int price; 
private Category category; 

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
public int getId() { 
    return id; 
} 

public void setId(int id) { 
    this.id = id; 
} 

@Column 
public String getCaption() { 
    return caption; 
} 

public void setCaption(String caption) { 
    this.caption = caption; 
} 

@Column(name = "is_available") 
@Type(type = "org.hibernate.type.NumericBooleanType") 
public boolean getIsAvailable() { 
    return isAvailable; 
} 

public void setIsAvailable(boolean available) { 
    isAvailable = available; 
} 

@Column 
public String getDescription() { 
    return description; 
} 

public void setDescription(String description) { 
    this.description = description; 
} 

@Column 
public int getPrice() { 
    return price; 
} 

public void setPrice(int price) { 
    this.price = price; 
} 

@ManyToOne 
@JoinColumn(name = "category_id") 
public Category getCategory() { 
    return category; 
} 

public void setCategory(Category category) { 
    this.category = category; 
} 
} 

Auch ich habe einige REST-Controller mit zwei Methoden: 1) Bei der ersten Methode i müssen die letzten 10 Artikel erhalten und serialisieren, aber ich brauche nicht "childrenList" und "Eltern" Feld in Categegory. 2) Bei der zweiten Methode muss ich das selbe, aber "Eltern" Feld serialisieren.

Wie kann ich das lösen? Wenn ich @ JsonIgnore Annotation zu diesen Feldern verwenden werde, werden sie nie serialisiert. Oder sollte ich DTO-Klassen verwenden?

Wie kann ich Feld zum Ignorieren dynamisch festlegen?

+0

Willkommen bei Stack Overflow! Ich könnte mir vorstellen, dass 95% dieses Codes für Ihre Frage nicht relevant ist. Bitte erstellen Sie ein [** minimales **, vollständiges und verifizierbares Beispiel] (http://stackoverflow.com/help/mcve), das Ihr Problem veranschaulicht. –

Antwort

2

ich meine Entitys nie JSON verwenden für die Erzeugung, glaube ich einen anderen Satz DTO Klassen werden Sie glücklicher auf lange Sicht machen. Mein DTO hat normalerweise einen Konstruktor, der die Entity als Argument verwendet (es benötigt immer noch einen Standardkonstruktor, wenn Sie ihn für die Analyse von eingehenden JSON verwenden wollen).

Wenn Sie wirklich Ihre Entitäten verwenden möchten, würde ich Ihnen empfehlen, MixIns zu verwenden, mit dem Sie eine MixIn-Klasse registrieren können, die die Serialisierung einer bestimmten Klasse erweitert.

Hier ist ein link zu einem MixIn Beispiel für eine andere Antwort.

+0

Ok Danke, sollte ich DTO-Klasse für jede Entität erstellen, auch wenn Felder gleich sind? –

0

Verwenden Sie einen benutzerdefinierten Serializer, der Psedo-Code ist unten.

public class CategorySerializer extends StdSerializer<Category> { 

    public CategorySerializer() { 
     this(null); 
    } 

    public CategorySerializer(Class<Category> t) { 
     super(t); 
    } 

    @Override 
    public void serialize(Category value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException { 
     // put the logic here to write the parent and child value or not 

     // here is the example to how the data is serialized 
     jgen.writeStartObject(); 
     jgen.writeNumberField("id", value.id); 
     jgen.writeStringField("caption", value.caption); 

     jgen.writeEndObject(); 
    } 
} 

Jetzt, um den benutzerdefinierten Serializer zu verwenden, legen Sie diese Annotation über Ihre Entitätsklasse Catagorie.

@JsonSerialize(using = CategorySerializer.class) 
+0

Dann muss ich zwei benutzerdefinierte Serialisierer verwenden –

+0

Wenn Sie eine bedingte Operation während der Serialisierung in Article Klasse haben, dann brauchen Sie eine. Bitte verwenden Sie den benutzerdefinierten Serializer, wo immer nötig – Avinash

Verwandte Themen