web-dev-qa-db-ger.com

javax.el.PropertyNotFoundException: Die Eigenschaft 'foo' wurde im Typ com.example.Bean nicht gefunden

Ich habe Ergebnisse von

Query query = session.createQuery("From Pool as p left join fetch p.poolQuestion as s");

abfrage und ich möchte es in JSP anzeigen.

Ich habe Schleife:

<c:forEach items="${pools}" var="pool"> 

    <p>${pool.name}</p>

</c:forEach>

und ich möchte Ergebnisse aus der poolQuestion-Tabelle (die Join-Tabelle) anzeigen. Der Wert, den ich anzeigen möchte, ist 'answer'.

Wie kann ich es tun?

<c:forEach items="${pools}" var="pool"> 
    <p>${pool.answer}</p>
    <p>${pool.name}</p>             
</c:forEach>

Der obige Code funktioniert nicht.

Der Fehler ist:

  org.Apache.jasper.JasperException: An exception occurred processing JSP page /WEB-INF/views/home.jsp at line 21

18:     <c:forEach items="${pools}" var="pool"> 
19:             
20:             <p>${pool.name}</p>
21:             <c:out value="${pool.poolQuestion.answer}"/>
22:             
23:     </c:forEach>
24: 

    SEVERE: Servlet.service() for servlet appServlet threw exception
javax.el.PropertyNotFoundException: Property 'answer' not found on type com.pool.app.domain.Pool
    at javax.el.BeanELResolver$BeanProperties.get(BeanELResolver.Java:214)
    at javax.el.BeanELResolver$BeanProperties.access$400(BeanELResolver.Java:191)
    at javax.el.BeanELResolver.property(BeanELResolver.Java:300)
    at javax.el.BeanELResolver.getValue(BeanELResolver.Java:81)
    at javax.el.CompositeELResolver.getValue(CompositeELResolver.Java:54)
    at org.Apache.el.parser.AstValue.getValue(AstValue.Java:123)
    at org.Apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.Java:186)
    at org.Apache.jasper.runtime.PageContextImpl.proprietaryEvaluate(PageContextImpl.Java:938)
    at org.Apache.jsp.WEB_002dINF.views.home_jsp._jspx_meth_c_005fforEach_005f0(home_jsp.Java:119)
    at org.Apache.jsp.WEB_002dINF.views.home_jsp._jspService(home_jsp.Java:78)
    at org.Apache.jasper.runtime.HttpJspBase.service(HttpJspBase.Java:70)
    at javax.servlet.http.HttpServlet.service(HttpServlet.Java:717)
    at org.Apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.Java:388)
    at org.Apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.Java:313)
    at org.Apache.jasper.servlet.JspServlet.service(JspServlet.Java:260)
    at javax.servlet.http.HttpServlet.service(HttpServlet.Java:717)
    at org.Apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.Java:290)
    at org.Apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.Java:206)
    at org.Apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.Java:646)
    at org.Apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.Java:436)
    at org.Apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.Java:374)
    at org.Apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.Java:302)
    at org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.Java:238)
    at org.springframework.web.servlet.view.AbstractView.render(AbstractView.Java:250)
    at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.Java:1047)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.Java:817)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.Java:719)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.Java:669)
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.Java:574)
    at javax.servlet.http.HttpServlet.service(HttpServlet.Java:617)
    at javax.servlet.http.HttpServlet.service(HttpServlet.Java:717)
    at org.Apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.Java:290)
    at org.Apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.Java:206)
    at org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.Java:198)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.Java:76)
    at org.Apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.Java:235)
    at org.Apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.Java:206)
    at org.Apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.Java:233)
    at org.Apache.catalina.core.StandardContextValve.invoke(StandardContextValve.Java:191)
    at org.Apache.catalina.core.StandardHostValve.invoke(StandardHostValve.Java:127)
    at org.Apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.Java:102)
    at org.Apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.Java:109)
    at org.Apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.Java:291)
    at org.Apache.coyote.http11.Http11Processor.process(Http11Processor.Java:859)
    at org.Apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.Java:602)
    at org.Apache.Tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.Java:489)
    at Java.lang.Thread.run(Thread.Java:680)

Das Modell ist:

public List<Pool> getAll(){

    Session session = sessionFactory.getCurrentSession();

    Query query = session.createQuery("From Pool as p left join fetch p.poolQuestions as s");

    return query.list();

Der Controller ist:

List<Pool> pool = poolService.getAll();

model.addAttribute("pools", pool);

Und die Aussicht ist:

<c:forEach items="${pools}" var="pool"> 

    <p>${pool.name}</p>
    <c:out value="${pool.answer}"/>

</c:forEach>

PS. Der ${pool.name} wird richtig angezeigt

20
Ilkar

javax.el.PropertyNotFoundException: Die Eigenschaft 'foo' wurde im Typ com.example.Bean nicht gefunden

Dies bedeutet wörtlich, dass die angegebene Klasse com.example.Bean keine öffentliche (nicht statische!) Getter-Methode für die erwähnte Eigenschaft foo hat. Beachten Sie, dass das Feld selbst hier irrelevant ist!

Der öffentliche Getter-Methodenname muss mit get beginnen, gefolgt vom Eigenschaftsnamen, der nur mit dem ersten Buchstaben des Eigenschaftennamens wie in Foo großgeschrieben wird.

public Foo getFoo() {
    return foo;
}

Sie müssen daher sicherstellen, dass es eine Getter-Methode gibt, die genau mit dem Namen der Eigenschaft übereinstimmt, und dass die Methode public (non -static) ist und dass die Methode keine Argumente verwendet und dass keine -void zurückgegeben wird. Wenn Sie einen haben und es immer noch nicht funktioniert, besteht die Möglichkeit, dass Sie den Code vor und zurück bearbeiten, ohne den Build gründlich zu bereinigen, den Code neu zu erstellen und die Anwendung erneut zu installieren/neu zu starten. Sie müssen sicherstellen, dass Sie dies getan haben.

Für boolean (nicht Boolean!) Eigenschaften muss der Name der Getter-Methode mit is anstelle von get beginnen.

public boolean isFoo() {
    return foo;
}

Unabhängig vom Typ ist das Vorhandensein des Feldes foo selbst nicht relevant. Es kann einen anderen Namen haben oder vollständig fehlen oder sogar static sein. Alle unten aufgeführten Elemente sollten weiterhin über ${bean.foo} erreichbar sein.

public Foo getFoo() {
    return bar;
}

public Foo getFoo() {
    return new Foo("foo");
}

public Foo getFoo() {
    return FOO_CONSTANT;
}

Sie sehen, das Feld ist nicht das, was zählt, sondern die Getter-Methode selbst. Beachten Sie, dass der Name der Eigenschaft selbst in EL nicht groß geschrieben werden sollte. Mit anderen Worten, ${bean.Foo} wird nie funktionieren, es sollte ${bean.foo} sein.

Siehe auch:

61
BalusC

Ich glaube, dass die ID-Accessoren nicht den Bean-Benennungskonventionen entsprechen. Deshalb wird die Ausnahme ausgelöst. Sie sollten wie folgt sein:

public Integer getId() { return id; }    
public void setId(Integer i){ id= i; }
5
Fakher

EL interpretiert ${class.name} wie beschrieben - der Name wird in getName () unter der Annahme, dass Sie explizite oder implizite Methoden zum Generieren von Getter/Setters verwenden

Sie können dieses Verhalten überschreiben, indem Sie den Namen explizit als Funktion angeben: ${class.name()} Dies ruft die Funktion name () direkt ohne Änderung auf. 

0
sdw