2013-04-26 74 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