0

この例外でここで何が起こっているのか、誰かが私にヒントをくれることを願っています。j_security_check を JSF でテストできる環境をまとめていますが、気になっているのは、glassfish を再起動せずにアプリケーションを再デプロイすると、このエラーが表示されることです。戦争を再展開するだけで完全に安全だと思っていましたが、グラスフィッシュが再起動されて戦争が再展開されるまで、私のセットアップは停止しています。これが後々問題になるのではないかと心配しています。何かアドバイスはありますか?

Glassfish 3.1.2、NetBeans 7.1.2 を使用しています...

com.sun.faces.mgbean.ManagedBeanCreationException: マネージド Bean userController でリソース注入を実行中にエラーが発生しました
    com.sun.faces.mgbean.BeanBuilder.invokePostConstruct(BeanBuilder.java:229) で
    com.sun.faces.mgbean.BeanBuilder.build(BeanBuilder.java:105) で
    com.sun.faces.mgbean.BeanManager.createAndPush (BeanManager.java:409) で
    com.sun.faces.mgbean.BeanManager.create (BeanManager.java:269) で
    com.sun.faces.el.ManagedBeanELResolver.resolveBean (ManagedBeanELResolver.java:244) で
    com.sun.faces.el.ManagedBeanELResolver.getValue (ManagedBeanELResolver.java:116) で
    com.sun.faces.el.DemuxCompositeELResolver._getValue (DemuxCompositeELResolver.java:176) で
    com.sun.faces.el.DemuxCompositeELResolver.getValue (DemuxCompositeELResolver.java:203) で
    com.sun.el.parser.AstIdentifier.getValue(AstIdentifier.java:103) で
    com.sun.el.parser.AstValue.getValue(AstValue.java:179) で
    com.sun.el.parser.AstDeferredExpression.getValue (AstDeferredExpression.java:63) で
    com.sun.el.parser.AstCompositeExpression.getValue (AstCompositeExpression.java:68) で
    com.sun.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:224) で
    org.jboss.weld.el.WeldValueExpression.getValue(WeldValueExpression.java:50) で
    com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:109) で
    javax.faces.component.ComponentStateHelper.eval (ComponentStateHelper.java:194) で
    javax.faces.component.ComponentStateHelper.eval (ComponentStateHelper.java:182) で
    javax.faces.component.UIOutput.getValue(UIOutput.java:169) で
    com.sun.faces.renderkit.html_basic.OutputLinkRenderer.getValue(OutputLinkRenderer.java:182) で
    com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.getCurrentValue(HtmlBasicRenderer.java:355) で
    com.sun.faces.renderkit.html_basic.OutputLinkRenderer.renderAsActive(OutputLinkRenderer.java:191) で
    com.sun.faces.renderkit.html_basic.OutputLinkRenderer.encodeBegin(OutputLinkRenderer.java:107) で
    javax.faces.component.UIComponentBase.encodeBegin(UIComponentBase.java:820)で
    javax.faces.component.UIComponent.encodeAll (UIComponent.java:1755) で
    javax.faces.component.UIComponent.encodeAll(UIComponent.java:1760)で
    javax.faces.component.UIComponent.encodeAll(UIComponent.java:1760)で
    com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:402) で
    com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:131) で
    javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:288) で
    com.sun.faces.lifecycle.RenderResponsePhase.execute (RenderResponsePhase.java:121) で
    com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) で
    com.sun.faces.lifecycle.LifecycleImpl.render (LifecycleImpl.java:139) で
    javax.faces.webapp.FacesServlet.service (FacesServlet.java:594) で
    org.apache.catalina.core.StandardWrapper.service (StandardWrapper.java:1542) で
    org.apache.catalina.core.StandardWrapperValve.invoke (StandardWrapperValve.java:281) で
    org.apache.catalina.core.StandardContextValve.invoke (StandardContextValve.java:175) で
    org.apache.catalina.core.StandardPipeline.doInvoke (StandardPipeline.java:655) で
    org.apache.catalina.core.StandardPipeline.invoke (StandardPipeline.java:595) で
    org.apache.catalina.core.StandardHostValve.invoke (StandardHostValve.java:161) で
    org.apache.catalina.connector.CoyoteAdapter.doService (CoyoteAdapter.java:331) で
    org.apache.catalina.connector.CoyoteAdapter.service (CoyoteAdapter.java:231) で
    com.sun.enterprise.v3.services.impl.ContainerMapper$AdapterCallable.call(ContainerMapper.java:317) で
    com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195) で
    com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:849) で
    com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:746) で
    com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1045) で
    com.sun.grizzly.http.DefaultProtocolFilter.execute (DefaultProtocolFilter.java:228) で
    com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137) で
    com.sun.grizzly.DefaultProtocolChain.execute (DefaultProtocolChain.java:104) で
    com.sun.grizzly.DefaultProtocolChain.execute (DefaultProtocolChain.java:90) で
    com.sun.grizzly.http.HttpProtocolChain.execute (HttpProtocolChain.java:79) で
    com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54) で
    com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59) で
    com.sun.grizzly.ContextTask.run(ContextTask.java:71) で
    com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532) で
    com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513) で
    java.lang.Thread.run(Thread.java:662) で
原因: com.sun.faces.spi.InjectionProviderException: com.sun.enterprise.container.common.spi.util.InjectionException: 例外がライフサイクル メソッドを呼び出そうとしています private void avenger.UserController.startup()
    org.glassfish.faces.integration.GlassFishInjectionProvider.invokePostConstruct (GlassFishInjectionProvider.java:231) で
    com.sun.faces.mgbean.BeanBuilder.invokePostConstruct(BeanBuilder.java:223) で
    ... 56 以上
原因: com.sun.enterprise.container.common.spi.util.InjectionException: 例外がライフサイクル メソッドの呼び出しを試みています private void avenger.UserController.startup()
    org.glassfish.faces.integration.GlassFishInjectionProvider.invokeLifecycleMethod (GlassFishInjectionProvider.java:393) で
    org.glassfish.faces.integration.GlassFishInjectionProvider.invokePostConstruct (GlassFishInjectionProvider.java:306) で
    org.glassfish.faces.integration.GlassFishInjectionProvider.invokePostConstruct (GlassFishInjectionProvider.java:229) で
    ... さらに 57 件
原因: java.security.PrivilegedActionException: java.lang.reflect.InvocationTargetException
    java.security.AccessController.doPrivileged(ネイティブメソッド)で
    org.glassfish.faces.integration.GlassFishInjectionProvider.invokeLifecycleMethod (GlassFishInjectionProvider.java:376) で
    ... 59 件以上
原因: java.lang.reflect.InvocationTargetException
    sun.reflect.NativeMethodAccessorImpl.invoke0(ネイティブメソッド)
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) で
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) で
    java.lang.reflect.Method.invoke(Method.java:597) で
    org.glassfish.faces.integration.GlassFishInjectionProvider$2.run(GlassFishInjectionProvider.java:382) で
    ... 61 以上
原因: java.lang.ClassCastException: avenger.MyUser を avenger.MyUser にキャストできません
    avenger.UserController.updateUserList (UserController.java:103) で
    avenger.UserController.startup(UserController.java:39) で

これが私のweb.xmlの一部です

<servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.xhtml</url-pattern>
</servlet-mapping>
<welcome-file-list>
    <welcome-file>index.xhtml</welcome-file>
</welcome-file-list>
<security-constraint>
    <display-name>Admin</display-name>
    <web-resource-collection>
        <web-resource-name>Admin Views</web-resource-name>
        <description/>
        <url-pattern>/admin/*</url-pattern>
    </web-resource-collection>
</security-constraint>
<security-role>
    <description/>
    <role-name>ADMIN</role-name>
</security-role>
<security-role>
    <description/>
    <role-name>USER</role-name>
</security-role>

私の管理豆

@ManagedBean(eager = true)
@SessionScoped
public class UserController は Serializable を実装します {

    /**
     * UserBean の新しいインスタンスを作成します
     */
    public UserController() {}

    @PostConstruct
    プライベート ボイド スタートアップ() {
        System.out.println("UserController の初期化");
        updateUserList();
    }

    @PreDestroy
    プライベートボイドシャットダウン(){
        System.out.println("UserController を破棄しています");
        Utils.stopEntityManager();
    }

    private static final long serialVersionUID = 1L;


    @オーバーライド
    public int hashCode() {
        int ハッシュ = 5;
        ハッシュ = 67 * ハッシュ + (this.userList != null ? this.userList.hashCode() : 0);
        ハッシュ = 67 * ハッシュ + (this.cUser != null ? this.cUser.hashCode() : 0);
        ハッシュを返します。
    }

    @オーバーライド
    public boolean equals(Object obj) {
        if (obj == null) {
            false を返します。
        }
        if (getClass() != obj.getClass()) {
            false を返します。
        }
        最終的な UserController その他 = (UserController) obj;
        if (this.userList != other.userList && (this.userList == null || !this.userList.equals(other.userList))) {
            false を返します。
        }
        if (this.cUser != other.cUser && (this.cUser == null || !this.cUser.equals(other.cUser))) {
            false を返します。
        }
        true を返します。
    }


    //現在のユーザー
    MyUser cUser = new MyUser();
    public MyUser getMyUser() { return cUser; }
    public void setMyUser(MyUser cUser) {this.cUser = cUser;}

    // 新しいユーザー
    MyUser nUser = 新しい MyUser();
    public MyUser getNewUser() { nUser を返します。}
    public void setNewUser(MyUser nUser) {this.nUser = nUser;}

    // 現在のユーザーのリスト
    リスト userList = new LinkedList();
    public void setUserList(List uList) {userList = uList;}
    public List getUserList() {return userList;}


    public String updateUserList() {

        System.out.println("updateUserList()" );
        EntityManager em = Utils.getEntityManager();

        //クエリ q = em.createNamedQuery("MyUser.findAll");
        クエリ q = em.createQuery("Select u FROM MyUser u", MyUser.class);
        userList = q.getResultList();

        for (MyUser cu : userList) {
            文字列 groupList = "";
            for (Grouptable gt : cu.getGrouptableList()) {
                groupList += ":"+gt.getGrouptablePK().getGroupid();
            }
            cu.setGrouplist(グループリスト);
        }
        「users.xhtml」を返します。
    }

    public boolean usernameExist() {
        false を返します。
    }

    パブリック文字列 resetNewUser() {
        nUser = 新しい MyUser();
        「createuser.xhtml」を返します。
    }

    public String createNewUser () {

        System.out.println("でアカウントを作成しようとしています\n"
                + "\tusername: " + nUser.getUsername() +"\n"
                + "\tpassword: "+nUser.getPassword() +"\n"
                + "\t名: "+nUser.getFirstName()+"\n"
                + "\t姓: "+nUser.getLastName()+"\n");

        //TODO: newUser が既に存在するかどうかを確認し、存在する場合はユーザーにメッセージを送信します


        // ハッシュ化されたパスワードを設定
        MessageDigest md = null;
        バイト [] ダイジェスト。
        { md = MessageDigest.getInstance("MD5"); を試してください。}
        catch (NoSuchAlgorithmException ex) {
            Logger.getLogger(UserController.class.getName()).log(Level.SEVERE, null, ex);
        }
        System.out.println("nUser"+nUser);
        //System.out.println("cUser.password"+cUser.getPassword());
        ダイジェスト = md.digest(nUser.getPassword().getBytes());
        nUser.setPassword(Utils.toHex(ダイジェスト));

        System.out.println("ユーザーを作成中: " + nUser.getUsername() +
                           " password: "+nUser.getPassword());
        EntityManager em = Utils.getEntityManager();
        em.getTransaction().begin();
        em.persist(nUser);
        em.getTransaction().commit();
        updateUserList();

        「users.xhtml」を返します。
    }

    public String deleteUser () {
        System.out.println("ユーザーの削除: "+cUser.getUsername());
        EntityManager em = Utils.getEntityManager();
        cUser = em.find(MyUser.class, cUser.getUsername());

        em.getTransaction().begin();
        em.remove(cUser);
        em.getTransaction().commit();
        //em.close();
        「users.xhtml」を返します。
    }

    public String deleteSelectedUsers () {
        for (MyUser cu : userList) {
            if (cu.getSelected()) {
                System.out.println("削除予定: "+cu);
            }
        }
        EntityManager em = Utils.getEntityManager();
        for (MyUser cu : userList) {
            if (cu.getUsername().equalsIgnoreCase("ADMIN") && cu.getSelected()) {
                System.out.println("管理者アカウントを削除できません");
                継続する;
            }           
            if (cu.getSelected()) {
                MyUser targetUser = em.find(MyUser.class, cu.getUsername());
                System.out.println("ユーザーの削除: "+cu.toString());
                em.getTransaction().begin();
                em.remove(targetUser);
                em.getTransaction().commit();
            }
        }
        updateUserList();
        「users.xhtml」を返します。
    }

    public String login() {
        System.out.println("ユーザーがログインしようとしています...");
        System.out.println("ユーザー名: "+cUser.getUsername());
        System.out.println("パスワード: "+cUser.getPassword());

        // ハッシュ化されたパスワードを設定
        MessageDigest md = null;
        バイト [] ダイジェスト。
        { md = MessageDigest.getInstance("MD5"); を試してください。}
        catch (NoSuchAlgorithmException ex) {
            Logger.getLogger(UserController.class.getName()).log(Level.SEVERE, null, ex);
        }
        ダイジェスト = md.digest(cUser.getPassword().getBytes());
        cUser.setPassword(Utils.toHex(ダイジェスト));

        MyUser userFound = Utils.getEntityManager().find(MyUser.class, cUser.getUsername());
        if (userFound == null) {
            System.err.println("ユーザーが存在しません");
            null を返します。
        }

        if (!userFound.getPassword().equalsIgnoreCase(cUser.getPassword())) {
            System.err.println("パスワードが正しくありません");
            null を返します。
        }

        「users.xhtml」を返します。

// FacesContext context = FacesContext.getCurrentInstance();
// HttpServletRequest リクエスト = (HttpServletRequest) context.getExternalContext();
// 試す {
// request.login(this.cUser.getFirstName(), this.cUser.getPassword());
// this.cUser = Utils.getEntityManager().find(MyUser.class,this.cUser.getUsername());
// } catch (ServletException e) {
// context.addMessage(null, new FacesMessage("Unknown login"));
// }

    }

    public MyUser getUser() {
        if (cUser==null) {
            プリンシパル プリンシパル = FacesContext.getCurrentInstance().getExternalContext().getUserPrincipal();
            if (プリンシパル != null) {
                //cUser = userDAO.find(principal.getName()); // j_username でユーザーを検索
                cUser = Utils.getEntityManager().find(MyUser.class, principal.getName());
            }
        }
        cUser を返します。
    }
}

JavaDB 用の私の init.sql

テーブルユーザーテーブルを作成します (
    username varchar(128) NOT NULL CONSTRAINT USER_PK PRIMARY KEY ,
    パスワード varchar(128) NOT NULL,
    ファーストネーム varchar(128) NOT NULL,
    姓 varchar(128) NOT NULL
);

テーブルグループテーブルを作成します(
    ユーザー名 varchar(128) NOT NULL,
    groupid varchar(128) NOT NULL,
    CONSTRAINT GROUP_PK PRIMARY KEY(ユーザー名、グループ ID)、
    CONSTRAINT USER_FK FOREIGN KEY(ユーザー名) REFERENCES ユーザーテーブル(ユーザー名)
        ON DELETE CASCADE ON UPDATE RESTRICT
);

ユーザーテーブルに挿入します(ユーザー名、パスワード、名、姓)
    値 ('管理者', '21232f297a57a5a743894a0e4a801fc3','','');
grouptable(username,groupid) 値 ('admin', 'USER') に挿入します。
grouptable(username,groupid) 値 ('admin', 'ADMIN') に挿入します。

http://blog.gamatam.com/2009/11/jdbc-realm-setup-with-glassfish-v3.htmlの指示に従って、接続プールと jdbcRealm を作成しました。

4

0 に答える 0