我正在Java应用程序中使用ModelMapper
将DTO转换为POJO。
我有一个类MyObjectDto
,必须将其转换为MyObject
才能用作实体并发送到数据库。
在一个用例中,我收到带有MyObjectDto
属性的id
,它将告诉我的ORM我必须更新数据库中的现有实体。此用例可以正常工作。
现在,我有另一个用例,除了要在数据库中创建一个新的MyObjectDto
之外,我还收到相同的id
。我认为,可以起作用的一件事是使用特定的映射,在该映射中跳过create
属性以使我的ORM理解这是update
操作而不是public <D> D map(Object source,
Class<D> destinationType,
String typeMapName)
。 / p>
我认为以下方法可以解决我的问题:
@Bean
public ModelMapper modelMapper() {
ModelMapper modelMapper = new ModelMapper();
TypeMap<MyObjectDto, MyObject> typeMapForNew = modelMapper.createTypeMap(MyObjectDto.class, MyObject.class)
.addMappings(mapping -> mapping.skip(MyObject::setId));
return modelMapper;
}
除了我不知道如何使用它。到目前为止,我试图做到这一点:
myObject = modelMapper.map(myObjectDto, MyObject.class, "typeMapForNew");
此方法位于配置内部。然后我想我会这样称呼它,但是它给出了一个正常的映射:
@Bean
public ModelMapper modelMapper() {
ModelMapper modelMapper = new ModelMapper();
modelMapper.createTypeMap(MyObjectDto.class, MyObject.class, "typeMapForNew")
.addMappings(mapping -> mapping.skip(MyObject::setId));
return modelMapper;
}
感谢阅读。
编辑:对于此特定示例,我在配置类中做错了。我应该这样做:
urllib
然后,我可以使用命名映射,并且可以使用。现在,我需要了解如何跳过对象子实体的ID字段。但是原来的问题已经解决了。
答案 0 :(得分:0)
按照REST准则,您完全不应在DTO中发送id
。
创建:
@POST
/rest/items
{ ...dto... } -> mapper -> Entity with null id -> save
更新:
@PUT
/rest/items/{id}
{ ...dto... } -> mapper -> Entity with null id -> set id from URL -> save