2016-08-03 2 views
0

Я написал службу регистрации пользователей, которая должна выбросить исключение, если пользователь уже существует. Вот код для метода регистра:Java Exception не выбрасывается

public User register(User user, String role) throws UserExistsException{ 
    boolean userExists = existUserInDB(user); 
    if(userExists) { 
     logger.info("Yes, this user exists!"); 
     throw new UserExistsException("This user already exists in database!"); 
    } 

    try { 

     String encryptedPassword = getEncryptedPassword(user.getPassword(), getSalt(user)); 
     user.setPassword(encryptedPassword); 

     Role userRole; 

     if (role == null){ 
      TypedQuery<Role> query = entityManager.createQuery(
        "SELECT r "+ 
        "FROM Role r "+ 
        "WHERE rolename = 'User'", Role.class); 
      userRole = query.getSingleResult(); 
     } else { 
      TypedQuery<Role> query = entityManager.createQuery(
        "SELECT r "+ 
        "FROM Role r "+ 
        "WHERE rolename = '"+role+"'", Role.class); 
      userRole = query.getSingleResult(); 
     } 

     user.getRoles().add(userRole); 
     userRole.getUsers().add(user); 

     entityManager.persist(userRole); 
     entityManager.persist(user); 

    } catch (NoSuchAlgorithmException | NoSuchProviderException e) { 

     logger.warning("CryptAPI faild: " + e.getMessage()); 

    } 

    return user; 
} 

Каротажные подтверждает, что метод existUserInDB возвращает правильное логическое значение. Данный пользователь существует в базе данных. Но исключение никогда не бросается. У меня есть много самоисполненных исключений в моем приложении, которые все выбрасываются и вылавливаются правильно. Все, кроме этого. Может ли кто-нибудь помочь мне с этим?

И вот код, который я называю методом регистрации.

public String register() { 
    regUser.setEmail(this.emailAdd); 

    try { 

     userService.register(regUser, userRole); 
     FacesContext context = FacesContext.getCurrentInstance(); 
     context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,"Der Benutzer wurde erfolgreich registriert.", null)); 
     context.getExternalContext().getFlash().setKeepMessages(true); 


    } catch (UserExistsException e) { 
     FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,"Der Benutzer ist bereits registriert!", null)); 
    } 
    curSession.setCurrentUser(regUser); 
    init(); 
    return "home.xhtml?faces-redirect=true"; 
} 

А вот определение класса, за исключением:

public class UserExistsException extends Exception { 

private static final long serialVersionUID = -9218609941894034576L; 

public UserExistsException(){ 
    super(); 
} 

public UserExistsException(String message){ 
    super(message); 
} 

} 
+0

Какое исключение должно быть выбрано где? И если все правильно, зачем его бросать? – Thomas

+1

Эта линия напечатана? 'logger.info (« Да, этот пользователь существует! »);' – Azodious

+0

И покажите код, в котором вы ожидаете этого исключения. то есть от того, где вызывается 'register'? – Azodious

ответ

0

С помощью всего вышеописанного я смог его решить. Проблема не была исключена. Извините за неправильное название. Проблема заключалась в переадресации, которую я получил в операторе return вызывающего метода. Так что мой FacesMessage потерялся. Я установил его следующими строками в пункте загвоздка:

 FacesContext context = FacesContext.getCurrentInstance(); 
     context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,"Der Benutzer existiert bereits.", null)); 
     context.getExternalContext().getFlash().setKeepMessages(true); 

Спасибо всем лицам выше для направления меня на правильный путь.

1

Проблема может быть Int строку ниже, что не будет делать правильные вещи, которые вы хотите.

catch (UserExistsException e) { 
      FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,"Der Benutzer ist bereits registriert!", null)); 
    } 

Вы можете проверить, что код выполняется вот так:

catch (UserExistsException e) { 
    System.out.println(">>>>>>>>>>>>>>>>>>"); 
    FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,"Der Benutzer ist bereits registriert!", null)); 
     } 

Если строка печатается, то это означает, что исключение было брошено. Но остальная часть кода не делала то, от чего вы хотите.

+0

Большое спасибо. Строка печатается, поэтому исключение, как вы сказали, выбрасывается. Я также могу подтвердить это сейчас в отладчике.Моя единственная проблема - это визуализация сообщения об ошибке. – Raistlin

Смежные вопросы