[jboss-user] [JBoss Seam] - Force method to be run before page redirect (no pages.xml!)

w17chm4n do-not-reply at jboss.com
Thu Jan 24 11:23:11 EST 2008


Hi again ;)

I have another problem with seam. Is there a way to force seam to run some method before it redirects to the page ? And is it possible that seam is cache`ing lists used as datamodels ?

If you are a bit confussed, let me explain.

Here I have my view

  | <h:dataTable styleClass="dataTable" columnClasses="categoryName" var="question" value="#{cat.questionList}">
  |                                     <h:column>
  |                                         <h:outputText value="#{question.questionText}"/>
  |                                     </h:column>
  |                                     <h:column>
  |                                         <h:commandButton type="button" image="./images/tbl_ico_del.png" style="border: none" action="#{QuestionController.removeQuestion(question)}"/>
  |                                     </h:column>
  |                                 </h:dataTable>
  | 

As U can see it uses questionCategoryList generated by the bean below.


  | @Stateless
  | @Name("QuestionCategoryController")
  | public class QuestionCategoryControllerBean implements QuestionCategoryController {
  |     
  |     @Logger
  |     private Log log;
  |     
  |     @In(create = true)
  |     private QuestionCategoryManager questionCategoryManager;
  |     
  |     @In(create = true)
  |     private QuestionCategory questionCategory;
  |     
  |     @DataModel
  |     private List<QuestionCategory> questionCategoryList;
  |     
  |     @In(required = true)
  |     private FieldValidator fieldValidator;
  |     
  |     public void addCategory() {
  |         if(fieldValidator.validate(questionCategory,"addCategoryForm","categoryName")) {
  |             questionCategoryManager.addCategory(this.questionCategory);
  |             this.questionCategory = null;
  |             this.questionCategoryList = null;
  |         }
  |     }
  |     
  |     @SuppressWarnings("unchecked")
  |     public void removeSelectedCategories() {
  |         QuestionCategory qc;
  |         Iterator it = questionCategoryList.iterator();
  | 
  |         while(it.hasNext()) {
  |             qc = (QuestionCategory) it.next();
  |             
  |             if(qc.isSelected()) {
  |                 questionCategoryManager.removeCategory(qc);
  |             }
  |         }
  | 
  |         this.questionCategoryList = null;
  |     }
  |     
  |     public void removeCategory(QuestionCategory questionCategory) {
  |         questionCategoryManager.removeCategory(questionCategory);
  |         this.questionCategory = null;
  |         this.questionCategoryList = null;
  |     }
  | 
  |     public QuestionCategory getQuestionCategory() {
  |         return questionCategory;
  |     }
  | 
  |     public void setQuestionCategory(QuestionCategory questionCategory) {
  |         this.questionCategory = questionCategory;
  |     }
  |     
  |     @Factory("questionCategoryList")
  |     public void createQuestionCategoryList() {
  |         this.questionCategoryList = this.questionCategoryManager.getAllQuestionCategories();
  |     }
  |     
  |     @Remove
  |     public void destroy() {
  |     }
  | }
  | 

Well the view works, and it renders ok, but the problem is when I want to remove a question from the category by running #{QuestionController.removeQuestion(question)} from the view.

The question is removed from the database, but when the page reloads, it`s still in the list !

I`m removing question by using another bean

  | @Stateless
  | @Name("questionManager")
  | public class QuestionManagerBean implements QuestionManager {
  |     
  |     @Logger
  |     Log log;
  |     
  |     @In
  |     private EntityManager entityManager;
  |     
  |     public void addQuestion(Question question) {
  |         question.setCreated(new Date());
  |         entityManager.persist(question);
  |         log.info("Question successfully persisted. [" + question.getQuestionText() + "]");
  |     }
  | 
  |     public void removeQuestion(Question question) {
  |         log.info("Removing question [" + question.getQuestionText() + "]");
  |         entityManager.flush();
  |         entityManager.remove(entityManager.merge(question));
  |     }
  | 
  |     public Question getQuestion(Question question) {
  |         return null;
  |     }
  |     
  |     @SuppressWarnings("unchecked")
  |     public List<Question> getAllQuestions() {
  |         return entityManager.createQuery("from Question q").getResultList();
  |     }
  |     
  |     @Remove 
  |     public void destroy() {}
  |     
  | }
  | 

After putting some breakepoints and running this metod from view I found this:

  | 17:04:36,893 INFO  [QuestionCategoryManagerBean] Reciving QuestionCategory list
  | 17:04:37,494 INFO  [QuestionManagerBean] Removing question [hdfghdfghf]
  | 

As far as I`m concerned, as the questionCategoryList is generated by a stateless bean, the list has to be recived from the database everytime my code recals to it. So as I want to remove question from some category, seam needs to get current list from the database, then lazy-fetch the question, inject it to the metod, and pass to  the removeQuestion method in the questionManagerBean. It`s allright, but why Seam isn`t refreshing the list after the question is removed ? I mean that even though question is removed form the database, the list rendered as dataModel on view by dataTable, just after reloading the page, the question is still on the list. But what is strange, when I hit reload on my browser (F5 or sth) the list is recived from the database once again and rendered view is correct, without removed question !

I`ve tryed a couple of my ideas (including <action execute="refresh_this_stupid_list> setted in the view section in pages.xml)  to fix this crap, even something like this

  | @In(value="#{questionCategoryList}")
  | private ListDataModel tmp;
  | .
  | .
  | .
  | public void removeQuestion(Question question) {
  |         if(question.getQuestionType().getId().equals(questionTypeManager.getQuestionTypeByName(propertiesManager.get("questiontype.input")).getId())) {
  |             questionManager.removeQuestion(question);
  |         } else {            
  |             answerManager.removeAnswers(question.getAnswers());
  |             questionManager.removeQuestion(question);
  |         }
  |         tmp.setWrappedData(questionCategoryManager.getAllQuestionCategories());
  |     }
  | 

But even though that in logs it looked allright

  | 17:04:36,893 INFO  [QuestionCategoryManagerBean] Reciving QuestionCategory list
  | 17:04:37,494 INFO  [QuestionManagerBean] Removing question [hdfghdfghf]
  | 17:04:37,516 INFO  [QuestionCategoryManagerBean] Reciving QuestionCategory list
  | 

The list rendered on the view, wasn`t refreshed and contained removed question.

Any idea how to work this thing out ?

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

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



More information about the jboss-user mailing list