Не удается получить размер атрибута модели в JSP - PullRequest
0 голосов
/ 07 июня 2018

Это мой первый проект с использованием jsp, и я пытаюсь построить таблицу, в которой каждая строка выглядит примерно так

Вот строка таблицы

В последнем столбце (лайки) в данный момент есть только кнопка, но я хотел бы отобразить количество лайков рядом с ней.

Вот моя проблема.Когда я пытаюсь использовать функцию длины jsp ${fn:length(mes.likes)}

, я получаю следующее исключение

org.apache.jasper.JasperException: javax.el.ELException: Problems calling function [fn:length]
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:606)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:482)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:386)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:330)
javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:170)
org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:314)
org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1325)
org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1069)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1008)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:925)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:978)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:870)
javax.servlet.http.HttpServlet.service(HttpServlet.java:634)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:855)
javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
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.www.BasicAuthenticationFilter.doFilterInternal(BasicAuthenticationFilter.java:158)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200)
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.csrf.CsrfFilter.doFilterInternal(CsrfFilter.java:100)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:66)
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)

Я загружаю все сообщения в модели из HomeController

@Controller
public class HomeController {
    @Autowired
    IMessageService messageService;
    @GetMapping("/homepage")
    public String index(Model model) {
        List<MessageEntity> messages = messageService.getAll();
        model.addAttribute("allMessages", messages);
        return "index";
    }
}

Вот MessageEntity класс

public class MessageEntity{
    private int Id;
    private String title;
    private String content;
    private Date createdAt;
    private User createdBy;
    private List<LikeEntity> likes;
}

и, наконец, вот моя таблица в файле index.jsp , где я отображаюинформация.

<table id="panneau">
    <thead class="bg-dark text-light">
        <tr>
            <th>Message</th>
            <th>Emetteur</th>
            <th>Date/heure</th>
            <th>Likes</th>
        </tr>
    </thead>
    <tbody class="text-black">
        <c:forEach var="mes" items="${allMessages}">
            <tr id="message${mes.id}">
                <td>
                    <div><b>${mes.title}</b></div>
                    <div>${mes.content}</div>
                </td>
                <td>
                    <c:choose>
                        <c:when test="${mes.anonymous}">
                            anonyme
                        </c:when>
                        <c:otherwise>
                            ${mes.createdBy.firstName} ${mes.createdBy.lastName}
                        </c:otherwise>
                    </c:choose>
                </td>
                <td>
                    ${mes.createdAt}
                </td>
                <td>
                    <div>${fn:length(mes.likes)}</div>
                    <div><button class="btn btn-dark" id="like${mes.id}"><i class="far fa-thumbs-up fa-2x"></i></button></div>
                </td>
            </tr>
        </c:forEach>
    </tbody>
</table>

Когда я удаляю ${fn:length(mes.likes)}, все работает нормально, но мне нужен способ получить эту информацию.

Я смотрел другие подобные вопросы, но ни один из нихкажется, чтобы исправить мою проблему.

Кстати, у меня есть <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> в начале файла

EDIT

Вот класс likeEntity

import javax.persistence.*;
import java.util.Objects;
/**
 * Created by owner on 18-05-07.
 */
@Entity
@Table(name = "likes", schema = "heroku_9efd0238a94d992")
public class LikeEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "like_id", nullable = false)
    private int id;
    @Basic
    @Column(name = "is_dislike", nullable = true)
    private Boolean isDislike;
    @ManyToOne(cascade = {
        CascadeType.MERGE,
        CascadeType.PERSIST,
        CascadeType.DETACH,
        CascadeType.REFRESH,
    })
    @JoinColumn(name = "liked_by")
    private UserEntity likedBy;
    @ManyToOne(cascade = {
        CascadeType.MERGE,
        CascadeType.PERSIST,
        CascadeType.DETACH,
        CascadeType.REFRESH,
    })
    @JoinColumn(name = "liked_message") 
    private MessageEntity likedMessage;
    public LikeEntity() {
        this.setDislike(false);
    }
}

1 Ответ

0 голосов
/ 08 июня 2018

Disclamer : Это обходной путь, а не решение

Я до сих пор не знаю, почему лайки не могли загружаться лениво, но изменение типа fetch с ленивого на нетерпеливое кажетсясделали свое дело ...

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

Если, однако, вы работаете с большим набором данных, я не думаю, что это решение подойдет.

...