Possible to use a session bean seam component to host a valueChangeListener method?
dxxvi Nov 10, 2008 9:10 PMI modify a little bit the Message example of Seam reference. This is the messages.xhtml:
<h:form>
<h:outputText value="No messages to display" rendered="#{messages.rowCount == 0}"/>
<h:dataTable value="#{messages}" rendered="#{messages.rowCount > 0}" var="message">
<h:column>
<f:facet name="header"><h:outputText value="Read" /></f:facet>
<h:selectBooleanCheckbox value="#{message.read}" valueChangeListener="#{messageManager.markMessage}"/>
</h:column>
<h:column>
<f:facet name="header"><h:outputText value="Title" /></f:facet>
<h:commandLink value="#{message.title}" action="#{messageManager.select}"/>
</h:column>
<h:column>
<f:facet name="header"><h:outputText value="Date/Time" /></f:facet>
<h:outputText value="#{message.datetime}">
<f:convertDateTime type="both" dateStyle="medium" timeStyle="short"/>
</h:outputText>
</h:column>
<h:column>
<h:commandButton value="Delete" action="#{messageManager.delete}"/>
</h:column>
</h:dataTable>
<h3><h:outputText value="#{message.title}" /></h3>
<h:outputText value="#{message.text}"/>
</h:form>I added a valueChangeListener method to the check boxes. In the MessagesManageBean, I added a method to catch the valueChangeListener event.
@Stateful
@Scope(ScopeType.SESSION)
@Name("messageManager")
public class MessageManagerBean implements Serializable, MessageManager {
private final Log log = LogFactory.getLog(getClass());
@DataModel
private List<Message> messages;
@DataModelSelection
@Out(required = false)
private Message message;
@PersistenceContext(type = PersistenceContextType.EXTENDED)
private EntityManager entityManager;
@Override
@SuppressWarnings("unchecked")
@Factory("messages")
public void findMessage() {
messages = entityManager.createQuery("select m from Message m order by m.datetime desc")
.getResultList();
}
@Override
public void select() {
message.setRead(true);
}
@Override
public void delete() {
messages.remove(message);
entityManager.remove(message);
message = null;
}
@Override
public void markMessage(ValueChangeEvent event) {
log.debug(new StringBuilder("Check if Seam intercepts the valueChangeListener:\n")
.append("Old value: ").append(defaultIfNull(event.getOldValue(), "null")).append("--> new value")
.append(defaultIfNull(event.getNewValue(), "null")).append('\n').append("Message: ")
.append(defaultIfNull(message, "no message title because the message is null")));
}
@Override
@Remove
public void destroy() {
}
}I noticed that the markMessage wasn't called although there's no exception!