29

我有结果

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

查询,我想在 JSP 上显示它。

我有循环:

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

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

</c:forEach>

我想显示 poolQ​​uestion 表(即 Join 表)的结果。我要显示的值是“答案”。

我该怎么做?

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

上面的代码不起作用。

错误是:

  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)

型号为:

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();

控制器是:

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

model.addAttribute("pools", pool);

视图是:

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

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

</c:forEach>

PS。${pool.name}正确显示

4

6 回答 6

86

javax.el.PropertyNotFoundException:在类型 com.example.Bean 上找不到属性“foo”

从字面上看,这意味着提到的类com.example.Bean没有提到的属性的公共(非静态!)getter 方法foo。请注意,该字段本身在这里无关紧要!

公共 getter 方法名称必须以 开头get,后跟属性名称,该名称仅在属性名称的第一个字母处大写,如Foo.

public Foo getFoo() {
    return foo;
}

因此,您需要确保有一个与属性名称完全匹配的 getter 方法,并且该方法是public( non - static) 并且该方法不接受任何参数并且它返回 non- void。如果你有一个但它仍然无法工作,那么很可能你正忙于来回编辑代码而没有彻底清理构建、重建代码和重新部署/重新启动应用程序。你需要确保你已经这样做了。

对于boolean(不是Boolean!)属性,getter 方法名称必须以is代替开头get

public boolean isFoo() {
    return foo;
}

无论类型如何,foo因此字段本身的存在是相关的。它可以有不同的名称,或者完全不存在,甚至是static。以下所有内容仍应可由${bean.foo}.

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

你看,字段不是重要的,而是 getter 方法本身。请注意,属性名称本身不应在 EL 中大写。换句话说,${bean.Foo}永远不会工作,它应该是${bean.foo}

也可以看看:

于 2011-12-20T15:24:00.323 回答
6

我相信 id 访问器与 bean 命名约定不匹配,这就是引发异常的原因。它们应如下所示:

public Integer getId() { return id; }    
public void setId(Integer i){ id= i; }
于 2015-01-18T15:27:23.230 回答
2

检查 forEach 中的项目

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

        ${pool.name}

    </c:forEach>

有时 items="${pools}" 有一个额外的空间或者它像字符串一样,重新输入它应该可以解决问题。

于 2020-05-12T15:58:10.257 回答
1

EL 解释${class.name}如所述 - 名称变为 getName() 假设您正在使用生成 getter/setter 的显式或隐式方法

您可以通过将名称显式标识为函数来覆盖此行为: ${class.name()} 这会直接调用函数 name() 而无需修改。

于 2018-08-18T23:38:20.563 回答
-1

我在我的 JSP 上遇到了同样的错误,而评分不佳的答案是正确的

我有以下行:

<c:forEach var="agent" items="${userList}" varStatus="rowCounter">

并得到以下错误:

javax.el.PropertyNotFoundException:在类型 java.lang.String 上找不到属性“代理”

在 ${userList} 解决我的问题之前删除空间

如果有人有同样的问题,他会很快找到这个帖子,而不是浪费 3 天的时间在谷歌上寻找帮助。

于 2018-10-12T12:21:52.013 回答
-2

我面临着类似类型的问题:代码片段:

<c:forEach items="${orderList}" var="xx"> ${xx.id} <br>
</c:forEach>

在 orderlist 之后有一个空格,如下所示:“${orderList}”,因此 xx 变量被转换为 String 并且无法调用 xx.id。

因此,请确保空间。他们有时起着至关重要的作用。:p

于 2018-02-03T22:12:28.043 回答