2016-08-03 18 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方法が正しいブール値を返すこと:ここで、レジスタメソッドのコードです。指定されたユーザーがデータベースに存在します。しかし例外は投げられません。 私は多くの自己実装例外をすべてアプリケーションに投げ込み、正しくキャッチしました。これ以外のすべて。誰か助けてくれますか?

次に、私がregisterメソッドを呼び出すコードを示します。

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

問題は多分その下の行は、あなたがしたい物事を正しく行うことはありませんint型。行が印刷された場合、それは例外がスローされたことを意味し

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

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

あなたはこのように、ここで実行されるコードを確認することができます。しかし、コードの残りの部分は、あなたが望むものを実行しませんでした。

+0

ありがとうございます。行は印刷されているので、あなたが言ったように、例外がスローされます。デバッガでこれを確認することもできます。私の唯一の問題は、エラーメッセージのレンダリングのようです。 – Raistlin

関連する問題