Модель не пустая, но FreeMarker выдает ошибку и модель приходить в FreeMarker пустой, при findAll все работает отлично


@GetMapping(value = "{id}")
    public String userInfo(@PathVariable Long id, Model model){
        model.addAttribute("u",userRepo.findById(id));
        return "userInfo";
    }

<#list u as user>
    <tr>
        ${u.username!"null or missing"}
    </tr>
</#list>
FreeMarker template error (DEBUG mode; use RETHROW in production!): 
The value you try to list is an extended_hash+string (Optional wrapped into f.e.b.StringModel), 
thus you must specify two loop variables after the "as"; one for the key, and another for the value, like <#... as k, v>). 
---- FTL stack trace ("~" means nesting-related): 
- Failed at: #list u as user [in template "userInfo.ftlh" at line 1, column 1] 
---- Java stack trace (for programmers).line 1, column 1] 
---- Java stack trace (for programmers): 
---- freemarker.core.NonSequenceOrCollectionException: [... Exception message was already printed; see it above ...] at freemarker.core.IteratorBlock$IterationContext.executedNestedContentForCollOrSeqListing(IteratorBlock.java:351
 at freemarker.core.IteratorBlock$IterationContext.executeNestedContent(IteratorBlock.java:271
 at freemarker.core.IteratorBlock$IterationContext.accept(IteratorBlock.java:244
 at freemarker.core.Environment.visitIteratorBlock(Environment.java:644
 at freemarker.core.IteratorBlock.acceptWithResult(IteratorBlock.java:108
 at freemarker.core.IteratorBlock.accept(IteratorBlock.java:94
 at freemarker.core.Environment.visit(Environment.java:334
 at freemarker.core.Environment.visit(Environment.java:340
 at freemarker.core.Environment.process(Environment.java:313
 at freemarker.template.Template.process(Template.java:383
 at org.springframework.web.servlet.view.freemarker.FreeMarkerView.processTemplate(FreeMarkerView.java:391
 at org.springframework.web.servlet.view.freemarker.FreeMarkerView.doRender(FreeMarkerView.java:304
 at org.springframework.web.servlet.view.freemarker.FreeMarkerView.renderMergedTemplateModel(FreeMarkerView.java:255
 at org.springframework.web.servlet.view.AbstractTemplateView.renderMergedOutputModel(AbstractTemplateView.java:179
 at org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:316
 at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1373
 at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1118
 at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1057
 at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943
 at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006
 at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:626
 at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:733
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166
 at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166
 at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:320
 at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:126
 at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:90
 at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334
 at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:118
 at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334
 at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137
 at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334
 at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111
 at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334
 at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:158
 at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334
 at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63
 at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334
 at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200
 at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334
 at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116
 at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334
 at org.springframework.security.web.csrf.CsrfFilter.doFilterInternal(CsrfFilter.java:117
 at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119
 at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334
 at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:92
 at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:77
 at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119
 at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334
 at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105
 at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334
 at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56
 at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119
 at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334
 at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215
 at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178
 at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358
 at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166
 at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100
 at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166
 at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93
 at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166
 at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201
 at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166
 at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202
 at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97
 at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541
 at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143
 at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92
 at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78
 at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343
 at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374
 at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65
 at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868
 at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590
 at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49
 at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128
 at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628
 at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61
 at java.base/java.lang.Thread.run(Thread.java:834 undefined)

Ответы (1 шт):

Автор решения: Ангелина Никонова

Да, так и должно быть ведь при .findById() одно значение, а не список, поэтому среда не понимает как перебирать объект, а .findAll() возвращает Collection, который понятно как перебирать, либо не перебирайте как список, либо оберните Collections.singletonList(userRepo.findById())

→ Ссылка