首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >找不到按名称限定的Mapstruct

找不到按名称限定的Mapstruct
EN

Stack Overflow用户
提问于 2022-02-21 02:39:11
回答 3查看 3K关注 0票数 0

我有一个Post实体和一个Post,目前正在尝试将DTO映射到实体,但是它给了我一个Qualifier error. No method found annotated with @Named#value: [ getUserByUsername ]. --任何帮助都会非常感谢,这些是我当前的文件:

PostDTO:

代码语言:javascript
运行
复制
@Getter
@Setter
public class PostDTO {

    private String author;

    @Size(max = 755)
    private String content;

}

员额实体:

代码语言:javascript
运行
复制
@Entity
@Table(name = "POST")
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class Post {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @NotNull
    @ManyToOne(fetch = FetchType.EAGER, cascade= CascadeType.ALL)
    @JoinColumn(name = "POSTS")
    private User author;

    @Column(name = "POSTED_AT", nullable = false)
    private LocalDateTime dateTime;

    @Size(max = 755)
    @Column(name = "CONTENT", nullable = false, length = 755)
    private String content;

}

PostMapper:

代码语言:javascript
运行
复制
@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE, uses = {MappingUtil.class, PostRepository.class})
public interface PostMapper {

    // since the author attribute on postDTO is a String, we use mapstruct to find
    // within our database the matching user to that username and return the user object
    @Mapping(source = "author", target = "author", qualifiedByName = {"getUserByUsername"})
    Post toEntity(PostDTO postDTO);

    PostDTO toDTO(Post post);

}

MappingUtils:

代码语言:javascript
运行
复制
@Component
public class MappingUtil {

    private final UserRepository userRepository;

    MappingUtil(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    @BeanMapping(qualifiedByName = "getUserByUsername")
    public User getUserByUsername(String username){
        return userRepository.findByUsername(username);
    }

}

因此,每当我运行构建时,映射程序都找不到@Named注释,getUserByUsername方法在MappingUtil类上使用,我尝试了几种方法,但似乎无法修复它

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-03-01 20:31:57

注释@BeanMapping无助于您。使用@Name代替,错误就会消失。

代码语言:javascript
运行
复制
@Named("getUserByUsername")
public User getUserByUsername(String username) {
    return userRepository.findByUsername(username);
}

此外,还需要一个映射来将用户转换为UserName in toDTO( post ),如下所示:

代码语言:javascript
运行
复制
@Mapping(source = "author.userName", target = "author")
PostDTO toDTO(Post post);
票数 1
EN

Stack Overflow用户

发布于 2022-02-21 13:00:27

代码语言:javascript
运行
复制
@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE, uses = {MappingUtil.class, PostRepository.class})
public interface PostMapper {

    // since the author attribute on postDTO is a String, we use mapstruct to find
    // within our database the matching user to that username and return the user object
    @Mapping(source = "author", target = "author", qualifiedByName = "getUserByUsername")
    Post toEntity(PostDTO postDTO);

    PostDTO toDTO(Post post);

}

@Component
public class MappingUtil {

    private final UserRepository userRepository;

    MappingUtil(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    @Named("getUserByUsername")
    public User getUserByUsername(String username){
        return userRepository.findByUsername(username);
    }

}

请您尝试在您的方法上使用@Named注释吗?这将有助于map-struct找到映射字段所需的方法。

票数 1
EN

Stack Overflow用户

发布于 2022-02-23 09:06:31

包私有构造函数?尝试将public添加到构造函数中:

代码语言:javascript
运行
复制
public MappingUtil(UserRepository userRepository) {
        this.userRepository = userRepository;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71200652

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档