@Factory method kills my @In fields
tomstrummer Dec 20, 2007 10:42 AMI've narrowed this down as much as possible... Basically I have an @Factory method in stateless action bean. When I hit the page, I get:
In attribute requires non-null value: test.entity
The same happens if the action is a stateful SB.
Here is a simple example which duplicates the behavior:
view/test.xhtml
<!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:s="http://jboss.com/products/seam/taglib" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html" xmlns:rich="http://richfaces.org/rich" template="layout/template.xhtml"> <ui:define name="body"> <h:messages globalOnly="true" styleClass="message"/> <rich:panel> <f:facet name="header">Test!</f:facet> <h:form> <h:inputText value='#{testProfile.profileName}' /> <h:commandButton type="submit" value='Create' action='#{test.biteMe}' /> <h:dataTable value='#{something}' var='profile'> <h:column> <f:facet name='header'><h:outputText value='Name' /></f:facet> <h:outputText value='#{profile.profileName}' /> </h:column> </h:dataTable> </h:form> </rich:panel> </ui:define> </ui:composition>
action/TestImpl.java:
import java.util.ArrayList; import java.util.List; import javax.ejb.Stateless; import org.jboss.seam.ScopeType; 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.datamodel.DataModel; import org.jboss.seam.log.Log; @Stateless @Name("test") public class TestImpl implements Test { @Logger Log log; public void biteMe() { log.info( entity.getName() ); something.add(entity); } @In(scope=ScopeType.EVENT) private TestEntity entity; @DataModel(scope=ScopeType.PAGE) List<TestEntity> something; @Factory("something") public List<TestEntity> initSomething() { List<TestEntity> list = new ArrayList<TestEntity>(); return list; } }
action/Test.java
import java.util.List; import test.model.TestEntity; import com.enernoc.ess.emulator.model.configuration.Profile; public interface Test { public void biteMe(); public List<TestEntity> initSomething(); }
model/TestEntity.java
import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Version; import org.jboss.seam.annotations.Name; @Entity @Name("testEntity") public class TestEntity { @Id @GeneratedValue private Long ID; @Version private Long version; private String name; public String getName() { return this.name; } public void setName(String name) { this.name = name; } }
Any help would be greatly appreciated... This is so simple I can't see why it wouldn't work. The @Factory annotation says it is only responsible for the named field, meaning it is only a factory for "something," not "entity".
THanks.