【问题标题】:Spring Controller Patch Operation with RequestBody as list of some DTOSpring Controller Patch Operation 使用 RequestBody 作为一些 DTO 的列表
【发布时间】:2020-05-20 12:29:19
【问题描述】:

我有一个 DTO 列表作为请求体到 spring 控制器,这是一个补丁操作。 修补看起来很简单,

--> 我会遍历列表

--> 获取每个DTO

--> 获取JPA的findOne(id)方法返回的实体对象

--> 现在这里有一个问题,就是检查字段值是否不为null,然后设置为实体,否则什么都不做

--> 我不想检查每个字段的空值并将其设置为附加的实体,所以我在这里使用了ModelMapper。请找到以下代码

        ModelMapper modelMapper = new ModelMapper();
        modelMapper.getConfiguration().setPropertyCondition(Conditions.isNotNull());
        modelMapper.map(someDO, someEntity);  //someEntity is the one returned by findOne
        tltMasterRepository.save(someEntity);

--> null 值的问题解决了。在将其设置为附加实体之前,我不必显式检查空值。

--> 但我现在还有一些要求。对于一些字段,我想在将其设置为附加实体之前执行一些操作并获取一些值。 例如.. someDo.username & someEntity.userID
我必须获取用户名,调用实用程序方法从用户名中获取用户 ID,然后将此用户 ID 值设置为 someEntity.userID。

同样,我还有一些字段需要在将其设置为实体之前进行一些预处理?

我能做到的最好方法是什么?

【问题讨论】:

    标签: java spring-boot spring-data-jpa patch modelmapper


    【解决方案1】:

    看看Converter。通过转换,您可以从用户名中提取 userId 并将其设置为实体:

    ModelMapper modelMapper = new ModelMapper();
    modelMapper.getConfiguration().setPropertyCondition(Conditions.isNotNull());    
    Converter<String, String> userIdConverter = ctx -> ctx.getSource() == null ? null : Utils.extractUserId(ctx.getSource());
    modelMapper.typeMap(SomeDO.class, SomeEntity.class).addMappings(mapper -> mapper.using(userIdConverter).map(SomeDO::getUsername, SomeEntity::setUserId));
    modelMapper.map(someDO, someEntity);
    tltMasterRepository.save(someEntity);
    

    【讨论】:

      【解决方案2】:

      您可以将 Java bean 验证与 DTO 类一起使用并使用 @Valid @RequestBody,有关更多详细信息,请查看 https://www.baeldung.com/javax-validation

      【讨论】:

        猜你喜欢
        • 2011-10-25
        • 2020-09-05
        • 1970-01-01
        • 2016-11-22
        • 1970-01-01
        • 2018-03-16
        • 1970-01-01
        • 2020-04-11
        • 1970-01-01
        相关资源
        最近更新 更多