【问题标题】:Accessing ManagedBean method from EJB从 EJB 访问 ManagedBean 方法
【发布时间】:2013-04-21 05:51:00
【问题描述】:

我有一个 EJB,它处理需要访问托管 bean(帐户范围)的客户用户帐户的创建,该 bean 管理用户帐户的用户验证密钥(密钥是临时的,因此它们不需要由数据库处理来电)。但是,我想不出一种将验证密钥发送到 EJB(生成发送给用户的验证电子邮件)的方法。

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("accounts@minimalcomputers.com","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;
        }
    }
}

我尝试了@Inject、@ManagedProperty、使用应用程序映射和使用ELContext。似乎没有任何效果。

编辑: 我觉得豆子有问题。从 bean 调用的任何方法似乎都没有做任何事情(EL 已解决,但没有 bean 方法调用)。

我已经测试了它使用的注解(都是 javax.faces.bean.*)

【问题讨论】:

  • 为什么不修改 EJB 中的方法来接收参数?
  • 查看编辑。验证器 bean 似乎有问题,而不是 EJB。

标签: jsf jsf-2 ejb


【解决方案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>

我相当确定问题是因为我的 bean 需要在 EJB 包而不是 WAR 中,以便 EJB 可以访问它,但正因为如此,WAR 不知道 bean 存在。

【讨论】:

  • 这个配置看起来很奇怪。你确定你使用的是 JSF 2?
  • 我是,但说实话,我不知道我是否使用了正确的方法。我所知道的是,这种方法可以解决我的问题。
  • @LuiggiMendoza 根据stackoverflow.com/questions/7583038/…,这是正确的方法,只是缺少一个描述标签。
  • 所以您只是删除了注释并将配置移动到 faces-config.xml 文件并工作了吗?真的,你的问题太局限了。
  • @LuiggiMendoza 我猜。我假设这是因为注释扫描器不希望 bean 在 EJB 包中,但我可能是错的。可以肯定的是,这是一个奇怪的错误。
猜你喜欢
  • 2017-10-10
  • 1970-01-01
  • 2012-12-22
  • 2012-03-04
  • 2011-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多