I realize that this is probably a n00b mistake and if it were a snake it prob'ly
woulda bit me, but I hope an answer to this will help others too. I've spent a couple
of days on this but cannot see what's wrong; I tried to search for similar issues but
didn't find anything and I don't see what's wrong with my example compared to
the examples. I've got an abstracted example here, I hope it's not too long to
post, but it should be complete.
I have a stateful session bean with scope defaulting to conversation that is backing a
page with a couple of <h:inputText> fields that are bound to a couple of
non-required bijected values, one being a String, the other a property of an entity bean.
I'm using Seam-managed transactions and persistence context.
My problems are:
1. For an <h:inputText> whose value is the property of a conversation-scoped context
variable managed by my SFSB, why is the property's setter never called with the value
typed in? (in bqmgr.xhtml below, typing a new value for the field next to the button
labeled "rename quux" and then pressing the button)
2. For an <h:inputText> whose value is a String conversation-scoped context variable
managed by my SFSB, why is the variable null (and apparently not injected from the value
typed in the form). (in bqmgr.xhtml below, typing in a value for the field next to the
button "New Baz Specifying Name" and then pressing the button)
I'm using Seam with facelets and EJB3.
As always, apologies if I've somehow missed a previous post or piece of RTFM
documentation.
Thanks,
David
bqmgr.xhtml
| <!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
| <html
|
xmlns="http://www.w3.org/1999/xhtml"
|
xmlns:f="http://java.sun.com/jsf/core"
|
xmlns:h="http://java.sun.com/jsf/html"
|
xmlns:s="http://jboss.com/products/seam/taglib"
|
xmlns:ui="http://java.sun.com/jsf/facelets"
| >
| <head>
| <meta http-equiv="Content-Type" content="text/html;
charset=iso-8859-1" />
| <title>Baz/Quux Manager</title>
| </head>
| <body>
| <div class="errors"><h:messages
globalOnly="true"/></div>
| <h:form>
| <s:link linkStyle="button" value="rename quux"
action="#{bqManager.commitQuux}" />
| <h:inputText value="#{quux.name}" />
| </h:form>
| <h:form>
| <h:outputText value="you have no bazs"
| rendered="#{bazList.rowCount == 0}" />
| <h:dataTable var="baz" value="#{bazList}"
| rendered="#{bazList.rowCount > 0}">
| <h:column>
| <h:outputText value="#{1+bazList.rowIndex}. "/>
| <s:link value="delete" action="#{bqManager.deleteBaz}"
linkStyle="button"/>
| <h:outputText value="#{baz.name}" />
| <br/>
| </h:column>
| </h:dataTable>
| <hr/>
| <s:link value="New Baz Specifying
Name" action="#{bqManager.createBazSpecifyingName}"
linkStyle="button" />
| <h:inputText value="#{namefornewbaz}"/>
| <hr/>
| <s:link value="New Baz" action="#{bqManager.createBaz}"
linkStyle="button" />
| </h:form>
| </body>
| </html>
|
BQManagerBean.java
| package com.orgmob.play;
|
| import java.io.Serializable;
| import java.util.HashSet;
| import java.util.List;
|
| import javax.ejb.Remove;
| import javax.ejb.Stateful;
| import javax.persistence.EntityManager;
|
| import org.jboss.seam.annotations.Begin;
| import org.jboss.seam.annotations.Destroy;
| import org.jboss.seam.annotations.End;
| import org.jboss.seam.annotations.Factory;
| import org.jboss.seam.annotations.In;
| import org.jboss.seam.annotations.Logger;
| import org.jboss.seam.annotations.Name;
| import org.jboss.seam.annotations.Out;
| import org.jboss.seam.annotations.datamodel.DataModel;
| import org.jboss.seam.annotations.datamodel.DataModelSelection;
| import org.jboss.seam.core.FacesMessages;
| import org.jboss.seam.log.Log;
|
| @Stateful
| @Name("bqManager")
| public class BQManagerBean implements BQManager, Serializable {
|
| @Logger
| private Log log;
|
| @In(required=false) @Out(required=false)
| private Quux quux;
|
| @In(required=false) @Out(required=false)
| private String nameForNewBaz;
|
| @DataModel(value="bazList")
| private List<Baz> bazList;
|
| @DataModelSelection(value="bazList")
| @Out(required=false)
| private Baz baz;
|
| @In(create=true)
| private EntityManager orgmobDatabase;
|
| @In(create=true)
| private transient FacesMessages facesMessages;
|
| @Begin(join=true)
| @Factory("quux")
| public void findQuuxen() {
| log.debug("looking for quux objects...");
| List<Quux> quuxList = (List<Quux>)orgmobDatabase.createQuery(
| "from Quux quux order by quux.id asc").getResultList();
| log.debug("found "+quuxList.size()+" quuxs in quuxList: "
+ quuxList );
| if ( 0 == quuxList.size() ) {
| quux = new Quux();
| quux.setName( "quux1" );
| orgmobDatabase.persist( quux );
| orgmobDatabase.flush();
| log.debug( "created: "+quux);
| }
| else {
| quux = quuxList.get(0);
| log.debug( "found: "+quux);
| }
| }
|
| @Begin(join=true)
| @Factory("bazList")
| public void findBazs() {
| log.debug("looking for baz objects...");
| bazList = (List<Baz>)orgmobDatabase.createQuery(
| "from Baz baz order by baz.id asc").getResultList();
| log.debug("found "+bazList.size()+" bazs in bazList: " +
bazList );
| }
|
| @End
| public void stop() {
| }
|
| private String newBazname() {
| // find a name not currently seen by user;
| HashSet<String> baznameS = new HashSet<String>();
| for ( Baz baz : bazList ) {
| baznameS.add( baz.getName() );
| }
| String baznamePrefix = "baz";
| String bazname;
| int attempt = 1;
| do {
| bazname = baznamePrefix + (attempt++);
| } while ( baznameS.contains( bazname ) );
| return bazname;
| }
|
| private void makeABaz( String name ) {
|
| baz = new Baz();
| baz.setName( name );
| orgmobDatabase.persist( baz );
| orgmobDatabase.flush();
|
| log.debug( "created: "+baz);
|
| findBazs(); // update bazList
| }
|
| public void createBaz() {
| makeABaz( newBazname() );
| }
|
| public void createBazSpecifyingName() {
| if ( null == nameForNewBaz ) {
| facesMessages.add("BQManagerBean.createBazSpecifyingName():
nameForNewBaz is null!");
| }
| makeABaz( nameForNewBaz );
| }
|
| public void commitQuux() {
| if ( null == quux ) {
| facesMessages.add("BQManagerBean.commitQuux() called but quux is
null!");
| log.error("BQManagerBean.commitQuux() called but quux is
null!");
| }
| else {
| log.debug("BQManagerBean.commitQuux(): pre-merge quux: "+quux);
| orgmobDatabase.merge( quux );
| orgmobDatabase.flush();
| }
| }
|
| public void commitBaz() {
| if ( null == baz ) {
| facesMessages.add("BQManagerBean.commitBaz() called but baz is
null!");
| log.error("BQManagerBean.commitBaz() called but baz is null!");
| }
| else {
| log.debug("BQManagerBean.commitBaz(): pre-merge baz: "+baz);
| orgmobDatabase.merge( baz );
| orgmobDatabase.flush();
| }
| }
|
| public void deleteBaz() {
| if ( null == baz ) {
| facesMessages.add("BQManagerBean.deleteBaz() called but baz is
null!");
| log.error("BQManagerBean.deleteBaz() called but baz is null!");
| }
| else {
| log.debug("removing "+baz+"...");
| orgmobDatabase.remove( baz );
| orgmobDatabase.flush();
| log.debug( "baz removed.");
| findBazs(); // update bazList
| }
| }
|
| @Destroy @Remove
| public void destroy() {
| }
|
| }
|
Baz.java
| package com.orgmob.play;
|
| import java.io.Serializable;
|
| import javax.persistence.Column;
| import javax.persistence.Entity;
| import javax.persistence.GeneratedValue;
| import javax.persistence.Id;
| import javax.persistence.Table;
|
| import org.jboss.seam.annotations.Name;
|
| @Entity
| @Name("baz")
| @Table(name="BAZS")
| public class Baz implements Serializable {
|
| private long id;
| private String name;
|
| @Id
| @Column(name="BAZ_ID")
| @GeneratedValue
| public Long getId() {
| return id;
| }
| public void setId(Long id) {
| this.id = id;
| }
|
| @Column(name="NAME")
| public String getName() {
| System.out.println("Baz.getName():returning:"+name);
| return name;
| }
| public void setName(String name) {
| System.out.println("Baz.setName():setting name to:"+name);
| this.name = name;
| }
|
| @Override
| public String toString() {
| return "Baz[" + name + "]";
| }
|
| }
|
Quux.java
| package com.orgmob.play;
|
| import java.io.Serializable;
|
| import javax.persistence.Column;
| import javax.persistence.Entity;
| import javax.persistence.GeneratedValue;
| import javax.persistence.Id;
| import javax.persistence.Table;
|
| import org.jboss.seam.annotations.Name;
|
| @Entity
| @Name("quux")
| @Table(name="QUUXS")
| public class Quux implements Serializable {
|
| private long id;
| private String name;
|
| @Id
| @Column(name="QUUX_ID")
| @GeneratedValue
| public Long getId() {
| return id;
| }
| public void setId(Long id) {
| this.id = id;
| }
|
| @Column(name="NAME")
| public String getName() {
| System.out.println("Quux.getName():returning:"+name);
| return name;
| }
| public void setName(String name) {
| System.out.println("Quux.setName():setting name to:"+name);
| this.name = name;
| }
|
| @Override
| public String toString() {
| return "Quux[" + name + "]";
| }
|
| }
|
BQManager.java
| package com.orgmob.play;
|
| import javax.ejb.Local;
|
| @Local
| public interface BQManager {
| public void findQuuxen();
| public void findBazs();
| public void stop();
| public void createBaz();
| public void createBazSpecifyingName();
| public void commitQuux();
| public void commitBaz();
| public void deleteBaz();
| public void destroy();
| }
|
persistence.xml
| <persistence>
| <persistence-unit name="orgmobDB">
| <provider>org.hibernate.ejb.HibernatePersistence</provider>
| <jta-data-source>java:/DefaultDS</jta-data-source>
| <properties>
| <property name="hibernate.hbm2ddl.auto"
value="create-drop"/>
| <property name="jboss.entity.manager.factory.jndi.name"
| value="java:/EntityManagerFactories/orgmobData" />
| </properties>
| </persistence-unit>
| </persistence>
|
components.xml
| <components>
| <component name="org.jboss.seam.core.init">
| <property name="myFacesLifecycleBug">true</property>
| <property
name="jndiPattern">member/#{ejbName}/local</property>
| </component>
| <component class="org.jboss.seam.core.Ejb"
| installed="false"/>
| <component name="orgmobDatabase"
| class="org.jboss.seam.core.ManagedPersistenceContext">
| <property
name="persistenceUnitJndiName">java:/EntityManagerFactories/orgmobData</property>
| </component>
| </components>
|
View the original post :
http://www.jboss.com/index.html?module=bb&op=viewtopic&p=3962327#...
Reply to the post :
http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&a...