How to instantiate an entity with certain properties pre-set before use
gozzie Oct 20, 2011 5:42 AMIn a core JSF project, I used to initialize certain properties of an entity object with pre-defined values as early as its instantiation in a @PostConstruct method of a jsf managed bean (or even the managed bean's constructor). I can no longer preserve this functionality when porting the project to Seam with the managed bean gone.
Here's my code:
The entity class:
@Entity @Name("task") // this line in Seam version public class Task implements Serializable { private Integer id; private String subject; private Date creationDate; private Date completionDate; private Category category; private User user; public Task() { } public Task(Date creationDate) { this.creationDate = creationDate; this.user = user; } // getters & setters, etc. }
The JSF Managed Bean
public class TaskBean extends BaseBean { // Super class provides the logged in user object and a default category object private Task task = new Task(java.util.Calendar.getInstance().getTime(), this.user); @PostConstruct public void initTaskBean() { if (certainConditionMet) task.setCategory(defaultCategory); } // Other managed bean business... }
The JSF page
<h:form> <h:panelGrid columns="2"> Date: <h:outputText value="#{taskBean.task.creationDate}"> <f:convertDateTime pattern="dd/MM/yyyy" /> </h:outputText> User: <h:outputText value="#{taskBean.task.user.name}" /> Subject: <h:inputText value="#{taskBean.task.subject}" id="subjectField" /> Category: <h:selectOneMenu value="#{taskBean.task.category}" id="catMenu"> <f:selectItems value="#{taskBean.categories}" /> </h:selectOneMenu> // remaining stuff </h:panelGrid> </h:form>
The Stateless Session Bean in Seam version also assuming the responsibility of the jsf managed bean
@Name("taskAction") @Stateless public class TaskAction implements TaskActionLocal { @PersistenceContext private EntityManager em; @In private FacesMessages facesMessages; @In User user; @In Category defaultCategory @Logger private Log log; @In // private Task task = new Task(java.util.Calendar.getInstance().getTime(), user) // the above didn't work so private Task task; @PostConstruct public void baslarken() { System.out.println("TaskAction PostConstructed"); task = new task(java.util.Calendar.getInstance().getTime(), user); if (certainConditionMet) task.setCategory(defaultCategory); // the above won't work either. Date and User always blank on the ui form } // other business methods, etc }
Seam version of the form:
<h:form id="todo" styleClass="edit"> <rich:panel> <f:facet name="header">Task To Do</f:facet> <s:decorate id="dateField" template="layout/edit.xhtml"> <ui:define name="label">Date:</ui:define> <h:outputText value="#{task.creationDate}"/> </s:decorate> <s:decorate id="userField" template="layout/edit.xhtml"> <ui:define name="label">User:</ui:define> <h:outputText value="#{task.user.name}"/> </s:decorate> <s:decorate id="subjectField" template="layout/edit.xhtml"> <ui:define name="label">Başlık</ui:define> <h:inputText id="subject" required="true" value="#{task.subject}" > <a4j:support event="onblur" reRender="subjectField" bypassupdates="true" ajaxSingle="true" /> </h:inputText> </s:decorate> <!-- other components, etc --> </rich:panel> </h:form>
I need advice on how to make the task object to hold the date and logged in user data (and preferably a default category) pre-populated when instantiated.