@Timak31
студент

Срабатывает только один сеттер?

Только не бейте.
Через конструктор при создании обьекта вызываю сеттер на password and username, пароль создает а username нет...

Код энтити класса:
@Entity
@Table(name = "users")
@NoArgsConstructor
@Getter
@Setter
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;
    private String name;
    private String email;
    private String password;
    private String userName;

    public User(String name, String email, String password) {
        this.name = name;
        this.email = email;
        setUserName(email);
        setPassword(password);
    }

    private void setUserName(String email) {
        this.userName = email.split("@")[0];
        LoggerFilter.logger.info("User.java: set user name;");
    }

    private void setPassword(String password) {
        this.password = BCrypt.hashpw(password, BCrypt.gensalt());
        LoggerFilter.logger.info("User.java: set password;");
    }
}


Логгер:
5c79c31521545774178787.png

Если отдельный методом вызывать сеттер на username, то работает.
@PostMapping("sign-up")
    public void signUp(@RequestBody User user) {
        
        user.setUserName(user.getEmail());
        
        userRepository.save(user);

    }

Подскажите пожалуйста, в чем проблема, почему я не могу вызвать второй сеттер?
Спасибо за помощь!
  • Вопрос задан
  • 131 просмотр
Пригласить эксперта
Ответы на вопрос 2
@C4ET4uK
Паучье чуть мне подсказывает, что не стоит тащить Lombok куда не попадя. По этой аннотации @NoArgsConstructor
создается конструктор без аргументов. Соответственно при создании бина вызывается он, а не ваш перегруженный. Так же рискну предположить что параметр userName вы не передаете, соответственно и setter для него не вызывается.
Имхо правильный ответ: вызывается не тот конструктор.
Ответ написан
Комментировать
jaxtr
@jaxtr
JavaEE/Spring-разработчик
Как уже написал C4ET4uK, проблема с вызовом не того конструктора.
Hibernate создаёт объект с помощью конструктора по умолчанию, затем при помощи set-методов устанавливает значения свойствам объекта. Соответственно, Hibernate не использует твой конструктор для создания объекта.
Если у тебя не хранится в БД значение свойства userName (в колонке user_name оответственно), то Hibernate метод setUserName тоже никогда не вызовет.
Как вариант можно в setEmail добавить вызов setUserName.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы