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. Как минимум в этом уже непорядок