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

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

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). Значение, которое я хочу отобразить, это "ответ".

Как мне это сделать?

<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 ответов

Решение

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

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

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

public Foo getFoo() {
    return foo;
}

Таким образом, вам необходимо убедиться, что существует метод-получатель, который точно соответствует имени свойства, и что метод public (не - 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},

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

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

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

Отметьте элементы для каждого

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

        ${pool.name}

    </c:forEach>

Иногда в items="${pools}" есть лишнее пространство или он действует как строка, повторный ввод должен решить проблему.

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

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

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

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

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

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

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

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

Я столкнулся с подобной проблемой: фрагмент кода:

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

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

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

Другие вопросы по тегам