【问题标题】:How do I get information from a collection using Thymeleaf如何使用 Thymeleaf 从集合中获取信息
【发布时间】:2014-01-10 13:28:02
【问题描述】:

我的控制器如下所示:

@ModelAttribute("adminMenu")
public Collection<Menu> getAdminMenu(HttpSession session, HttpServletRequest request) {
    Collection<Menu> menuCollection = this.stormfallService.findMenuByType("A", "A");
    log.debug("The collection for admin has " + menuCollection.size() + " records");
    session.setAttribute("adminMenu", menuCollection);
    /*Menu menu;
    Iterator<Menu> itr = menuCollection.iterator();
    while (itr.hasNext()) {
        menu = (Menu)itr.next();
        log.debug("The id = " + menu.getId());
        log.debug("The menu text is " + menu.getMenuText());
        log.debug("The menu type is " + menu.getMenuType());
        log.debug("The menu url is " + menu.getMenuUrl());
        log.debug("The menu sort order is " + menu.getSortOrder());
        log.debug("The menu status is " + menu.getStatus());
    }*/

    return menuCollection;
    //return null;
}

我认为这是正确的,但如果不是,请告诉我应该是什么。

我的片段如下所示:

<div th:fragment="sidebar" class="sidebar" id="textbar">
    <h4>Admin Functions</h4>
            <ul class="menu">
                    <!-- li th:each="menu,rowStat : ${adminMenu}" -->
                    <li th:each="menu,rowStat : #{session.adminMenu}">
                    <a href="#" th:href="${menu.menuUrl}" th:text="${menu.menuText}">Some Admin Text</a></li>
            </ul>
    <h4>User Functions</h4>
            <ul class="menu">
                    <!-- li th:each="menu,rowStat : ${userMenu}" -->
                    <li th:each="menu,rowStat : #{session.userMenu">
                    <a href="#" th:href="${menu.menuUrl}" th:text="${menu.menuText}">Some User Text</a></li>
            </ul>
    <h4>Tools</h4>
            <ul class="menu">
                <li><a href="#">Change Password</a></li>
                <li><a href="#">Logout</a></li>
            </ul>
</div>

当我不使用会话时,注释掉的代码会构建菜单,但是当它转到其他页面时,菜单就会消失。所以它需要在会话中。

我收到以下新代码错误:

HTTP 状态 500 - 请求处理失败;嵌套异常是 org.thymeleaf.exceptions.TemplateProcessingException:评估 SpringEL 表达式的异常:“menu.menuUrl”(布局:141)

输入异常报告

消息请求处理失败;嵌套异常是 org.thymeleaf.exceptions.TemplateProcessingException:评估 SpringEL 表达式的异常:“menu.menuUrl”(布局:141)

描述服务器遇到了一个内部错误,导致它无法完成这个请求。

exception

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.thymeleaf.exceptions.TemplateProcessingException: Exception evaluating SpringEL expression: "menu.menuUrl" (layout:141)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:948)
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:827)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)

root cause

org.thymeleaf.exceptions.TemplateProcessingException: Exception evaluating SpringEL expression: "menu.menuUrl" (layout:141)
    org.thymeleaf.spring3.expression.SpelVariableExpressionEvaluator.evaluate(SpelVariableExpressionEvaluator.java:153)
    org.thymeleaf.standard.expression.VariableExpression.executeVariable(VariableExpression.java:149)
    org.thymeleaf.standard.expression.SimpleExpression.executeSimple(SimpleExpression.java:59)
    org.thymeleaf.standard.expression.Expression.execute(Expression.java:103)
    org.thymeleaf.standard.expression.Expression.execute(Expression.java:133)
    org.thymeleaf.standard.expression.Expression.execute(Expression.java:120)
    org.thymeleaf.standard.processor.attr.AbstractStandardSingleAttributeModifierAttrProcessor.getTargetAttributeValue(AbstractStandardSingleAttributeModifierAttrProcessor.java:67)
    org.thymeleaf.spring3.processor.attr.SpringHrefAttrProcessor.getTargetAttributeValue(SpringHrefAttrProcessor.java:68)
    org.thymeleaf.processor.attr.AbstractSingleAttributeModifierAttrProcessor.getModifiedAttributeValues(AbstractSingleAttributeModifierAttrProcessor.java:59)
    org.thymeleaf.processor.attr.AbstractAttributeModifierAttrProcessor.processAttribute(AbstractAttributeModifierAttrProcessor.java:61)
    org.thymeleaf.processor.attr.AbstractAttrProcessor.doProcess(AbstractAttrProcessor.java:87)
    org.thymeleaf.processor.AbstractProcessor.process(AbstractProcessor.java:212)
    org.thymeleaf.dom.Node.applyNextProcessor(Node.java:973)
    org.thymeleaf.dom.Node.processNode(Node.java:928)
    org.thymeleaf.dom.NestableNode.computeNextChild(NestableNode.java:654)
    org.thymeleaf.dom.NestableNode.doAdditionalProcess(NestableNode.java:637)
    org.thymeleaf.dom.Node.processNode(Node.java:947)
    org.thymeleaf.dom.NestableNode.computeNextChild(NestableNode.java:654)
    org.thymeleaf.dom.NestableNode.doAdditionalProcess(NestableNode.java:637)
    org.thymeleaf.dom.Node.processNode(Node.java:947)
    org.thymeleaf.dom.NestableNode.computeNextChild(NestableNode.java:654)
    org.thymeleaf.dom.NestableNode.doAdditionalProcess(NestableNode.java:637)
    org.thymeleaf.dom.Node.processNode(Node.java:947)
    org.thymeleaf.dom.NestableNode.computeNextChild(NestableNode.java:654)
    org.thymeleaf.dom.NestableNode.doAdditionalProcess(NestableNode.java:637)
    org.thymeleaf.dom.Node.processNode(Node.java:947)
    org.thymeleaf.dom.NestableNode.computeNextChild(NestableNode.java:654)
    org.thymeleaf.dom.NestableNode.doAdditionalProcess(NestableNode.java:637)
    org.thymeleaf.dom.Node.processNode(Node.java:947)
    org.thymeleaf.dom.NestableNode.computeNextChild(NestableNode.java:654)
    org.thymeleaf.dom.NestableNode.doAdditionalProcess(NestableNode.java:637)
    org.thymeleaf.dom.Node.processNode(Node.java:947)
    org.thymeleaf.dom.NestableNode.computeNextChild(NestableNode.java:654)
    org.thymeleaf.dom.NestableNode.doAdditionalProcess(NestableNode.java:637)
    org.thymeleaf.dom.Node.processNode(Node.java:947)
    org.thymeleaf.dom.Document.process(Document.java:93)
    org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1155)
    org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1060)
    org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1011)
    org.thymeleaf.spring3.view.ThymeleafView.renderFragment(ThymeleafView.java:335)
    org.thymeleaf.spring3.view.ThymeleafView.render(ThymeleafView.java:190)
    org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1208)
    org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:992)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:939)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936)
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:827)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)

root cause

org.springframework.expression.spel.SpelEvaluationException: EL1008E:(pos 5): Field or property 'menuUrl' cannot be found on object of type 'java.lang.String'
    org.springframework.expression.spel.ast.PropertyOrFieldReference.readProperty(PropertyOrFieldReference.java:246)
    org.springframework.expression.spel.ast.PropertyOrFieldReference.getValueInternal(PropertyOrFieldReference.java:112)
    org.springframework.expression.spel.ast.PropertyOrFieldReference.access$000(PropertyOrFieldReference.java:43)
    org.springframework.expression.spel.ast.PropertyOrFieldReference$AccessorLValue.getValue(PropertyOrFieldReference.java:87)
    org.springframework.expression.spel.ast.CompoundExpression.getValueInternal(CompoundExpression.java:82)
    org.springframework.expression.spel.ast.SpelNodeImpl.getValue(SpelNodeImpl.java:93)
    org.springframework.expression.spel.standard.SpelExpression.getValue(SpelExpression.java:94)
    org.thymeleaf.spring3.expression.SpelVariableExpressionEvaluator.evaluate(SpelVariableExpressionEvaluator.java:138)
    org.thymeleaf.standard.expression.VariableExpression.executeVariable(VariableExpression.java:149)
    org.thymeleaf.standard.expression.SimpleExpression.executeSimple(SimpleExpression.java:59)
    org.thymeleaf.standard.expression.Expression.execute(Expression.java:103)
    org.thymeleaf.standard.expression.Expression.execute(Expression.java:133)
    org.thymeleaf.standard.expression.Expression.execute(Expression.java:120)
    org.thymeleaf.standard.processor.attr.AbstractStandardSingleAttributeModifierAttrProcessor.getTargetAttributeValue(AbstractStandardSingleAttributeModifierAttrProcessor.java:67)
    org.thymeleaf.spring3.processor.attr.SpringHrefAttrProcessor.getTargetAttributeValue(SpringHrefAttrProcessor.java:68)
    org.thymeleaf.processor.attr.AbstractSingleAttributeModifierAttrProcessor.getModifiedAttributeValues(AbstractSingleAttributeModifierAttrProcessor.java:59)
    org.thymeleaf.processor.attr.AbstractAttributeModifierAttrProcessor.processAttribute(AbstractAttributeModifierAttrProcessor.java:61)
    org.thymeleaf.processor.attr.AbstractAttrProcessor.doProcess(AbstractAttrProcessor.java:87)
    org.thymeleaf.processor.AbstractProcessor.process(AbstractProcessor.java:212)
    org.thymeleaf.dom.Node.applyNextProcessor(Node.java:973)
    org.thymeleaf.dom.Node.processNode(Node.java:928)
    org.thymeleaf.dom.NestableNode.computeNextChild(NestableNode.java:654)
    org.thymeleaf.dom.NestableNode.doAdditionalProcess(NestableNode.java:637)
    org.thymeleaf.dom.Node.processNode(Node.java:947)
    org.thymeleaf.dom.NestableNode.computeNextChild(NestableNode.java:654)
    org.thymeleaf.dom.NestableNode.doAdditionalProcess(NestableNode.java:637)
    org.thymeleaf.dom.Node.processNode(Node.java:947)
    org.thymeleaf.dom.NestableNode.computeNextChild(NestableNode.java:654)
    org.thymeleaf.dom.NestableNode.doAdditionalProcess(NestableNode.java:637)
    org.thymeleaf.dom.Node.processNode(Node.java:947)
    org.thymeleaf.dom.NestableNode.computeNextChild(NestableNode.java:654)
    org.thymeleaf.dom.NestableNode.doAdditionalProcess(NestableNode.java:637)
    org.thymeleaf.dom.Node.processNode(Node.java:947)
    org.thymeleaf.dom.NestableNode.computeNextChild(NestableNode.java:654)
    org.thymeleaf.dom.NestableNode.doAdditionalProcess(NestableNode.java:637)
    org.thymeleaf.dom.Node.processNode(Node.java:947)
    org.thymeleaf.dom.NestableNode.computeNextChild(NestableNode.java:654)
    org.thymeleaf.dom.NestableNode.doAdditionalProcess(NestableNode.java:637)
    org.thymeleaf.dom.Node.processNode(Node.java:947)
    org.thymeleaf.dom.NestableNode.computeNextChild(NestableNode.java:654)
    org.thymeleaf.dom.NestableNode.doAdditionalProcess(NestableNode.java:637)
    org.thymeleaf.dom.Node.processNode(Node.java:947)
    org.thymeleaf.dom.Document.process(Document.java:93)
    org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1155)
    org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1060)
    org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1011)
    org.thymeleaf.spring3.view.ThymeleafView.renderFragment(ThymeleafView.java:335)
    org.thymeleaf.spring3.view.ThymeleafView.render(ThymeleafView.java:190)
    org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1208)
    org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:992)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:939)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936)
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:827)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)

note The full stack trace of the root cause is available in the Apache Tomcat/7.0.42 logs.
Apache Tomcat/7.0.42

任何帮助将不胜感激。

【问题讨论】:

    标签: spring spring-mvc thymeleaf


    【解决方案1】:

    您正在使用#{...}(国际化)语法而不是${...} 语法。

    这也解释了下面的异常,因为#{...}的结果是String

    Field or property 'menuUrl' cannot be found on object of type 'java.lang.String'

    #{session.adminMenu}#{session.userMenu(注意缺少的})分别更改为${session.adminMenu}${session.userMenu}

    【讨论】:

    • 这有帮助,但现在我得到:类型异常报告消息请求处理失败;嵌套异常是 org.thymeleaf.exceptions.TemplateProcessingException: 无法解析为 each: "menu,rowStat : ${session.userMenu" (layout:146)
    猜你喜欢
    • 1970-01-01
    • 2020-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-25
    • 2021-05-31
    • 1970-01-01
    相关资源
    最近更新 更多