Я пытаюсь сгенерировать файл 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 вложенных объектов, включая их родительские объекты?