在百里香中显示项目列表总是出错

Posted

技术标签:

【中文标题】在百里香中显示项目列表总是出错【英文标题】:Display of list of items in thymeleaf always gives error 【发布时间】:2019-08-16 08:52:32 【问题描述】:

这是我在尝试从数据库中检索所有主题时遇到的错误。我错过了什么?

白标错误页面 此应用程序没有 /error 的显式映射,因此您将其视为后备。

2019 年 3 月 24 日星期日 20:49:11 PDT 出现意外错误(类型=内部服务器错误,状态=500)。 模板解析时出错(模板:“类路径资源 [templates/views/subjectsList.html]”) org.thymeleaf.exceptions.TemplateInputException:模板解析时出错(模板:“类路径资源[templates/views/subjectsList.html]”) 在 org.thymeleaf.templateparser.markup.AbstractMarkupTemplateParser.parse(AbstractMarkupTemplateParser.java:241) 在 org.thymeleaf.templateparser.markup.AbstractMarkupTemplateParser.parseStandalone(AbstractMarkupTemplateParser.java:100) 在 org.thymeleaf.engine.TemplateManager.parseAndProcess(TemplateManager.java:666) 在 org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1098) 在 org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1072) 在 org.thymeleaf.spring5.view.ThymeleafView.renderFragment(ThymeleafView.java:362) 在 org.thymeleaf.spring5.view.ThymeleafView.render(ThymeleafView.java:189) 在 org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1370) 在 org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1116) 在 org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1055) 在 org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:942) 在 org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1005) 在 org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:897) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:634) 在 org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:882) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:741) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) 在 org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) 在 org.springframework.web.servlet.resource.ResourceUrlEncodingFilter.doFilter(ResourceUrlEncodingFilter.java:63) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:320) 在 org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:127) 在 org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:91) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) 在 org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:119) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) 在 org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) 在 org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) 在 org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:170) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) 在 org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) 在 org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) 在 org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:74) 在 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) 在 org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) 在 org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56) 在 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) 在 org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215) 在 org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178) 在 org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:357) 在 org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:270) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) 在 org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99) 在 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) 在 org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:92) 在 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) 在 org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:93) 在 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) 在 org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200) 在 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) 在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:200) 在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) 在 org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:490) 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) 在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) 在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) 在 org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408) 在 org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) 在 org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:834) 在 org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1415) 在 org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(未知来源) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(未知来源) 在 org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 在 java.lang.Thread.run(未知来源) 引起:org.attoparser.ParseException:评估 SpringEL 表达式的异常:“subject.coursecode”(模板:“views/subjectsList” - 第 31 行,第 13 列) 在 org.attoparser.MarkupParser.parseDocument(MarkupParser.java:393) 在 org.attoparser.MarkupParser.parse(MarkupParser.java:257) 在 org.thymeleaf.templateparser.markup.AbstractMarkupTemplateParser.parse(AbstractMarkupTemplateParser.java:230) ... 85 更多 引起:org.thymeleaf.exceptions.TemplateProcessingException:评估 SpringEL 表达式的异常:“subject.coursecode”(模板:“views/subjectsList” - 第 31 行,第 13 列) 在 org.thymeleaf.spring5.expression.SPELVariableExpressionEvaluator.evaluate(SPELVariableExpressionEvaluator.java:290) 在 org.thymeleaf.standard.expression.VariableExpression.executeVariableExpression(VariableExpression.java:166) 在 org.thymeleaf.standard.expression.SimpleExpression.executeSimple(SimpleExpression.java:66) 在 org.thymeleaf.standard.expression.Expression.execute(Expression.java:109) 在 org.thymeleaf.standard.expression.Expression.execute(Expression.java:138) 在 org.thymeleaf.standard.processor.AbstractStandardExpressionAttributeTagProcessor.doProcess(AbstractStandardExpressionAttributeTagProcessor.java:144) 在 org.thymeleaf.processor.element.AbstractAttributeTagProcessor.doProcess(AbstractAttributeTagProcessor.java:74) 在 org.thymeleaf.processor.element.AbstractElementTagProcessor.process(AbstractElementTagProcessor.java:95) 在 org.thymeleaf.util.ProcessorConfigurationUtils$ElementTagProcessorWrapper.process(ProcessorConfigurationUtils.java:633) 在 org.thymeleaf.engine.ProcessorTemplateHandler.handleOpenElement(ProcessorTemplateHandler.java:1314) 在 org.thymeleaf.engine.OpenElementTag.beHandled(OpenElementTag.java:205) 在 org.thymeleaf.engine.Model.process(Model.java:282) 在 org.thymeleaf.engine.Model.process(Model.java:290) 在 org.thymeleaf.engine.IteratedGatheringModelProcessable.processIterationModel(IteratedGatheringModelProcessable.java:367) 在 org.thymeleaf.engine.IteratedGatheringModelProcessable.process(IteratedGatheringModelProcessable.java:221) 在 org.thymeleaf.engine.ProcessorTemplateHandler.handleCloseElement(ProcessorTemplateHandler.java:1640) 在 org.thymeleaf.engine.CloseElementTag.beHandled(CloseElementTag.java:139) 在 org.thymeleaf.engine.Model.process(Model.java:282) 在 org.thymeleaf.engine.ProcessorTemplateHandler.handleOpenElement(ProcessorTemplateHandler.java:1587) 在 org.thymeleaf.engine.OpenElementTag.beHandled(OpenElementTag.java:205) 在 org.thymeleaf.engine.Model.process(Model.java:282) 在 org.thymeleaf.engine.ProcessorTemplateHandler.handleOpenElement(ProcessorTemplateHandler.java:1587) 在 org.thymeleaf.engine.OpenElementTag.beHandled(OpenElementTag.java:205) 在 org.thymeleaf.engine.Model.process(Model.java:282) 在 org.thymeleaf.engine.Model.process(Model.java:290) 在 org.thymeleaf.engine.GatheringModelProcessable.process(GatheringModelProcessable.java:78) 在 org.thymeleaf.engine.ProcessorTemplateHandler.handleCloseElement(ProcessorTemplateHandler.java:1640) 在 org.thymeleaf.engine.TemplateHandlerAdapterMarkupHandler.handleCloseElementEnd(TemplateHandlerAdapterMarkupHandler.java:388) 在 org.thymeleaf.templateparser.markup.InlinedOutputExpressionMarkupHandler$InlineMarkupAdapterPreProcessorHandler.handleCloseElementEnd(InlinedOutputExpressionMarkupHandler.java:322) 在 org.thymeleaf.standard.inline.OutputExpressionInlinePreProcessorHandler.handleCloseElementEnd(OutputExpressionInlinePreProcessorHandler.java:220) 在 org.thymeleaf.templateparser.markup.InlinedOutputExpressionMarkupHandler.handleCloseElementEnd(InlinedOutputExpressionMarkupHandler.java:164) 在 org.attoparser.HtmlElement.handleCloseElementEnd(HtmlElement.java:169) 在 org.attoparser.HtmlMarkupHandler.handleCloseElementEnd(HtmlMarkupHandler.java:412) 在 org.attoparser.MarkupEventProcessorHandler.handleCloseElementEnd(MarkupEventProcessorHandler.java:473) 在 org.attoparser.ParsingElementMarkupUtil.parseCloseElement(ParsingElementMarkupUtil.java:201) 在 org.attoparser.MarkupParser.parseBuffer(MarkupParser.java:725) 在 org.attoparser.MarkupParser.parseDocument(MarkupParser.java:301) ... 87 更多 引起:org.springframework.expression.spel.SpelEvaluationException:EL1008E:在“com.ecc.telink.entities.Subject”类型的对象上找不到属性或字段“课程代码” - 可能不公开或无效? 在 org.springframework.expression.spel.ast.PropertyOrFieldReference.readProperty(PropertyOrFieldReference.java:217) 在 org.springframework.expression.spel.ast.PropertyOrFieldReference.getValueInternal(PropertyOrFieldReference.java:104) 在 org.springframework.expression.spel.ast.PropertyOrFieldReference.access$000(PropertyOrFieldReference.java:51) 在 org.springframework.expression.spel.ast.PropertyOrFieldReference$AccessorLValue.getValue(PropertyOrFieldReference.java:406) 在 org.springframework.expression.spel.ast.CompoundExpression.getValueInternal(CompoundExpression.java:90) 在 org.springframework.expression.spel.ast.SpelNodeImpl.getValue(SpelNodeImpl.java:109) 在 org.springframework.expression.spel.standard.SpelExpression.getValue(SpelExpression.java:328) 在 org.thymeleaf.spring5.expression.SPELVariableExpressionEvaluator.evaluate(SPELVariableExpressionEvaluator.java:263) ... 123 更多

学科类

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.validation.constraints.NotNull;

@Entity
public class Subject 

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Long subjectId;

    @NotNull
    @Column(unique=true)
    private String coursecode;

    @NotNull
    private String subjectname;

    public Subject() 

    

    public Subject(Long subjectId, String coursecode, String subjectname) 

        this.subjectId = subjectId;
        this.coursecode = coursecode;
        this.subjectname = subjectname;
    

    public Long getSubjectId() 
        return subjectId;
    

    public void setSubjectId(Long subjectId) 
        this.subjectId = subjectId;
    

    public String getcoursecode() 
        return coursecode;
    

    public void setcoursecode(String coursecode) 
        this.coursecode = coursecode;
    

    public String getsubjectname() 
        return subjectname;
    

    public void setsubjectname(String subjectname) 
        this.subjectname = subjectname;
    




SubjectController 类

import javax.validation.Valid;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import com.ecc.telink.entities.Subject;
import com.ecc.telink.services.SubjectsServices;

@Controller
public class SubjectController 

    @Autowired
    private SubjectsServices subjectServices;


    @RequestMapping("/listsubjects")
    public String showSubjectList(Model model) 
        model.addAttribute("subjects", subjectServices.findAllSubjects());
        return "views/subjectsList";
    

SubjectService 类

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.ecc.telink.entities.Subject;
import com.ecc.telink.repositories.SubjectsRepository;

@Service
public class SubjectsServices 

    @Autowired
    private SubjectsRepository subjectsRepository;

    public void addSubject(Subject subjects) 
        subjectsRepository.save(subjects);
    

    public List<Subject> findAllSubjects() 

        return subjectsRepository.findAll();
    


HTML 表单

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org"
    xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
    layout:decorate="~fragments/main_layout">
<head>

</head>
<body>

    <div layout:fragment="content" class="container mySpace">

        <div class="card cardspace">

            <div class="card card-body">
                <div class="form-row">

                    <table class="table table-hover">
                        <thead>
                            <tr>
                                <th scope="col">Subject Code</th>
                                <th scope="col">Subject Name</th>
                            </tr>
                        </thead>
                        <tbody>

                            <tr th:each="subject:$subjects">
                                <td th:text="$subject.coursecode"></td>

                                <td th:text="$user.subjectname"></td>
                            </tr>

                        </tbody>
                    </table>
                </div>
            </div>
        </div>
    </div>


</body>
</html>

【问题讨论】:

只需阅读堆栈跟踪,它就有足够的信息。 1.Exception evaluating SpringEL expression: "subject.coursecode" 2.EL1008E: Property or field 'coursecode' cannot be found on object of type 'com.ecc.telink.entities.Subject' - maybe not public or not valid? 是的,我已经看到了,但我不明白为什么 1. 评估 SpringEL 表达式的异常:“subject.coursecode” 2. EL1008E:在“类型”的对象上找不到属性或字段“课程代码” com.ecc.telink.entities.Subject' - 可能不公开或无效? 【参考方案1】:

您的 getter/setter 不遵循标准的 java bean 命名约定,因此 spring 无法为 coursecode 找到 getter。吸气剂应该是getCoursecode() 而不是getcoursecode()

你可以阅读这个问题naming-convention-for-getters-setters-in-java

【讨论】:

以上是关于在百里香中显示项目列表总是出错的主要内容,如果未能解决你的问题,请参考以下文章

如何在百里香中打印数组大小?

如何控制百里香中的href属性

百里香中的for循环

如何在百里香中结合 sec:authorize 和 th:if

我正在尝试根据百里香中 pojo 的 id 获取特定图像

尝试从要显示在 ListView 中的字符串列表中读取项目时出错