Seam/JSF thinks action method to be property...
dahm Jun 21, 2006 8:46 AMHi,
I've got a list of data which I want to be able to apply filters to. That is,
I put a combobox on top with a submit button. This shall render the list
using a new query:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE html 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:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" xmlns:c="http://java.sun.com/jstl/core"
xmlns:s="http://jboss.com/products/seam/taglib" xmlns:t="http://myfaces.apache.org/tomahawk" lang="de" xml:lang="de">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/>
<title>Abrechnung Integrierte Versorgung</title>
<link href="ingver.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<ui:composition template="/includes/template.xhtml">
<ui:param name="title" value="Liste aller Verträge"/>
<ui:define name="logo">
<ui:include src="/includes/header.xhtml"/>
</ui:define>
<ui:define name="links">
<ui:include src="/includes/navigation.xhtml"/>
</ui:define>
<ui:define name="inhalt">
<f:view>
<h:form>
<h:selectOneMenu value="#{listVertraege.vertragsFilter}" converter="#{vertragsFilterConverter}">
<f:selectItems value="#{vertragsFilterConverter.vertragsFilter}"/>
</h:selectOneMenu>
<!--h:commandButton type="submit" action="#{listVertraege.filter}" value="Filtern"/-->
<s:link value="Filtern" action="#{listVertraege.filter}" linkStyle="button"/>
</h:form>
</f:view>
<f:view>
<h:form>
<h:outputText value="Keine Verträge vorhanden" rendered="#{vertraege.rowCount==0}"/>
<h:dataTable var="v" value="#{vertraege}" rows="5" rendered="#{vertraege.rowCount>0}"
id="vertraglist">
<h:column>
<f:facet name="header">
<h:outputText value="Vertragskurzname"/>
</f:facet>
<s:link value="#{v.name}" action="#{listVertraege.select}"/>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Vertragsbeginn"/>
</f:facet>
<h:outputText value="#{v.vertragsBeginn}">
<f:convertDateTime pattern="dd.MM.yyyy"/>
</h:outputText>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Vertragsende"/>
</f:facet>
<h:outputText value="#{v.vertragsEnde}">
<f:convertDateTime pattern="dd.MM.yyyy"/>
</h:outputText>
</h:column>
<h:column>
<s:link value="Editieren" action="#{listVertraege.edit}" linkStyle="button"/>
</h:column>
<h:column>
<s:link value="Beenden" action="#{listVertraege.end}" linkStyle="button"
onclick="javascript:return confirm('Wollen Sie diesen Vertrag wirklich beenden?');"/>
</h:column>
<!--h:column>
<s:link value="Löschen" action="#{listVertraege.delete}" linkStyle="button"
onclick="return confirm('Wollen Sie diesen Vertrag wirklich löschen?');"/>
</h:column-->
</h:dataTable>
<t:dataScroller for="vertraglist" id="scroller" fastStep="3" pageIndexVar="indexVar"
pageCountVar="countVar">
<f:facet name="first"> Erster </f:facet>
<f:facet name="previous">
<
</f:facet>
<f:facet name="next">
>
</f:facet>
<f:facet name="last"> Letzter </f:facet>
<f:facet name="fastforward">
>>
</f:facet>
<f:facet name="fastrewind">
<<
</f:facet>
</t:dataScroller>
<hr/>
<h3>
<h:outputText value="#{vertrag.name}"/></h3>
<div>
<h:outputText value="#{vertrag.beschreibung}"/>
</div>
<div><b>Vertragspartner:</b>
<h:outputText value="#{vertrag.vertragspartner}"/>
</div>
<br></br>
<div><b>Patienten:</b>
<h:outputText value="#{vertrag.patienten}"/>
</div>
</h:form>
</f:view>
<ui:include src="/includes/footer.xhtml"/>
</ui:define>
</ui:composition>
</body>
</html>
The interesting part is in the first <h:form>.
The bean looks like this:
@Stateful
@Scope(ScopeType.SESSION)
@Name("listVertraege")
@Interceptors(SeamInterceptor.class)
public class ListVertragActionBean implements ListVertragAction {
private static final Category _logger = Logger.getInstance(ListVertragActionBean.class);
private static final long serialVersionUID = 1L;
@DataModel(value = "vertraege")
private List<Vertrag> _vertraege;
@Out(required = false, value = "vertrag")
@DataModelSelection
private Vertrag _vertrag;
@SuppressWarnings("unused")
@Out(value = "vertragReadOnly", required = false)
private Boolean _vertragReadOnly;
@PersistenceContext(type = EXTENDED)
private EntityManager _em;
private VertragsFilter _vertragsFilter = new VertragsFilter(VertragsFilter.ALLE);
@SuppressWarnings("unchecked")
@Factory("vertraege")
public void findVertraege() {
// TODO: Use chosen filter
_vertraege = _em.createQuery("FROM Vertrag v ORDER BY v.vertragsBeginn").getResultList();
}
public String select() {
return "selected";
}
public String delete() {
_logger.debug("Löschen des Vertrags: " + _vertrag);
_vertrag.removeAllVertragspartner();
_vertrag.removeAllPatient();
_vertraege.remove(_vertrag);entfernen
_em.remove(_vertrag);
_vertrag = null;
return "deleted";
}
public String edit() {
return rereadAndEdit(false);
}
public String end() {
return rereadAndEdit(true);
}
private String rereadAndEdit(boolean readonly) {
_vertragReadOnly = readonly;
_em.refresh(_vertrag);
return "editVertrag";
}
public VertragsFilter getVertragsFilter() {
_logger.warn("getVertragsFilter: " + _vertragsFilter);
return _vertragsFilter;
}
public void setVertragsFilter(VertragsFilter vertragsFilter) {
_logger.warn("setVertragsFilter: " + vertragsFilter);
_vertragsFilter = vertragsFilter;
}
public String filter() {
_logger.warn("filter: " + _vertragsFilter);
return "hallo";
}
@Remove
@Destroy
public void destroy() {
_logger.debug("Bean wird entfernt: " + _vertrag);
}
}
But this gives me the following exception:
javax.el.PropertyNotFoundException: Bean: $Proxy609, property: filter at com.sun.facelets.el.LegacyELContext$LegacyELResolver.getValue(LegacyELContext.java:146) at com.sun.el.parser.AstValue.getValue(AstValue.java:117) at com.sun.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:192) at com.sun.facelets.el.ELText$ELTextVariable.toString(ELText.java:174) at com.sun.facelets.el.ELText$ELTextComposite.toString(ELText.java:115) at com.sun.facelets.compiler.CommentInstruction.write(CommentInstruction.java:38) at com.sun.facelets.compiler.UIInstructions.encodeBegin(UIInstructions.java:39) at com.sun.facelets.tag.jsf.ComponentSupport.encodeRecursive(ComponentSupport.java:232) at com.sun.facelets.tag.jsf.ComponentSupport.encodeRecursive(ComponentSupport.java:239) at com.sun.facelets.tag.jsf.ComponentSupport.encodeRecursive(ComponentSupport.java:239) at com.sun.facelets.FaceletViewHandler.renderView(FaceletViewHandler.java:554) at org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:384) at javax.faces.webapp.FacesServlet.service(FacesServlet.java:138) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173) at org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:144) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173) at org.jboss.seam.servlet.SeamRedirectFilter.doFilter(SeamRedirectFilter.java:30) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173) at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178) at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:175) at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:74) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869) at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664) at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527) at org.apache.tomcat.util.net.MasterSlaveWorkerThread.run(MasterSlaveWorkerThread.java:112) at java.lang.Thread.run(Thread.java:595) 14:29:52,109 ERROR [[Faces Servlet]] Servlet.service() for servlet Faces Servlet threw exception javax.el.PropertyNotFoundException: Bean: $Proxy609, property: filter at com.sun.facelets.el.LegacyELContext$LegacyELResolver.getValue(LegacyELContext.java:146) at com.sun.el.parser.AstValue.getValue(AstValue.java:117) at com.sun.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:192) at com.sun.facelets.el.ELText$ELTextVariable.toString(ELText.java:174) at com.sun.facelets.el.ELText$ELTextComposite.toString(ELText.java:115) at com.sun.facelets.compiler.CommentInstruction.write(CommentInstruction.java:38) at com.sun.facelets.compiler.UIInstructions.encodeBegin(UIInstructions.java:39) at com.sun.facelets.tag.jsf.ComponentSupport.encodeRecursive(ComponentSupport.java:232) at com.sun.facelets.tag.jsf.ComponentSupport.encodeRecursive(ComponentSupport.java:239) at com.sun.facelets.tag.jsf.ComponentSupport.encodeRecursive(ComponentSupport.java:239) at com.sun.facelets.FaceletViewHandler.renderView(FaceletViewHandler.java:554) at org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:384) at javax.faces.webapp.FacesServlet.service(FacesServlet.java:138) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173) at org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:144) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173) at org.jboss.seam.servlet.SeamRedirectFilter.doFilter(SeamRedirectFilter.java:30) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173) at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178) at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:175) at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:74) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869) at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664) at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527) at org.apache.tomcat.util.net.MasterSlaveWorkerThread.run(MasterSlaveWorkerThread.java:112) at java.lang.Thread.run(Thread.java:595)
Why does he possibly think the "filter" is property? I understand the he
wants to call a method getFilter() and there is none. But why is that?
I have seen similar code in the examples and it works.
I tried to use just one form or commandButton, but that doesn't work either.
Puzzled
Markus