1

ユーザー アカウントのユーザー検証キーを管理するマネージド Bean (アカウント スコープ) へのアクセスを必要とする顧客ユーザー アカウントの作成を処理する EJB があります (キーは一時的なものであるため、データベース呼び出しで処理する必要はありません)。ただし、確認キーを EJB に送信する方法がわかりません (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;
        }
    }
}

Application マップと ELContext を使用して、@Inject、@ManagedProperty を試しました。何も機能していないようです。

編集: Beanに何か問題があると思います。Bean から呼び出されたメソッドは何もしていないようです (EL は解決されますが、Bean メソッドの呼び出しはありません)。

使用する注釈をテストしました (どちらも javax.faces.bean.* です)。

4

1 に答える 1

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 がアクセスできるように、Bean を WAR ではなく EJB パッケージに含める必要があったため、問題が発生したことは確かですが、そのため、WAR は Bean の存在を認識していませんでした。

于 2013-04-27T00:57:03.110 に答える