2015-03-11 5 views
1

Я пытаюсь реализовать авторизацию пользователя на java ee 7. Для проверки введенных данных я использую аннотации Bean validation.java ee bean validation

@NotNull(message = "Please enter email address") 
    @Column(name = "email") 
    private String email; 

    @NotNull(message = "Please enter password") 
    @Size(min = 6, max = 255) 
    @Column(name = "password") 
    private String password; 

Также у меня есть @PrePersist метод, который хэш введенный пароль

@PrePersist 
    public void updatePassword(String password) { 
     //some code 
    } 

Вот метод, где зарегистрировать пользователя:

@EJB 
private UserService userService; 

public void register() { 
     if (userService.getByEmail(email) == null) { 
      try { 
       userService.register(email, password); 

       //log in if users is created 
       authController.setEmail(email); 
       authController.setPassword(password); 
       authController.login(); 
      } catch (Exception e) { 
       setErrorMessage("Validation error"); 
      } 
     } else { 
      setErrorMessage("Please choose another email address"); 
     } 
    } 

UserService

@Stateless 
public class UserService { 

    @EJB 
    private UserDAO userDAO; 

    public void register(String email, String password){ 
     User user = new User(); 
     user.setEmail(email); 
     user.setPassword(password); 
     userDAO.create(user); 
    } 
} 

Проблема заключается в том если пароль равен нулю. Сначала был вызван метод updatePassword, но не @NotNull аннотация по password field и, следовательно, я получаю NullPointerException.. Как сделать это при первой проверке проверки, а затем позже других методах. Заранее спасибо!

+0

Некоторые код здесь отсутствует. Покажите 'userService.register' и где вы вводите эту услугу. – Everv0id

+0

Everv0id, я отредактировал мой вопрос – user3127896

ответ

1

Кажется, что проверка бобов не запускается достаточно скоро.

Одним из способов решения этой задачи является внедрение ValidatorFactory в UserService, а затем проверка объекта пользователя после его создания. Что-то вроде этого:

@Stateless 
public class UserService {  

    @EJB 
    private UserDAO userDAO; 

    @Inject 
    private ValidatorFactory validatorFactory; 

    public void register(String email, String password){ 
     User user = new User(); 
     user.setEmail(email); 
     user.setPassword(password); 

     Set<ConstraintViolation<User>> constraintViolations = validatorFactory.getValidator().validate(user); 
     if(constraintViolations.size() > 0){ 
      // handle error 
     }else{ 
      userDAO.create(user); 
     } 
    } 
} 

это answer может быть полезным для уточнения