gpt4 book ai didi

java - 如果 Dto 使用 MapStruct 具有 Id,则将 dto 映射到从数据库检索的实体

转载 作者:行者123 更新时间:2023-12-03 20:18:45 24 4
gpt4 key购买 nike

我正在使用 map 结构 制作 dto <-> entity映射。相同的映射器用于创建 从 dtos 更新实体。对 dto 的 id 进行验证以了解是必须创建新实体 (id == null) 还是应该从数据库中检索它 (id != null)。

我实际上在使用 MapperDecorator作为解决方法。例子 :

映射器

@Mapper
@DecoratedWith(UserAccountDecorator.class)
public interface UserAccountMapper {

UserAccountDto map(User user);

User map(UserAccountDto dto);

User map(UserAccountDto dto, @MappingTarget User user);
}

装饰器
public abstract class UserAccountDecorator implements UserAccountMapper {

@Autowired
@Qualifier("delegate")
private UserAccountMapper delegate;

@Autowired
private UserRepository userRepository;

@Override
public User map(UserAccountDto dto) {
if (dto == null) {
return null;
}

User user = new User();
if (dto.getId() != null) {
user = userRepository.findOne(dto.getId());
}

return delegate.map(dto, user);
}

}

但是由于必须为每个映射器创建一个装饰器,所以这个解决方案变得很繁重。

有什么好的解决方案来执行吗?

我正在使用 :
  • map 结构: 1.1.0
  • 最佳答案

    我按照 Gunnar 的建议解决了我的问题在 comment .

    我搬到了MapStruct 1.2.0.Beta1并创建了一个 UserMapperResolver 如下所示

    @Component
    public class UserMapperResolver {

    @Autowired
    private UserRepository userRepository;

    @ObjectFactory
    public User resolve(BaseUserDto dto, @TargetType Class<User> type) {
    return dto != null && dto.getId() != null ? userRepository.findOne(dto.getId()) : new User();
    }

    }

    然后我在我的 UserMapper 中使用:
    @Mapper(uses = { UserMapperResolver.class })
    public interface BaseUserMapper {

    BaseUserDto map(User user);

    User map(BaseUserDto baseUser);

    }

    生成的代码现在是:
    @Override
    public User map(BaseUserDto baseUser) {
    if ( baseUser == null ) {
    return null;
    }

    User user = userMapperResolver.resolve( baseUser, User.class );

    user.setId( baseUser.getId() );
    user.setSocialMediaProvider( baseUser.getSocialMediaProvider() );
    ...
    }

    效果很好 !

    关于java - 如果 Dto 使用 MapStruct 具有 Id,则将 dto 映射到从数据库检索的实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42367081/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com