2013-04-26 92 views
1

我有一個EJB來處理創建需要訪問託管bean(帳戶範圍)的客戶用戶帳戶,該託管bean用於管理用戶帳戶的用戶驗證密鑰(密鑰是暫時的,因此他們不需要通過數據庫調用來處理)。但是,我無法找到將驗證密鑰發送到EJB(生成發送給用戶的驗證電子郵件)的方法。從EJB訪問ManagedBean方法

AccountVerifierBean.java

@ManagedBean(name = "accountVerifierBean", eager = true) 
@ApplicationScoped 
public class AccountVerifierBean implements Serializable { 
    private HashMap<String, String> verificationKeyMapping; 

    public AccountVerifierBean() {} 

    public boolean verifyKey(String username, String key) { 
     return key.equals(verificationKeyMapping.get(username)); 
    } 
    public String generateKey(String username) { 
     Date time = new Date(); 
     String key = username + time.toString(); 
     key = Encryption.hashSHA(key); 
     verificationKeyMapping.put(username, key); 
     return key; 
    } 
} 

CustomerService.java

@Named 
@Stateless 
@LocalBean 
public class CustomerService { 
    @PersistenceContext(unitName = "MovieProject-ejbPU") 
    private EntityManager em; 

    private String username; 
    private String password; 

    //getters and setters 

    public void validateEmail() { 
     Properties serverConfig = new Properties(); 
     serverConfig.put("mail.smtp.host", "localhost"); 
     serverConfig.put("mail.smtp.auth", "true"); 
     serverConfig.put("mail.smtp.port", "25"); 

     try { 
      Session session = Session.getInstance(serverConfig, new Authenticator() { 
       @Override 
       protected PasswordAuthentication getPasswordAuthentication() { 
        return new PasswordAuthentication("<ACCOUNT>","<PASSWORD>"); 
       } 
      }); 
      MimeMessage message = new MimeMessage(session); 
      message.setFrom(new InternetAddress("[email protected]","VideoPile")); 
      message.addRecipient(
       Message.RecipientType.TO, new InternetAddress(username) 
      ); 
      message.setSubject("Welcome to VideoPile!"); 
      message.setContent("<p>Welcome to VideoPile, Please verify your email.</p><p>" + verifierKey + "</p>", "text/html; charset=utf-8"); //verifierKey is what I'm trying to get from AccountVerifierBean. 
      Transport.send(message); 
     } 
     catch (MessagingException ex){ 
      Logger.getLogger(CustomerService.class.getName()).log(Level.SEVERE, null, ex); 
     } 
     catch (Exception e) { 
      Logger.getLogger(CustomerService.class.getName()).log(Level.SEVERE, null, e); 
     } 
    } 

    public String encrypt(String password) { 
     try { 
      return new  String(Base64.encode(MessageDigest.getInstance("SHA").digest(password.getBytes()))); 
     } catch (NoSuchAlgorithmException ex) { 
      Logger.getLogger(CustomerService.class.getName()).log(Level.SEVERE, null, ex); 
      return null; 
     } 
    } 
} 

我試過@注入,@ManagedProperty,使用應用程序的地圖,並使用ELContext。似乎沒有任何工作。

編輯: 我認爲有問題的豆。從bean調用的任何方法似乎都沒有做任何事情(EL被解析,儘管沒有bean方法調用)。

我測試過的註解,它使用(均爲javax.faces.bean。*)

+0

爲什麼不修改EJB中的方法來接收參數? – 2013-04-27 00:34:51

+0

請參閱編輯。 Verifier bean似乎有問題,而不是EJB。 – 2013-04-27 00:41:08

回答

1

所以,問題是在AccountVerifierBean。

我在faces-config.xml中添加了以下幾行,它現在正在工作。

<managed-bean eager="true"> 
    <managed-bean-name>accountVerifierBean</managed-bean-name> 
    <managed-bean-class>org.Videotheque.beans.AccountVerifierBean</managed-bean-class> 
    <managed-bean-scope>application</managed-bean-scope> 
</managed-bean> 

我相當肯定,這個問題是因爲我的豆需要是在EJB組件,而不是戰爭,使得EJB可以訪問它,但正因爲如此,戰爭不知道該豆存在。

+0

這種配置看起來很奇怪。你確定你在使用JSF 2嗎? – 2013-04-27 02:47:24

+0

我是,雖然說實話,我不知道我是否使用了正確的方法。我所知道的是這種方法解決了我的問題。 – 2013-04-27 04:09:30

+0

@LuiggiMendoza根據http://stackoverflow.com/questions/7583038/what-is-the-use-of-faces-config-xml-in-jsf-2,這是正確的方法,只是缺少一個描述標籤。 – 2013-04-27 04:15:31