Джексон CsvMapper не работает на вложенных <List>объектов - PullRequest
0 голосов
/ 18 октября 2019

Я пытаюсь сгенерировать файл CSV на основе некоторых объектов JSON, которые возвращает мой JPA @Service. Проблема заключается в том, что Parent объект верхнего уровня ссылается на List вложенных Child объектов, которые не отображаются в выходных данных CSV. В CSV-файле отображаются только поля объекта Parent.

Вот мой @Controller, в котором настроен сопоставитель CSV:

@GetMapping(value="/export", produces = "text/csv")
public ResponseEntity exportCSV() throws JsonProcessingException {      
    CsvMapper mapper = new CsvMapper();
    mapper.configure(JsonGenerator.Feature.IGNORE_UNKNOWN,true);        
    CsvSchema schema = mapper.schemaFor(Parent.class);
    final String csv = mapper.writer(schema.withUseHeader(true)).writeValueAsString(myService.findAll());
    return ResponseEntity.ok().header("Content-Disposition", "attachment; filename=" + csvFileName + ".csv").
            contentType(MediaType.parseMediaType("text/csv")).body(csv);       


}

Мой верхний уровень Parent pojo:

import java.io.Serializable;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.validation.constraints.NotBlank;
import com.fasterxml.jackson.annotation.JsonIdentityInfo;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonUnwrapped;
import com.fasterxml.jackson.annotation.JsonValue;
import com.fasterxml.jackson.annotation.ObjectIdGenerators;
import lombok.Data;


@Entity
@Table(name="parent")
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
public class Parent implements Serializable {

    private static final long serialVersionUID = 1L; 

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name = "_id", updatable = false, nullable = false)
    private Long id;

    .
    .
    .
    .   

    @JsonUnwrapped
    //@JsonValue
    @OneToMany(mappedBy="parent", cascade={CascadeType.PERSIST, CascadeType.REMOVE},orphanRemoval=true)
    private List<Child> children;
}

My Child pojo:

import java.io.Serializable;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import com.fasterxml.jackson.annotation.JsonIdentityInfo;
import com.fasterxml.jackson.annotation.ObjectIdGenerators;
import lombok.Data;

@Data
@Entity
@Table(name="child")
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
public class Child implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name = "_id", updatable = false, nullable = false)
    private Long id;

    @ManyToOne
    @JoinColumn(name="parent_id", nullable=false)
    private Parent parent;

    .
    .
    .

    @JsonUnwrapped  
    @OneToMany(mappedBy = "anotherChild", cascade=CascadeType.PERSIST)
    private List<AnotherChild> moreChildren;

}

Если я изменю код выше, чтобы использовать @JsonValue над private List<Child> children в Parent pojo, я получу500 Internal Server Error и сообщение: CSV generator does not support Object values for properties (nested Objects) (through reference chain: java.util.ArrayList[0]. Можно ли вывести вложенные объекты, используя CsvMapper? Если нет, то какой обходной путь для вывода CSV вложенных объектов, включая их родительские объекты?

...