当前位置: 首页 > 知识库问答 >
问题:

ModelMapper未映射Spring实体属性

穆博简
2023-03-14

我目前正在尝试使用ModelMapper的映射方法执行实体到DTO的映射。在最深的属性映射上,映射结果为null,但它应该是一个对象。

以下是我的映射源实体(省略brevety的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(省略brevety的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);
}

My clientService正确返回数据,但JSON响应上的“product”属性为空,不应为:

{
    "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
                },
...

有人能帮我吗?

共有2个答案

西门嘉石
2023-03-14

正如M.Deinum在下面的评论中所说,on InvoiceItemDTO产品属性应命名为“product”,而不是“productDTO”。现在它可以正常工作了

元彦君
2023-03-14

你不应该把@Entity放在你的课之前吗?就像这样:

@Entity
public class MyClass {
...
}
 类似资料:
  • 我正在使用模型映射器(http://modelmapper.org/)将具有延迟加载对象列表(通过Hibernate)的实体映射到具有modelmapper.map()的DTO。 输出dto的列表为空值,但实体的列表已填充。当我改为“急切加载”时,一切正常,但我的查询太大,所以这不是一个选项。 有人知道模型映射器如何映射代理的Hibernate实体类吗? 这是我的父实体: 运输署署长: 这是我如何

  • 我在Kotlin-vertx项目中配置了Hibernate,我设法设置了所有内容,但当我运行HQL查询时,它会输出: 提前谢了。

  • 早上好 我正在使用ModelMapper将DTO映射到实体,反之亦然,与此相关,我有一个问题。 1)当我从SonController获取SonDTO时,我需要将长的motherId映射到实体Son,但在那里我有实体mothermother来建立关系,它在内部有id。那么我如何将这个SonDTO motherId映射到实体mothermother中,反之亦然? 类以下:

  • 我与ModelMapper框架有麻烦。请解释为什么我看到以下行为。 我在build.gradle有以下依赖性 和一个类客户: 我还有一个地图绘制工具: 还有一个测试 在fred()中,方法输出是非红色的“Customer{name=fred,age=40}”(“Customer{name=null,age=40}”)。你能解释一下为什么吗?为什么我在第一个方法中看不到输出“George”?

  • 我有一个父类和子类,其各自的DTO如下 当我试图将父映射到父映射到父映射到父映射时,我得到了堆栈溢出错误。 请帮我解决这个问题。

  • 问题内容: 我正在使用Spring MVC框架编写简单的博客Web应用程序。我愿意为我的应用添加图层。 我决定使用ModelMapper框架从对象转换为视图中使用的对象。 我只有一个问题。在我的主页上,我正在显示博客中的帖子列表。在我看来,这只是(实体)对象的列表。我想更改它以将对象列表传递给我的视图。有没有什么办法来映射的对象的单方法调用的对象?我当时在考虑编写将对此进行转换的转换器,但是我不确