我有一个Post实体和一个Post,目前正在尝试将DTO映射到实体,但是它给了我一个Qualifier error. No method found annotated with @Named#value: [ getUserByUsername ].
--任何帮助都会非常感谢,这些是我当前的文件:
PostDTO:
@Getter
@Setter
public class PostDTO {
private String author;
@Size(max = 755)
private String content;
}
员额实体:
@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:
@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:
@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类上使用,我尝试了几种方法,但似乎无法修复它
发布于 2022-03-01 20:31:57
注释@BeanMapping无助于您。使用@Name代替,错误就会消失。
@Named("getUserByUsername")
public User getUserByUsername(String username) {
return userRepository.findByUsername(username);
}
此外,还需要一个映射来将用户转换为UserName in toDTO( post ),如下所示:
@Mapping(source = "author.userName", target = "author")
PostDTO toDTO(Post post);
发布于 2022-02-21 13:00:27
@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找到映射字段所需的方法。
发布于 2022-02-23 09:06:31
包私有构造函数?尝试将public
添加到构造函数中:
public MappingUtil(UserRepository userRepository) {
this.userRepository = userRepository;
}
https://stackoverflow.com/questions/71200652
复制相似问题