Stateless bean holding data?
oberiko Jan 25, 2008 2:48 PMHello,
I have two pages, edit and search. From the edit screen, the user can go to the search screen (which also contains a list). From the search/list screen, they can select an entity to edit.
The problem is that my list, which is part of a stateless session bean, is being retained throughout trips to the search/list page. I.e., the previous search results are being shown after leaving and coming back.
Is this the expected behaviour? My edit page is backed by a stateful session bean using the default conversation scope, so could that be throwing things off? Should I just add a "clearList()" call to my links from the search page to empty it as I leave?
The code for the list page and its stateless session bean are below:
package org.domain.myProject.session;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.domain.myProject.entity.Person;
import org.domain.myProject.session.local.SearchPeopleLocal;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Logger;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.faces.FacesMessages;
import org.jboss.seam.framework.EntityQuery;
import org.jboss.seam.log.Log;
@Stateless
@Name("searchPeople")
public class SearchPeopleAction implements SearchPeopleLocal {
@Logger
private Log log;
@In
FacesMessages facesMessages;
@PersistenceContext
private EntityManager em;
private List<Person> peopleList;
@SuppressWarnings("unchecked")
public void search() {
/*
* We are using an EntityQuery since it seems to be the quickest solution to
* dynamic searches.
*/
EntityQuery eq = new EntityQuery();
eq.setEntityManager(em);
eq.setEjbql("from Person p");
/*
* The EntityQuery can have restrictions (basically the "WHERE" part of the SQL)
* placed on the returned results. Since they are (I believe) called remotely
* from this class, we have to pass the 'seamComponent.parameter' (which is
* the value that we'll be restricting on) in expression language
*/
List<String> restrictions = new ArrayList<String>();
restrictions.add("lower(p.name) like lower(concat('%',#{searchPeople.name},'%'))");
eq.setRestrictions(restrictions);
peopleList = eq.getResultList();
if (peopleList.size() == 0)
facesMessages.add("Search returned no results");
log.info("Result list size is #0", log.info("Result list size is #0", peopleList.size());
}
// ************ The below variables (and their getters / setters) are used to make
// ************ the dynamic query
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<Person> getPeopleList() {
return peopleList;
}
public void setPeopleList(List<Person> peopleList) {
this.peopleList = peopleList;
}
}
<!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:s="http://jboss.com/products/seam/taglib"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html">
<f:view>
<h:form>
<h:inputText value="#{searchPeople.name}" />
<h:commandButton action="#{searchPeople.search()}" value="Search" />
<h:dataTable value="#{searchPeople.peopleList}" var="person"
rendered="#{not empty searchPeople.peopleList}">
<h:column>
<f:facet name="header">
<h:outputText value="Id" />
</f:facet>
<s:link value="#{person.id}" view ="/editPerson.xhtml">
<f:param name ="personId" value="#{person.id}" />
</s:link>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Name" />
</f:facet>
<h:outputText value="#{person.name}" />
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Number of emails" />
</f:facet>
<h:outputText value="#{person.emailAddresses.size}" />
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Actions" />
</f:facet>
</h:column>
</h:dataTable>
</h:form>
<h:messages />
</f:view>
</html>
If it's of any use, I can also post the code for the edit page and it's stateful session bean.
Thanks!