0

我希望有人能给我一个提示,告诉我这里发生了什么,除了这个例外。我正在构建一个可以使用 JSF 测试 j_security_check 的环境,我注意到当我在不重新启动 glassfish 的情况下重新部署我的应用程序时,我看到了这个错误。我认为重新部署战争是完全安全的,但我的设置被水洗了,直到重新启动 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(Native Method)
    在 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>

我的管理 bean

@ManagedBean(渴望=真)
@SessionScoped
公共类 UserController 实现 Serializable {

    /**
     * 创建一个新的 UserBean 实例
     */
    公共用户控制器(){}

    @PostConstruct
    私人无效启动(){
        System.out.println("初始化用户控制器");
        更新用户列表();
    }

    @PreDestroy
    私人无效关机(){
        System.out.println("销毁用户控制器");
        Utils.stopEntityManager();
    }

    私有静态最终长序列版本UID = 1L;


    @覆盖
    公共 int hashCode() {
        整数哈希 = 5;
        hash = 67 * hash + (this.userList != null ? this.userList.hashCode() : 0);
        hash = 67 * hash + (this.cUser != null ? this.cUser.hashCode() : 0);
        返回哈希;
    }

    @覆盖
    公共布尔等于(对象 obj){
        如果(obj == null){
            返回假;
        }
        if (getClass() != obj.getClass()) {
            返回假;
        }
        最终用户控制器其他 = (用户控制器) obj;
        if (this.userList != other.userList && (this.userList == null || !this.userList.equals(other.userList))) {
            返回假;
        }
        if (this.cUser != other.cUser && (this.cUser == null || !this.cUser.equals(other.cUser))) {
            返回假;
        }
        返回真;
    }


    //当前用户
    我的用户 cUser = new MyUser();
    public MyUser getMyUser() { return cUser; }
    public void setMyUser(MyUser cUser) {this.cUser = cUser;}

    //新用户
    我的用户 nUser = 新的我的用户();
    public MyUser getNewUser() { return nUser; }
    public void setNewUser(MyUser nUser) {this.nUser = nUser;}

    // 当前用户列表
    列表 userList = new LinkedList();
    public void setUserList(List uList) {userList = uList;}
    public List getUserList() {return userList;}


    公共字符串更新用户列表(){

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

        //查询 q = em.createNamedQuery("MyUser.findAll");
        查询 q = em.createQuery("Select u FROM MyUser u", MyUser.class);
        用户列表 = q.getResultList();

        对于(我的用户库:用户列表){
            字符串组列表 = "";
            for (Grouptable gt : cu.getGrouptableList()) {
                groupList += ":"+gt.getGrouptablePK().getGroupid();
            }
            cu.setGrouplist(groupList);
        }
        返回“users.xhtml”;
    }

    公共布尔用户名Exist(){
        返回假;
    }

    公共字符串 resetNewUser() {
        nUser = new MyUser();
        返回“createuser.xhtml”;
    }

    公共字符串 createNewUser () {

        System.out.println("正在尝试创建帐户\n"
                + "\tusername: " + nUser.getUsername() +"\n"
                + "\tpassword: "+nUser.getPassword() +"\n"
                + "\t名字: "+nUser.getFirstName()+"\n"
                + "\tlast name: "+nUser.getLastName()+"\n");

        //TODO: 检查newUser是否已经存在,如果存在则发送消息给用户


        // 设置哈希密码
        消息摘要 md = null;
        字节 [] 摘要;
        尝试 { md = MessageDigest.getInstance("MD5"); }
        捕捉(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(digest));

        System.out.println("创建用户:" + nUser.getUsername() +
                           " 密码: "+nUser.getPassword());
        EntityManager em = Utils.getEntityManager();
        em.getTransaction().begin();
        em.persist(nUser);
        em.getTransaction().commit();
        更新用户列表();

        返回“users.xhtml”;
    }

    公共字符串删除用户(){
        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”;
    }

    公共字符串 deleteSelectedUsers () {
        对于(我的用户库:用户列表){
            如果(cu.getSelected()){
                System.out.println("计划删除:"+cu);
            }
        }
        EntityManager em = Utils.getEntityManager();
        对于(我的用户库:用户列表){
            if (cu.getUsername().equalsIgnoreCase("ADMIN") && cu.getSelected()) {
                System.out.println("管理员账号不能删除");
                继续;
            }           
            如果(cu.getSelected()){
                MyUser targetUser = em.find(MyUser.class, cu.getUsername());
                System.out.println("删除用户:"+cu.toString());
                em.getTransaction().begin();
                em.remove(目标用户);
                em.getTransaction().commit();
            }
        }
        更新用户列表();
        返回“users.xhtml”;
    }

    公共字符串登录(){
        System.out.println("用户尝试登录...");
        System.out.println("用户名:"+cUser.getUsername());
        System.out.println("密码:"+cUser.getPassword());

        // 设置哈希密码
        消息摘要 md = null;
        字节 [] 摘要;
        尝试 { md = MessageDigest.getInstance("MD5"); }
        捕捉(NoSuchAlgorithmException ex){
            Logger.getLogger(UserController.class.getName()).log(Level.SEVERE, null, ex);
        }
        摘要 = md.digest(cUser.getPassword().getBytes());
        cUser.setPassword(Utils.toHex(digest));

        MyUser userFound = Utils.getEntityManager().find(MyUser.class, cUser.getUsername());
        if (userFound == null) {
            System.err.println("用户不存在");
            返回空值;
        }

        if (!userFound.getPassword().equalsIgnoreCase(cUser.getPassword())) {
            System.err.println("密码错误");
            返回空值;
        }

        返回“users.xhtml”;

// FacesContext 上下文 = FacesContext.getCurrentInstance();
// HttpServletRequest request = (HttpServletRequest) context.getExternalContext();
// 尝试 {
// request.login(this.cUser.getFirstName(), this.cUser.getPassword());
// this.cUser = Utils.getEntityManager().find(MyUser.class,this.cUser.getUsername());
// } 捕捉 (ServletException e) {
// context.addMessage(null, new FacesMessage("Unknown login"));
// }

    }

    公共我的用户 getUser() {
        如果(cUser==null){
            主体主体 = FacesContext.getCurrentInstance().getExternalContext().getUserPrincipal();
            如果(主要!= null){
                //cUser = userDAO.find(principal.getName()); // 通过 j_username 查找用户
                cUser = Utils.getEntityManager().find(MyUser.class, principal.getName());
            }
        }
        返回 cUser;
    }
}

我用于 JavaDB 的 init.sql

创建表用户表(
    用户名 varchar(128) NOT NULL CONSTRAINT USER_PK PRIMARY KEY ,
    密码 varchar(128) NOT NULL,
    名字 varchar(128) NOT NULL,
    姓氏 varchar(128) NOT NULL
);

创建表组表(
    用户名 varchar(128) 非空,
    groupid varchar(128) 非空,
    CONSTRAINT GROUP_PK PRIMARY KEY(用户名, groupid),
    CONSTRAINT USER_FK FOREIGN KEY(username) REFERENCES usertable(username)
        ON DELETE CASCADE ON UPDATE RESTRICT
);

插入用户表(用户名,密码,名字,姓氏)
    值('管理员','21232f297a57a5a743894a0e4a801fc3','','');
插入 grouptable(username,groupid) 值 ('admin', 'USER');
插入 grouptable(username,groupid) 值 ('admin', 'ADMIN');

我使用以下说明创建了连接池和 jdbcRealm:http: //blog.gamatam.com/2009/11/jdbc-realm-setup-with-glassfish-v3.html

4

0 回答 0