首页 > 解决方案 > 在 POST 映射中使用杰克逊而不是 DTO?

问题描述

我有以下一对多关系:

public class Product {
        @Id
        @SequenceGenerator(name = "product_id_seq", sequenceName = "product_id_seq")
        @GeneratedValue(strategy= GenerationType.SEQUENCE,generator = "product_id_seq")
    private Long pid; // initiate it for just a random value in order to hanlde hibernate bug

    @Id
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name="manufacturer",referencedColumnName = "id")
    @JsonIdentityInfo(generator= ObjectIdGenerators.PropertyGenerator.class, property="id")
    @JsonIdentityReference(alwaysAsId=true)
    private Manufacturer manufacturer;

   private String name;
   ......more data members...

和制造商:

public class Manufacturer {
    @Id
    @SequenceGenerator(name = "manufacturer_id_seq", sequenceName = "manufacturer_id_seq")
    @GeneratedValue(strategy=GenerationType.SEQUENCE,generator = "manufacturer_id_seq")
    private Long id;
    private String name;
    private String country;
    @OneToMany(mappedBy = "manufacturer",fetch = FetchType.LAZY,cascade = CascadeType.ALL, orphanRemoval = true)
    private List<Product> products;

}

我的 POST 正文包含以下 json :

{
    "name":"chocolate",
    "manufacturer": 2,

}

现在我正在使用 DTO 和映射函数将 productDTO 映射到产品:

public class ProductCreationDTO {
    private String name;
    private Long manufacturer;
}

private Product mapProductCreationDTOtoProduct(ProductCreationDTO pcd)
{
    Product p = modelMapper.map(pcd,Product.class); // maps fields with same name that arent nested(like manufacturer)
    Optional<Manufacturer> o = manufacturerService.getManufacturer(pcd.getManufacturer());
    o.ifPresent(m->p.setManufacturer(m));
    return p;
}

通过在 Product 类中的制造商 obj 上方添加这两个注释,我成功地在对象的 get 调用中进行了此转换:

@JsonIdentityInfo(generator= ObjectIdGenerators.PropertyGenerator.class, property="id")
@JsonIdentityReference(alwaysAsId=true)

有没有办法使用jackson(注释)将post json映射到产品对象(反序列化)中,就像在rest get调用(序列化)中发生的一样?

标签: javarestjackson

解决方案


因此,我没有使用 objectMapper 和 DTO,而是将传递给以下内容的 json 更改为:

{
    "name":"chocolate",
    "manufacturer": {"id":2}

}

感谢@Lkopo 的提示 - 在架构方面,最好创建 DTO 以传输数据。

DTO 的完整示例 - https://github.com/marielcherkassky/simple_spring_boot_jpa_project


推荐阅读