2016-08-03 249 views
0

我寫了一個用戶註冊服務,如果用戶已經存在,應該拋出異常。下面是寄存器方法的代碼:Java不拋出異常

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迷路了。我在catch子句中用以下幾行固定它:

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

感謝所有上述人員指導我走向正確的道路。

1

問題也許詮釋低於該行不會做你想要的正確的事情。

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