Ошибка ManagedBeanCreationException при настройке для теста JSF/j_security_check
Я надеюсь, что кто-то может дать мне подсказку о том, что здесь происходит, за этим исключением. Я создаю среду, в которой я могу протестировать j_security_check с помощью JSF, и что я замечаю, так это когда я повторно развертываю свое приложение, не перезапуская glassfish, я вижу эту ошибку. Я думал, что было бы совершенно безопасно просто перераспределить войну, но моя установка не использовалась до тех пор, пока стеклянная рыба не будет перезапущена и война не будет переброшена. Я беспокоюсь, что это станет проблемой позже в будущем. Любой совет?
Я использую Glassfish 3.1.2, NetBeans 7.1.2...
com.sun.faces.mgbean.ManagedBeanCreationException: Произошла ошибка при выполнении внедрения ресурса в управляемый компонент userController в com.sun.faces.mgbean.BeanBuilder.invokePostConstruct(BeanBuilder.java:229) в com.sun.faces.mgbean.BeanBuilder. сборка (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.: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.welueExpression..faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:109) по адресу javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:194) по адресу javax.faces.component.ComponentStateHeljSer (18).) в javax.faces.component.UIOutput.getValue(UIOutput.java:169) в com.sun.faces.renderkit.html_basic.OutputLinkRenderer.getValue(OutputLinkRenderer.java:182) в com.sun.faces.renderkit.ht_ HtmlBasicRenderer.getCurrentValue(HtmlBasicRenderer.java:355) по адресу com.sun.faces.renderkit.html_basic.OutputLinkRenderer.renderAsActive(OutputLinkRenderer.java:191) по адресу com.sun.faces.Rende_Rede_Rede_Reg_Exid_ExID 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.der (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:15) в org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281) в org.apache.catalina.core.StandardContextValve.invoke(StandardContex) tValve.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.serapj (coy).) в 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.javaConun). Com) 59). выполнить (ContextTask.java:71) в com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532) в com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513) at 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) at com.sun.faces.mgbean.BeanBuilder.invokePostConstruct(BeanBuilder.java:223) ... еще 56 причин: com.sun.enterprise.container.common.spi.util.InjectionException: исключение при попытке вызвать метод жизненного цикла закрытое void glassfish.faces.integration.GlassFishInjectionProvider.invokePostConstruct(GlassFishInjectionProvider.java:229) ... еще 57 Вызвано: java.security.PrivilegedActionException: java.lang.reflect.InvocationTargetException в java.security.Accessative)). 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(DelegatingMethodAccessor.hoke.hoke.j.ref.j.ref.j.ref).java:597) at org.glassfish.faces.integration.GlassFishInjectionProvider$2.run(GlassFishInjectionProvider.java:382) ... еще 61 причина: java.lang.ClassCastException: avenger.MyUser не может быть приведен к мстителю..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 Открытый класс UserController реализует Serializable { / ** * Создает новый экземпляр UserBean * / public UserController () {} @PostConstruct private void startup () { System.out.println("inilitiazing UserController"); updateUserList (); } @PreDestroy закрытое закрытие () { System.out.println("уничтожение UserController"); Utils.stopEntityManager(); } приватный статический финал long serialVersionUID = 1L; @Override public int hashCode () { int hash = 5; hash = 67 * hash + (this.userList!= null? this.userList.hashCode (): 0); hash = 67 * hash + (this.cUser!= null? this.cUser.hashCode (): 0); вернуть хеш; } @Override public boolean equals (Object obj) { if (obj == null) { вернуть ложь; } if (getClass()!= obj.getClass()) { вернуть ложь; } конечный UserController other = (UserController) 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))) { вернуть ложь; } вернуть истину; } // текущий пользователь MyUser cUser = new MyUser (); public MyUser getMyUser () {return cUser; } public void setMyUser (MyUser cUser) {this.cUser = cUser;} // новый пользователь MyUser nUser = new MyUser (); public MyUser getNewUser () {return nUser; } public void setNewUser (MyUser nUser) {this.nUser = nUser;} // список текущих пользователей List 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"); Query q = em.createQuery("Выбрать u из MyUser u", MyUser.class); userList = q.getResultList (); for (MyUser cu: userList) { String groupList = ""; for (Grouptable gt: cu.getGrouptableList ()) { groupList + = ":" + gt.getGrouptablePK (). getGroupid (); } cu.setGrouplist (список группы); } return "users.xhtml"; } public boolean usernameExist () { вернуть ложь; } public String resetNewUser () { nUser = новый MyUser (); return "createuser.xhtml"; } public String createNewUser () { System.out.println ("попытка создать учетную запись с \ n" + "\ tusername: " + nUser.getUsername() +"\ n" + "\ tpassword:" + nUser.getPassword () + "\ n" + "\ tfirst name:" + nUser.getFirstName () + "\ n" + "\ tlast name:" + nUser.getLastName () + "\ n"); // TODO: проверить, если newUser уже существует, если это так, отправить сообщение пользователю // установить хешированный пароль MessageDigest md = null; байт [] дайджест; try { 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()); digest = md.digest(nUser.getPassword().getBytes()); nUser.setPassword(Utils.toHex(переваривать)); System.out.println ("создание пользователя:" + nUser.getUsername () + "пароль: "+nUser.getPassword()); EntityManager em = Utils.getEntityManager(); em.getTransaction() начинается (). em.persist (Nuser); em.getTransaction () фиксации (). updateUserList (); return "users.xhtml"; } public String deleteUser () { System.out.println("удаление пользователя:" + cUser.getUsername ()); EntityManager em = Utils.getEntityManager (); cUser = em.find (MyUser.class, cUser.getUsername ()); em.getTransaction () начинается (). em.remove (cUser); em.getTransaction () фиксации (). //em.close (); return "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() начинается (). em.remove (targetUser); em.getTransaction () фиксации (). } } updateUserList (); return "users.xhtml"; } public String login () { System.out.println("пользователь пытается войти в систему..."); System.out.println("username: "+cUser.getUsername()); System.out.println("пароль:" + cUser.getPassword ()); // установить хешированный пароль MessageDigest md = null; байт [] дайджест; try { md = MessageDigest.getInstance("MD5"); } catch (NoSuchAlgorithmException ex) { Logger.getLogger(UserController.class.getName()). Log(Level.SEVERE, null, ex); } digest = md.digest(cUser.getPassword().getBytes()); cUser.setPassword(Utils.toHex(переваривать)); MyUser userFound = Utils.getEntityManager (). Find(MyUser.class, cUser.getUsername()); if (userFound == null) { System.err.println("пользователь не существует"); вернуть ноль; } if (! userFound.getPassword (). equalsIgnoreCase (cUser.getPassword ())) { System.err.println ("Неверный пароль"); вернуть ноль; } return "users.xhtml"; // FacesContext context = 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()); // } catch (ServletException e) { // context.addMessage(null, new FacesMessage("Неизвестный логин")); //} } public MyUser getUser () { if (cUser == null) { Принципал = FacesContext.getCurrentInstance(). GetExternalContext(). GetUserPrincipal(); если (главный!= ноль) { //cUser = userDAO.find(Principal.getName()); // Найти пользователя по j_username cUser = Utils.getEntityManager().find(MyUser.class, Principal.getName()); } } возврат CUser; } }
мой init.sql для JavaDB
создать таблицу usertable ( username varchar(128) NOT NULL CONSTRAINT USER_PK PRIMARY KEY, пароль varchar(128) NOT NULL, имя varchar(128) NOT NULL, фамилия varchar(128) NOT NULL); создать таблицу grouptable (имя пользователя varchar(128) NOT NULL, groupid varchar(128) NOT NULL, CONSTRAINT GROUP_PK PRIMARY KEY(имя пользователя, groupid), CONSTRAINT USER_FK FOREIGN KEY(имя пользователя) REFERENCES usertable(имя пользователя) НА УДАЛИТЬ CASCADE ON UPDATE RESTR; вставить в usertable (имя пользователя, пароль, имя, фамилию) значения ('admin', '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