ModelMapper-如何使用地图(来源,destination.class,typeMapName)?

时间:2019-07-03 16:26:52

标签: java deserialization

我正在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字段。但是原来的问题已经解决了。

1 个答案:

答案 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