0

Glassfish 3.1.2.2を使用しており、認証情報を収集して、Glassfishアプリケーションサーバーに接続されているMySQLデータベースに保存したいと考えています。これまでのところ、ejb-projectに配置したカスタマイズされた監査モジュールの実装に成功しました。これは今のところ問題なく動作します。

ここで、ログインの試行が失敗したときにいくつかのフラグとカウンターを設定したいと思います。この目的のために、EntityManagerインスタンスをAuditModuleクラス/オブジェクトに注入しようとしましたが、注入が失敗するため、これは常にnullポインター例外をスローします。

私はすでに@Statelessアノテーションを追加しようとしましたが(このクラスをコンテナー管理する必要があることを伝えるため)、成功しませんでした。エンティティマネージャインスタンス「em」はまだnullです。

これが私のカスタマイズされた監査モジュールです:

@Stateless
public class CustomAuditModule extends AuditModule {

    @PersistenceContext(unitName = "MyPersistenceUnit-ejbPU")
    private EntityManager em;

    @Override
    public void init(Properties props) {
        this.props = props;
    }

    @Override
    public void authentication(String username, String realm, boolean success) {
        if(success) {
            try {
                User user = em.createQuery("SELECT u FROM User u WHERE u.name='"+username+"'", User.class).getSingleResult();
                user.setLastLoginFail(new Long(-1L));
                user.setLoginFails(0);
                em.merge(user);
                em.flush();
            } catch(NoResultException ex) {
                Logger.getLogger(CustomAuditModule.class.getName()).log(Level.WARNING, "User "+username+" does not exist.");
            }
        } else {
            try {
                User user = em.createQuery("SELECT u FROM User u WHERE u.name='"+username+"'", User.class).getSingleResult();
                user.setLastLoginFail(System.currentTimeMillis());
                int fails = user.getLoginFails().intValue();
                fails++;
                user.setLoginFails(fails);
                em.merge(user);
                em.flush();
            } catch(NoResultException ex) {
                Logger.getLogger(CustomAuditModule.class.getName()).log(Level.WARNING, "User "+username+" does not exist.");
            }
        }
    }

    @Override
    public void ejbInvocation(String user, String ejb, String method, boolean success) {
        Logger.getLogger(CustomAuditModule.class.getName()).log(Level.INFO, "EJB Invocation.");
    }

    @Override
    public void serverStarted() {
        Logger.getLogger(CustomAuditModule.class.getName()).log(Level.INFO, "Server Started.");
    }

    @Override
    public void serverShutdown() {
        Logger.getLogger(CustomAuditModule.class.getName()).log(Level.INFO, "Server Shutdown.");
    }

}

jdbcリソースにアクセスする方法/EntityManagerインスタンスを正しく挿入する方法を誰かが考えていますか?

よろしくお願いします!

4

1 に答える 1

1

の経験がありませんAuditModule。しかし@Stateless、EJBはアノテーションを介して注入する必要があるため、アノテーションは何の効果もないと思いますが、これが事実であるとは思えません@EJB

Java SE の方法で EntityManagerFactory を作成します。

EntityManagerFactory emf = Persistence.createEntityManagerFactory("MyPersistenceUnit-ejbPU");
EntityManager em = emf.createEntityManager(); 

最初の行はコストのかかる操作であるため、アプリケーションの起動時に 1 回だけ呼び出すことをお勧めします。

于 2013-03-05T18:12:18.030 に答える