Как использовать @ModelAttribute только для некоторых полей в классе

Рейтинг: -1Ответов: 1Опубликовано: 02.02.2023

У меня есть класс User в которым есть все поля, которые описывают пользователя.

Вот кусочек кода для примера:

...

@NotBlank
@Size(min = 2, max = 20)
private String username;

@NotBlank
@Size(min = 5)
private String password;

@Transient
private String passwordConfirm;

private boolean enabled = false;

@Email
@NotBlank
private String email;

...

Что бы реализовать функцию смена пароля, мне нужно использовать только поля password и passwordConfirm.

Вот пример методов в контроллере:

@RequestMapping("/form/password")
private String formPassword(
        @RequestParam(value = "username", required = true) String username,
        Model model
) {

    model.addAttribute("user", userService.findUserByUsername(username));

    return "user/passwordForm";
}

@RequestMapping("/change/password")
private String changePassword(
        @Valid
        @ModelAttribute("user") User user,
        BindingResult result
) throws Exception {

    if (result.hasErrors()) {
        log.log(Level.INFO, "my errors" + result.getAllErrors());
        return "user/passwordForm";
    }

    // code

    return "redirect:/profile?username=" + user.getUsername();
}

Так как форма дял смены пароля у меня связана с классом User, то я получу ошибку о том, что username, email не заполнены. Как это обойти?

Ответы

▲ 0

Первое на что я обратил внимание это поле private String passwordConfirm; в сущности. Не могу понять зачем она, если ты хочешь что бы у тебя на фронте проверялось правильность ввода, то проверяй на фронте в форме(тем же js проверь правильность после чего дай возможность отправить форму)

Второе, это то что ты (даже не смотря на то что ты заполняешь только два поля) отправляешь всю модель твоего пользователя, поэтому он и ругается то что у тебя обязательные поля не заполненные, тебе нужно либо в методе их добавить, либо отправлять с фронта полную модель.

Далее проблема в том что работать с сущностями это плохая практика, используй DTO. И прочитай про http методы, потому что вот так :

@RequestMapping("/change/password")

@RequestMapping("/form/password")

Это не очень красиво, гораздо лучше и понятнее:

@GetMapping("/user")
@PostMapping("/user")
@PutMapping("/user")
@DeleteMapping("/user")

Get - получение пользователя Post - создание пользователя (отправка) Put - изменение пользователя Delete - удаление пользователя