javax.el.PropertyNotFoundException: свойство 'foo' не найдено для типа com.example.Bean - PullRequest
23 голосов
/ 20 декабря 2011

У меня есть результаты от

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>

и я хотел бы отобразить результаты из таблицы poolQuestion (которая является таблицей Join). Значение, которое я хочу отобразить, это «answer».

Как я могу это сделать?

<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} отображается правильно

Ответы [ 5 ]

65 голосов
/ 20 декабря 2011

javax.el.PropertyNotFoundException: свойство 'foo' не найдено для типа com.example.Bean

Это буквально означает, что у упомянутого класса com.example.Bean нет открытого (нестатического!) Метода получения для упомянутого свойства foo. Обратите внимание, что само поле здесь не имеет значения!

Публичное имя метода получения должно начинаться с get, за которым следует имя свойства, которое пишется с заглавной буквы только в первой букве имени свойства, как в Foo.

public Foo getFoo() {
    return foo;
}

Таким образом, вам необходимо убедиться, что существует метод-получатель, точно совпадающий с именем свойства, и что этот метод имеет вид public ( non - static) и что метод не принимает никаких аргументы и что он возвращает не- void. Если он у вас есть, но он все еще не работает, то есть вероятность, что вы были заняты редактированием кода вперед и назад без тщательной очистки сборки, перестройки кода и повторного развертывания / перезапуска приложения. Вы должны убедиться, что вы сделали это.

Для boolean (не Boolean!) Свойств имя метода получения должно начинаться с 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;
}

Видите ли, поле - это не то, что имеет значение, а сам метод получения. Обратите внимание, что само имя свойства не должно быть заглавной в EL. Другими словами, ${bean.Foo} никогда не будет работать, это должно быть ${bean.foo}.

Смотри также:

6 голосов
/ 18 января 2015

Я полагаю, что средства доступа id не соответствуют соглашениям о присвоении имен bean-компонентам, и поэтому возникает исключение. Они должны быть следующими:

public Integer getId() { return id; }    
public void setId(Integer i){ id= i; }
0 голосов
/ 12 октября 2018

Я получаю ту же ошибку на моем JSP, и неправильный рейтинг был правильным

У меня была следующая строка:

и получите следующую ошибку:

javax.el.PropertyNotFoundException: свойство 'agent' не найдено для типа java.lang.String

удаление пробела до того, как $ {userList} решил мою проблему

Если у кого-то возникнет та же проблема, он быстро найдет этот пост и не тратит 3 дня на поиски помощи.

0 голосов
/ 19 августа 2018

EL интерпретирует ${class.name} как описано - имя становится getName () при условии, что вы используете явные или неявные методы генерации методов получения / установки

Вы можете переопределить это поведение, явно указав имя какfunction: ${class.name()} Вызывает имя функции () напрямую без изменений.

0 голосов
/ 04 февраля 2018

Я столкнулся с похожим типом проблемы: фрагмент кода:

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

В списке заказов был пробел, подобный этому: "$ {orderList}", из-за которого xxпеременная скрывалась в String и не могла вызвать xx.id.

Так что убедитесь в свободном месте.Иногда они играют решающую роль.: Р

...