The type of parameter "userRegisterDto" has no property named "role". Please define the source property explicitly

Всем привет! Возникла проблема с mapstruct, который просит добавить в UserRegisterDto поле для роли и актива при ее конвертации в сущность, но по заданию мне нужно задать эти поля с помощью qualifiedByName в аннотации @Mapping, уже 3 дня борюсь с этой проблемой

Dto класс:

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class UserRegisterDto {
    private String firstName;
    private String lastName;
    private String email;
    private String password;
}

Класс юзера

    @ToString
    @Getter
    @Setter
    @NoArgsConstructor
    @AllArgsConstructor
    @Builder
    @Entity
    @Table(name = "users")
    public class User implements UserDetails {
    
        @Id
        @GeneratedValue(generator = "user_seq")
        private Long id;
    
        @Column(name = "email", unique = true)
        private String email;
    
        @NotNull
        @Column(name = "first_name")
        private String firstName;
    
        @NotNull
        @Column(name = "last_name")
        private String lastName;
    
        private LocalDate dateOfBirth;
    
        @Column(name = "about")
        private String about;
    
        @Column(name = "status")
        private String status;
    
        @Column(name = "image")
        private String avatar;
    
        @Column(name = "password")
        private String password;
    
        @Column(name = "education")
        private String education;
    
        @Column(name = "city")
        private String city;
    
        @NotNull
        @ManyToOne(fetch = FetchType.LAZY, targetEntity = Active.class)
        @JoinColumn(name = "active_id", nullable = false)
        private Active active;
    
        @Getter(AccessLevel.NONE)
        @Column(name = "is_enable")
        @Type(type = "org.hibernate.type.NumericBooleanType")
        private Boolean isEnable = false;
    
        @Column(name = "persist_date", nullable = false, updatable = false)
        @Type(type = "org.hibernate.type.LocalDateTimeType")
        @CreationTimestamp
        private LocalDateTime persistDate;
    
        @NotNull
        @ManyToOne(fetch = FetchType.LAZY, targetEntity = Role.class)
        @JoinColumn(name = "role_id", nullable = false)
        private Role role;

//Дальше идут методы UserDetails
}

Класс маппера

@Mapper(componentModel = "spring")
public abstract class UserMapper {
    protected PasswordEncoder passwordEncoder;
    protected RoleService roleService;
    protected ActiveService activeService;

    @Autowired
    public void setPasswordEncoder(PasswordEncoder passwordEncoder) {
        this.passwordEncoder = passwordEncoder;
    }

    @Autowired
    public void setRoleService(RoleService roleService) {
        this.roleService = roleService;
    }

    @Autowired
    public void setActiveService(ActiveService activeService) {
        this.activeService = activeService;
    }

    @Mapping(target = "role", qualifiedByName = "findRoleByName")
    @Mapping(target = "active", qualifiedByName = "findByActiveByName")
    @Mapping(target = "password", expression = "java(passwordEncoder.encode(userRegisterDto.getPassword()))")
    public abstract User toUser(UserRegisterDto userRegisterDto);

    @Named("findRoleByName")
    protected Role findRoleByName(String name) {
        Optional<Role> role = roleService.findByName(name);
        return role.isEmpty() ? null : role.get();
    }

    @Named("findActiveByName")
    protected Active findActiveByName(String name) {
        Optional<Active> active = activeService.findByName(name);
        return active.isEmpty() ? null : active.get();

    }

}

Если закомментировать два этих маппинга приложение запускается но при взаимодействии с этим маппером падает Подскажите, пожалуйста, что мне делать


Ответы (1 шт):

Автор решения: Николай Скородумов

У вас @Autowired висит в классе маппера, при этом сам клас не помечен аннотацией @Component. Как минимум в этом уже непорядок

→ Ссылка