Again: Dublicate ID
cleonhar Jan 13, 2006 2:51 AMHi everybody.
I hope sombody can help me. I have a problem using the @DataModel Annotation. I saw some other people had the same problem and I tried also the suggestions, but nothing worked.
I use JBoss 4.0.3SP1 and Seam 1.0beta. I tried it with MyFaces 1.0.9 and 1.1.1 and 1.1.2-SNAPSHOT.
Here is my VIEW:
<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" template="../include/template.xhtml"> <!-- content --> <ui:define name="content"> <div class="section"> <h1>Benutzer</h1> </div> <div class="section"> <h:outputText value="Keine User gefunden" rendered="#{userlist != null and empty userlist}"/> <h:dataTable value="#{userlist}" var="u" rendered="#{not empty userlist}"> <h:column> <f:facet name="header">Name</f:facet> #{u.uid} </h:column> <h:column> <f:facet name="header">Action</f:facet> <h:commandLink action="#{userservice.delete}">Delete</h:commandLink> </h:column> </h:dataTable> </div> <div class="section"> <h:form> <fieldset class="buttonBox"> <h:commandButton action="#{userservice.readAll}" value="Show" class="button"/> </fieldset> </h:form> </div> <div class="section"> <h:form> <fieldset class="buttonBox"> <h:commandButton action="add" value="Add" class="button"/> </fieldset> </h:form> </div> </ui:define> </ui:composition>
I use the following Statefull Session Bean:
import static org.jboss.seam.ScopeType.SESSION; import java.util.List; import javax.ejb.Interceptor; import javax.ejb.Stateful; import javax.ejb.Stateless; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import org.apache.log4j.Logger; import org.jboss.seam.annotations.In; import org.jboss.seam.annotations.Name; import org.jboss.seam.annotations.Out; import org.jboss.seam.annotations.Scope; import org.jboss.seam.annotations.datamodel.DataModel; import org.jboss.seam.annotations.datamodel.DataModelSelectionIndex; import org.jboss.seam.ejb.SeamInterceptor; import de.mobileview.m4.core.security.User; @Stateful @Scope(SESSION) @Name("userservice") @Interceptor(SeamInterceptor.class) public class UserServiceImpl implements UserService { @PersistenceContext (unitName="merlix") protected EntityManager em; private static final Logger log = Logger.getLogger(UserService.class); @DataModel private List <User> userlist; @DataModelSelectionIndex private int userIndex; @In(required=false) @Out(required=false) private User user; public UserServiceImpl() { super(); log.debug("Constructor called"); } private void setUser() { user = userlist.get(userIndex); log.info( userIndex + "=>" + user); } public String add() { em.persist (user); return "success"; } public String update() { em.merge(user); return "success"; } public String load() { //return (User)em.createQuery("from User where uid='"+user.getUid()+"'").getSingleResult(); user=em.find(User.class,user); return "success"; } public String delete(){ if (userlist==null) return "success"; setUser(); em.remove(user); return "success"; } public String refresh() { em.refresh(user); return "success"; } @SuppressWarnings("unchecked") public String readAll() { userlist=em.createQuery("from User").getResultList(); return "success"; } }
Here the faces-config:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE faces-config PUBLIC "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN" "http://java.sun.com/dtd/web-facesconfig_1_1.dtd"> <faces-config> <application> <locale-config> <default-locale>de</default-locale> <supported-locale>de</supported-locale> <supported-locale>en</supported-locale> </locale-config> <message-bundle>UserMessages</message-bundle> </application> <navigation-rule> <from-view-id>/user/user.xhtml</from-view-id> <navigation-case> <from-outcome>success</from-outcome> <to-view-id>/user/user.xhtml</to-view-id> </navigation-case> <navigation-case> <from-outcome>add</from-outcome> <to-view-id>/user/adduser.xhtml</to-view-id> </navigation-case> <navigation-case> <from-action>#{userservice.delete}</from-action> <from-outcome>success</from-outcome> <to-view-id>/user/user.xhtml</to-view-id> </navigation-case> </navigation-rule> <navigation-rule> <from-view-id>/user/adduser.xhtml</from-view-id> <navigation-case> <from-outcome>success</from-outcome> <to-view-id>/user/edituser.xhtml</to-view-id> </navigation-case> </navigation-rule> <navigation-rule> <from-view-id>/user/edituser.xhtml</from-view-id> <navigation-case> <from-outcome>success</from-outcome> <to-view-id>/user/edituser.xhtml</to-view-id> </navigation-case> </navigation-rule> <application> <view-handler>com.sun.facelets.FaceletViewHandler</view-handler> </application> <application> <variable-resolver>org.jboss.seam.jsf.SeamVariableResolver</variable-resolver> </application> <lifecycle> <phase-listener>org.jboss.seam.jsf.SeamPhaseListener</phase-listener> </lifecycle> </faces-config>
Filling the table with "userservice.readAll" works fine. But if I try to use the delete method i get a duplicate id error:
java.lang.IllegalStateException: Duplicate id : _tagId2. Child could not be added. at javax.faces.component._ComponentChildrenList.checkAddAllowed(_ComponentChildrenList.java:95) at javax.faces.component._ComponentChildrenList.add(_ComponentChildrenList.java:76) at com.sun.facelets.tag.jsf.ComponentHandler.apply(ComponentHandler.java:152) at com.sun.facelets.tag.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:47) at com.sun.facelets.tag.ui.DefineHandler.apply(DefineHandler.java:58) at com.sun.facelets.tag.ui.InsertHandler.apply(InsertHandler.java:66) at com.sun.facelets.tag.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:47) at com.sun.facelets.compiler.NamespaceHandler.apply(NamespaceHandler.java:49) at com.sun.facelets.tag.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:47) at com.sun.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:248) at com.sun.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:294) at com.sun.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:273) at com.sun.facelets.impl.DefaultFaceletContext.includeFacelet(DefaultFaceletContext.java:121) at com.sun.facelets.tag.ui.CompositionHandler.apply(CompositionHandler.java:116) at com.sun.facelets.compiler.NamespaceHandler.apply(NamespaceHandler.java:49) at com.sun.facelets.impl.DefaultFacelet.apply(DefaultFacelet.java:95) at com.sun.facelets.FaceletViewHandler.buildView(FaceletViewHandler.java:400) at com.sun.facelets.FaceletViewHandler.renderView(FaceletViewHandler.java:434) at org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:372) at javax.faces.webapp.FacesServlet.service(FacesServlet.java:109) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173) at net.sf.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:292) at net.sf.acegisecurity.intercept.web.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:108) at net.sf.acegisecurity.intercept.web.SecurityEnforcementFilter.doFilter(SecurityEnforcementFilter.java:197) at net.sf.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:303) at net.sf.acegisecurity.ui.AbstractProcessingFilter.doFilter(AbstractProcessingFilter.java:324) at net.sf.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:303) at net.sf.acegisecurity.wrapper.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:50) at net.sf.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:303) at net.sf.acegisecurity.context.HttpSessionContextIntegrationFilter.doFilter(HttpSessionContextIntegrationFilter.java:220) at net.sf.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:303) at net.sf.acegisecurity.util.FilterChainProxy.doFilter(FilterChainProxy.java:173) at net.sf.acegisecurity.util.FilterToBeanProxy.doFilter(FilterToBeanProxy.java:120) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173) at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:81) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178) at org.jboss.web.tomcat.security.CustomPrincipalValve.invoke(CustomPrincipalValve.java:39) at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:159) at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:59) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105) at org.apache.catalina.valves.FastCommonAccessLogValve.invoke(FastCommonAccessLogValve.java:481) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:856) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:744) at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527) at org.apache.tomcat.util.net.MasterSlaveWorkerThread.run(MasterSlaveWorkerThread.java:112) at java.lang.Thread.run(Thread.java:595)
<UIViewRoot id="_id182" locale="de" renderKitId="HTML_BASIC" rendered="true" transient="false" viewId="/user/user.xhtml"> <HtmlOutputText escape="true" id="_tagId2" rendered="false" transient="false" value="Keine User gefunden"/> <HtmlDataTable border="-2147483648" first="0" id="_tagId3" rendered="false" rowIndex="-1" rows="0" transient="false" var="u"> <UIColumn id="_tagId4" rendered="true" transient="false"/> <UIColumn id="_tagId6" rendered="true" transient="false"> <HtmlCommandLink action="#{userservice.delete}" id="_tagId8" immediate="false" rendered="true" transient="false"/> </UIColumn> </HtmlDataTable> <HtmlForm enctype="application/x-www-form-urlencoded" id="_tagId9" rendered="true" submitted="false" transient="false"> <HtmlCommandButton action="#{userservice.readAll}" disabled="false" id="_tagId10" immediate="false" readonly="false" rendered="true" styleClass="button" transient="false" type="submit" value="Show"/> </HtmlForm> <HtmlForm enctype="application/x-www-form-urlencoded" id="_tagId11" rendered="true" submitted="false" transient="false"> <HtmlCommandButton action="add" disabled="false" id="_tagId12" immediate="false" readonly="false" rendered="true" styleClass="button" transient="false" type="submit" value="Add"/> </HtmlForm> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" SYSTEM "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" > <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/> <title>Merlix 4</title> <link href="../include/css/screen.css" rel="stylesheet" type="text/css"/> </head> <body> <div id="document"> <div id="header"> <div id="status"> Welcome </div> </div> <div id="container"> <div id="sidebar"> <h1>Menu</h1> <a href="../user/user.jsf" shape="rect">User</a> </div> <div id="content"> <div class="section"> <h1>Benutzer</h1> </div> <div class="section"> </UIViewRoot>
Any ideas?
Thanks
Claus