java - 在 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调用(序列化)中发生的一样?
解决方案
因此,我没有使用 objectMapper 和 DTO,而是将传递给以下内容的 json 更改为:
{
"name":"chocolate",
"manufacturer": {"id":2}
}
感谢@Lkopo 的提示 - 在架构方面,最好创建 DTO 以传输数据。
DTO 的完整示例 - https://github.com/marielcherkassky/simple_spring_boot_jpa_project
推荐阅读
- c# - 如何停止启用 Windows 10 功能“焦点辅助”?
- c# - 使用 Sevenzip 提取 .7Z 文件不适用于 >1GB 的较大文件
- python - DEAP:使个人的适应度取决于整个人口
- javascript - 在数据库(mysql)中存储位置坐标
- reactjs - Use Typescript in ReactJs
- java - How to make Thread/Job wait until the previous Job is finished and thereafter resume it on some Notification
- python - Splitting list of nested json to multiple columns
- django - 有没有办法在 django-mdeditor 中更改语言
- django - How can I render a template and link to a particular section of the page?
- c# - 下拉菜单未加载到所选项目