[jboss-user] [JBoss Seam] - Stateless search to stateful conversation

justinwalsh do-not-reply at jboss.com
Wed Jul 19 10:20:18 EDT 2006


Hi, 

I have a seam component "FindDocumentAction" (a stateless EJB) which is responsible for the search functionality of the application.  The user is able to search for documents by entering a reference number.

The outcome of a search can be one of two things:
 1) When multiple documents  are returned, the search results page is displayed, with a link to display each document (viewdocument page)
 2) When a single document is returned from the search (singleton search), we send the user straight on to the viewdocument page for the document.

The viewing of the document is the start of a conversation, handled by a stateful seam component (stateful session bean - viewDocumentAction). 

In the first case (multiple search results returned), I generate a link in the results page as follows, which passes in a request parameter containing the document identifier (documentId):


  | <s:link action="#{viewDocumentAction.selectDocument}">
  |   <f:param name="documentId" value="#{doc.id}"/>
  |   <h:outputText value="#{doc.reference}"/>
  | </s:link>
  | 

This link invokes the selectDocument() method of the viewDocumentAction component  (the conversational scoped stateful session bean) - which is annotated with the @Begin tag - and a new conversation is begun:


  | @Stateful
  | @Name("viewDocumentAction")
  | @Scope(ScopeType.CONVERSATION)
  | public class ViewDocumentAction implements ViewDocument {
  | 
  |    @PersistenceContext(type=PersistenceContextType.EXTENDED)
  |     private EntityManager em;
  | 
  |    @Out
  |     private Document document; 
  | 
  |     @RequestParameter("documentId")
  |     private Integer documentId;  
  | 
  |     @Begin
  |     public String selectDocument() {
  |         
  |         document = (Document)em.createQuery(
  |                 "from Document d where d.id = :documentId")
  |                 .setParameter("documentId", documentId)
  |                 .getSingleResult();
  |         
  |         return "viewDocument";
  |     }
  | }
  | 


The second case is what is troubling me.  I've tried the following approaches with mixed results:

1) Forward straight to the viewDocument page, and create an entry in the pages.xml file:

  | <page view-id="/secure/viewDocument.xhtml" action="#{viewDocumentAction.selectDocument}" />
  | 
... which invokes the selectDocument() method.  This also necessitates a change from using  the s:link tag mentioned above to using a simple link to the page - as we don't want to invoke the action selectDocument() twice.  The request parameter does not seem to be present when the event is generated.

2) In the case of the singleton search result, lookup the stateful bean from the stateless session beans find method:

  | 
  |   if (documentSearchResults.size() == 1) {
  |     // lookup viewDocumentAction
  |     ViewDocument viewDocumentAction = ....
  | 
  |     Document singleDocument = documentSearchResults.get(0);
  |     return viewDocumentAction.selectDocument(singleDocument);
  |   }
  | 
  | 

thus invoking a new method on the stateful bean which is also used to start the conversation:


  |     @Begin
  |     public String selectDocument(Document doc) {
  |         
  |         document = em.merge(doc);        
  |         return "viewDocument";
  |     }
  | 
Since I am in a stateless component, I don't want to inject a stateful bean using the @EJB tag, as the stateless bean could potentially be shared by multiple clients.  The  lookup is thus scoped to the method, manual and therefore ugly (jndi name may vary depending on type of deployment etc).  
(BTW Should I be asking seam to resolve the named stateful component or should I just do a ejb context lookup and rely on seam to intercept?)


What I'm effectively trying to achieve is to start a conversation (by invoking a components @Begin method) with a request parameter present but this is proving tricky to to programatically.  Perhaps I should redirect the client with the request parameter (as per the RESTful example) in the case of a singleton search - but how do I ensure that the conversation is begun when I hit the viewDocument page?

Any pointers would be appreciated.

Thanks

View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=3959155#3959155

Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=3959155



More information about the jboss-user mailing list