【发布时间】:2019-01-15 13:40:19
【问题描述】:
我目前正在尝试使用 ModelMapper 的 map 方法执行实体到 DTO 的映射。在最深的属性映射上,映射结果为空,但应该是一个对象。
这些是我的映射源实体(为简洁起见,省略了 Loombok Getter 和 Setter):
public class Client implements Serializable
{
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
public Long id;
@NotEmpty
public String name;
@NotEmpty
public String surname;
@NotEmpty
@Email
public String email;
@Column(name="creation_date", updatable=false)
@Temporal(TemporalType.DATE)
@DateTimeFormat(pattern="yyyy-MM-dd")
public Date creationDate;
public String photo;
@OneToMany(mappedBy="client", fetch=FetchType.LAZY, cascade=CascadeType.ALL, orphanRemoval=true)
public List<Invoice> invoices;
}
public class Invoice implements Serializable
{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public Long id;
@NotEmpty
public String description;
public String comment;
@Temporal(TemporalType.DATE)
@Column(name = "creation_date", updatable = false)
@DateTimeFormat(pattern = "yyyy-MM-dd")
public Date creationDate;
@ManyToOne(fetch = FetchType.LAZY)
public Client client;
@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinColumn(name = "invoice_id")
public List<InvoiceItem> items;
}
public class InvoiceItem implements Serializable
{
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
public Long id;
public Integer amount;
@ManyToOne(fetch=FetchType.EAGER)
@JoinColumn(name="product_id")
public Product product;
}
public class Product implements Serializable
{
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
public Long id;
public String name;
public Double prize;
@Temporal(TemporalType.DATE)
@Column(name="creation_date", updatable=false)
@DateTimeFormat(pattern="yyyy-MM-dd")
public Date creationDate;
}
这些是我的目标 DTO(为简洁起见,省略了 Loombok Getter 和 Setter):
public class ClientDTO implements Serializable
{
@JsonIgnore
public Long id;
public String name;
public String surname;
public String email;
@JsonIgnore
public Date creationDate;
public String photo;
}
public class ClientWithInvoicesDTO extends ClientDTO implements Serializable
{
@JsonManagedReference
public List<InvoiceDTO> invoices;
}
public class InvoiceDTO implements Serializable
{
@JsonIgnore
public Long id;
public String description;
public String comment;
public Date creationDate;
@JsonBackReference
public ClientDTO client;
public List<InvoiceItemDTO> items;
}
public class InvoiceItemDTO implements Serializable
{
@JsonIgnore
public Long id;
public Integer amount;
public ProductDTO productDTO;
}
public class ProductDTO implements Serializable
{
@JsonIgnore
public Long id;
public String name;
public Double prize;
@JsonIgnore
public Date creationDate;
}
在我的 Controller 类方法上,我正在做这样的映射:
@RequestMapping(value = "/{id}/with-invoices", method = RequestMethod.GET)
public ResponseEntity findOneWithInvoices(@PathVariable Long id)
{
Client wantedClient = this.clientService.findOneWithInvoices(id);
ClientWithInvoicesDTO wantedClientWithInvoicesDto = this.modelMapper.map(wantedClient, ClientWithInvoicesDTO.class);
return new ResponseEntity<>(wantedClientWithInvoicesDto, HttpStatus.OK);
}
我的 clientService 正在正确返回数据,但 JSON 响应中的“product”属性为 null,并且不应该是:
{
"name": "cupiditate",
"surname": "veritatis",
"email": "george.prohaska@example.com",
"photo": "ec0327a5-3de8-328c-a812-9000d6d5507d",
"invoices": [
{
"description": "Distinctio autem id vel necessitatibus unde omnis rerum. Minus maxime quos doloribus. Voluptatem amet praesentium sit magni quia molestiae. Officia aspernatur numquam ut perspiciatis a.",
"comment": "Odio enim libero tempore molestiae.",
"creationDate": "2013-02-16",
"items": [
{
"amount": 6,
"productDTO": null
},
...
谁能帮我解决这个问题?
【问题讨论】:
-
InvoiceDto上没有product。为此创建一个显式映射(不确定 ModelMapper 是否可以处理或如何处理)或将productDTO字段重命名为product。 -
哦,这就是问题所在! “productDTO”字段应为“产品”。非常感谢
标签: java spring rest spring-data-jpa modelmapper