Проверка формы с сущностями - PullRequest
0 голосов
/ 01 декабря 2018

Я получил сущность класса «пользователь» с соответствующей таблицей базы данных, которая содержит много полей (идентификатор, адрес электронной почты, имя, фамилия, encryptedPassword, включен, роль).Однако, если администратор хочет добавить нового пользователя в веб-приложение, он должен только заполнить определенные поля в форме (имя, фамилия, адрес электронной почты).Остальные поля заполняются UserService.

При попытке проверить ввод формы с помощью BindingResult в классе контроллера, BindingResult содержит ошибки, в которых id, encryptedPassword, enabled и role не должны иметь значение null.Поэтому мой вопрос: каков самый модный способ проверки рабочей формы без слишком большого дублирования кода?

UserEnitity:

@Data
@Entity
@Table(name = "user")
public class User {
    @Id
    @GeneratedValue
    @Column(name = "user_id")
    private Long id;

    @Size(max = 60)
    @NotNull
    @Column(name = "e_mail", unique = true)
    @Email
    private String email;

    @Size(max = 60)
    @NotNull
    @Column(name = "first_name")
    private String firstName;

    @Size(max = 60)
    @NotNull
    @Column(name = "last_name")
    private String lastName;

    @Size(max = 120)
    @NotNull
    @Column(name = "encrypted_password")
    private String encryptedPassword;

    @NotNull
    @Column(name = "enabled")
    private Boolean enabled;

    @ManyToOne
    @JoinColumn(name = "role_id", nullable = false)
    private Role role;
}

Контроллер:

@Controller
@RequestMapping("employees")
public class EmployeesController {

    private UserService userService;

    @Autowired
    public EmployeesController(UserService userService) {
        this.userService = userService;
    }

    @GetMapping("/add")
    public String getAddEmployeesPage(Model model){
        model.addAttribute("user", new User());
        return "employees/add";
    }

    @PostMapping("/add")
    public String postAddEmployeesPage(@ModelAttribute @Valid User user, BindingResult bindingResult){
        if(bindingResult.hasErrors()){
            return "employees/add";
        }

        userService.addUser(user);

        return "redirect:/employees/add/?successful=true";
    }
}

Форма:

 <form action="#" th:action="@{/employees/add}" th:object="${user}" method="post">
                <div class="form-group">
                    <label th:text="#{employees.add.first_name}" for="first_name"></label>
                    <input th:placeholder="#{employees.add.first_name}" th:field="*{firstName}" type="text" class="form-control" id="first_name">
                    <p th:if="${#fields.hasErrors('firstName')}" th:errors="*{firstName}"></p>
                </div>
                <div class="form-group">
                    <label th:text="#{employees.add.last_name}" for="last_name"></label>
                    <input th:placeholder="#{employees.add.last_name}" th:field="*{lastName}" type="text" class="form-control" id="last_name">
                    <p th:if="${#fields.hasErrors('lastName')}" th:errors="*{lastName}"></p>
                </div>
                <div class="form-group">
                    <label th:text="#{employees.add.email}" for="email"></label>
                    <input th:placeholder="#{employees.add.email}" th:field="*{email}" type="email" class="form-control" id="email">
                    <p th:if="${#fields.hasErrors('email')}" th:errors="*{email}"></p>
                </div>
                <p><button th:text="#{button.submit}" type="submit" class="btn btn-primary"></button><button th:text="#{button.reset}" type="reset" class="btn btn-secondary"></button></p>
            </form>

1 Ответ

0 голосов
/ 01 декабря 2018

Попробуйте это:

import javax.validation.Validator;
import javax.validation.ConstraintViolation;
@Controller
@RequestMapping("employees")
public class EmployeesController {

  private UserService userService;
  private Validator validator;

  @Autowired
  public EmployeesController(UserService userService, Validator validator) {
        this.userService = userService;
        this.validator = validator;
    }

  @GetMapping("/add")
  public String getAddEmployeesPage(Model model){
        model.addAttribute("user", new User());
        return "employees/add";
    }

  @PostMapping("/add")
  public String postAddEmployeesPage(@ModelAttribute @Valid User user, BindingResult bindingResult){
        if(bindingResult.hasErrors()){
            return "employees/add";
        }
        if(!validateUserForm(user)){
          return "some error message";
        }
        userService.addUser(user);

        return "redirect:/employees/add/?successful=true";
    }

  private boolean validateUserForm(User user){

     Set<ConstraintViolation<User>> violations = validator.validate(user);
     if (!violations.isEmpty()) {
       for (ConstraintViolation<User> violation : violations) {
        // log violation.getMessage();
      }
      return false;
    }
    return true;
}
    }

В контроллер добавлен приватный метод, который вы можете вызывать для проверки вашего объекта на соответствие ограничениям вашего бина сущности.Я бы порекомендовал перенести эту проверку на уровень обслуживания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...