Java 请求主体作为某些DTO列表的Spring控制器修补程序操作

Java 请求主体作为某些DTO列表的Spring控制器修补程序操作,java,spring-boot,spring-data-jpa,patch,modelmapper,Java,Spring Boot,Spring Data Jpa,Patch,Modelmapper,我有DTO列表作为spring控制器的请求主体,这是一个补丁操作。 修补看起来很好 -->我会反复浏览这个列表 -->得到每个DTO -->获取JPA的findOne(id)方法返回的实体对象 -->现在我遇到了一个问题,就是检查字段值是否不为null,然后将其设置为实体,否则什么也不做 -->我不想检查每个字段的空值,并将其设置为附加的实体,所以我在这里使用ModelMapper。请查找下面的代码 ModelMapper modelMapper = new ModelMappe

我有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
我必须获取用户名,调用实用程序方法从用户名中获取userID,然后将这个userID值设置为someEntity.userID

类似地,我还有几个字段,在将其设置为实体之前,我必须对这些字段进行一些预处理


我能做到这一点的最佳方法是什么?

您可以对DTO类使用JavaBean验证,并使用
@Valid@RequestBody
,有关更多详细信息,请查看
查看
转换器。使用convert,您可以从用户名中提取用户ID并将其设置为实体:

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