java.lang.IllegalArgumentException: переменная итерации не может быть нулевой - PullRequest
0 голосов
/ 31 января 2019

введите описание изображения здесь > Застрял в этом на несколько дней.Я считаю, что проблема связана с самим классом

.Или связь между рассматриваемым классом и классом, к которому присоединен столбец.

Вот мои уроки: Мод

package com.matt.Keyword.models;
    import javax.persistence.*;
    import javax.validation.constraints.NotNull;
    import javax.validation.constraints.Size;


    @Entity
    @Table(name = "Mods")
    public class Mod {

        @Id
        @GeneratedValue
        private int id;

        @NotNull
        private Integer role;

        @NotNull
        @Size(min = 1, message = "An entry is required")
        private String entry;

        @Column(name = "user_id")
        private Integer userid;

        public Mod(Integer role, String entry) {
            this.role = role;
            this.entry = entry;
        }

        public Mod() {
        }

        public int getId() {

            return id;
        }

        public int getRole() {
            return role;
        }

        public void setRole(Integer role) {
            this.role = role;
        }

        public String getEntry() {
            return entry;
        }

        public void setEntry(String entry) {
            this.entry = entry;
        }

        public Integer getUserid() {
            return userid;
        }

        public void setUserid(Integer userid) {
            this.userid= userid;
        }

    }

Аккаунт

package com.matt.Keyword.models;

    import javax.persistence.*;
    import javax.validation.constraints.NotNull;
    import javax.validation.constraints.Size;

    @Entity
    public class Account {

        @Id
        @GeneratedValue
        private int id;

        @NotNull
        @Size(min = 3, message = "Try again")
        private String name;

        @NotNull
        @Size(min = 1, message = "A password is required")
        private String password;

        @Column(name = "user_id")
        private Integer userid;

        public Account(String name, String password) {
            this.name = name;
            this.password = password;
        }

        public Account() {
        }

        public int getId() {

            return id;
        }

        public String getName() {

            return name;
        }

        public void setName(String name) {

            this.name = name;
        }

        public String getPassword() {

            return password;
        }

        public void setPassword(String password) {

            this.password = password;
        }

        public Integer getUserid() {
            return userid;
        }

        public void setUserid(Integer userid) {
            this.userid = userid;
        }

    }

Аккаунти классы мода очень похожи и имеют общие отношения со столбцом user_id в классе пользователя.

Пользователь

package com.matt.Keyword.models;

import javax.persistence.*;
import javax.validation.constraints.Size;
import java.util.List;

@Entity
public class User {

    @Id
    @GeneratedValue
    @Column(name = "user_id")
    private int id;

    @Size(min=3, message = "Try again")
    private String email;

    @Size(min=1, message = "A password is required")
    private String password;

    @OneToMany(cascade = CascadeType.ALL)
    @JoinColumn(name = "user_id", referencedColumnName = "user_id")
    private List<Account> accounts;

    @OneToMany(cascade = CascadeType.ALL)
    @JoinColumn(name = "user_id", referencedColumnName = "user_id")
    private List<Mod> mods;

    public User(String email, String password) {
        this.email = email;
        this.password = password;
    }

    public User() {}

    public int getId() {

        return id;
    }

    public void setId(Integer id){
        this.id = id;
    }
    public String getEmail() {

        return email;
    }

    public void setEmail(String email) {

        this.email = email;
    }

    public String getPassword() {

        return password;
    }

    public void setPassword(String password) {

        this.password = password;
    }

    public List<Account> getAccounts() {
        return accounts;
    }

    public void setAccounts(List<Account> accounts) {
        this.accounts = accounts;
    }


    public List<Mod> getMods() {
        return mods;
    }

    public void setMods(List<Mod> mods) {
        this.mods = mods;
    }
    @Override
    public String toString()
    {
        return email + " " + password;
    }
}

Исключение получаетбросается, когда я загружаю страницу индекса из моего контроллера модовЯ использую тимелеф для рендеринга просмотров.Вот мой контроллер модов.В базе данных Mods сохранены объекты, и в этом контроллере во время отладки атрибут, передаваемый представлению, содержит заполненный список объектов Mod. ModController

package com.matt.Keyword.controllers;


    import com.matt.Keyword.models.Mod;
    import com.matt.Keyword.models.User;
    import com.matt.Keyword.models.data.ModDao;
    import com.matt.Keyword.models.data.UserDao;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.validation.Errors;
    import org.springframework.web.bind.annotation.ModelAttribute;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;

    import javax.servlet.http.HttpSession;
    import javax.validation.Valid;

    //test commit note
    //second try
    //third try
    /**
     * Created by LaunchCode
     */
    @Controller
    @RequestMapping("mod")

    public class ModController {

        @Autowired
        private UserDao userDao;

        @Autowired
        private ModDao modDao;

        @RequestMapping(value = "")
        public String index(Model model, HttpSession session) {

            if (session.getAttribute("currentUser") == null) {

                return "redirect:/keyword/login";
            }

            session.getAttribute("currentUser");
            model.addAttribute("title", "Mods");
            model.addAttribute("mods", modDao.findAll());
            return "mods/index";

        }

        @RequestMapping(value = "add", method = RequestMethod.GET)
        public String displayModForm(Model model, HttpSession session) {

            if (session.getAttribute("currentUser") == null) {
                return "redirect:/keyword/login";
            }

            model.addAttribute("title", "Add a new mod");
            model.addAttribute(new Mod());
            return "mods/add";
        }

        @RequestMapping(value = "add", method = RequestMethod.POST)
        public String processAddModForm(@ModelAttribute @Valid Mod newMod,
                                            Errors errors, Model model, HttpSession session) {

            if (errors.hasErrors()) {
                model.addAttribute("title", "List of Mods");
                return "mods/add";
            }
            User currentUser = (User) session.getAttribute("currentUser");

            session.getId();

            currentUser.setId(currentUser.getId());

            newMod.setUserid(currentUser.getId());

            modDao.save(newMod);

            return "redirect:";

        }

    }

Вот страница мода / индекса с использованием тимелина.

mod / index

<!DOCTYPE html>
    <html lang="en" xmlns:th="http://www.thymeleaf.org/">
    <head th:replace="fragments :: head"></head>

    <body class="container">

    <h1 th:text="${title}">Default Title</h1>

    <p th:unless="${mods} and ${mods.size()}">No current mods</p>

    <nav th:replace="fragments :: navigation"></nav>

    <p th:text="${session.currentUser.email}"></p>

    <table class="table">
        <tr>
            <th>Type</th>
            <th>Entry</th>
        </tr>
            <div th:if="${mods} != null">
                <tr th:each="mod : ${mods}">
                    <div th:if="${mod.userid} == ${session.currentUser.id}">
                        <td th:text="${mod.role}"></td>
                        <td th:text="${mod.entry}"></td>
                    </div>
                </tr>
            </div>

    </table>
    </body>
    </html>

Исключение, похоже, связано с оператором for th: each.Особенно с переменной mod.Вот трассировка стека для полной ошибки: Трассировка

There was an unexpected error (type=Internal Server Error, status=500).
An error happened during template parsing (template: "class path resource [templates/mods/index.html]")
org.thymeleaf.exceptions.TemplateInputException: An error happened during template parsing (template: "class path resource [templates/mods/index.html]")
    at org.thymeleaf.templateparser.markup.AbstractMarkupTemplateParser.parse(AbstractMarkupTemplateParser.java:241)
    at org.thymeleaf.templateparser.markup.AbstractMarkupTemplateParser.parseStandalone(AbstractMarkupTemplateParser.java:100)
    at org.thymeleaf.engine.TemplateManager.parseAndProcess(TemplateManager.java:666)
    at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1098)
    at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1072)
    at org.thymeleaf.spring5.view.ThymeleafView.renderFragment(ThymeleafView.java:362)
    at org.thymeleaf.spring5.view.ThymeleafView.render(ThymeleafView.java:189)
    at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1370)
    at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1116)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1055)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:942)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1005)
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:897)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:634)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:882)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
    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.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    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:92)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    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.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:93)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    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:200)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    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:199)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:490)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:834)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1417)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:748)
Caused by: org.attoparser.ParseException: Error during execution of processor 'org.thymeleaf.standard.processor.StandardEachTagProcessor' (template: "mods/index" - line 21, col 17)
    at org.attoparser.MarkupParser.parseDocument(MarkupParser.java:393)
    at org.attoparser.MarkupParser.parse(MarkupParser.java:257)
    at org.thymeleaf.templateparser.markup.AbstractMarkupTemplateParser.parse(AbstractMarkupTemplateParser.java:230)
    ... 52 more
Caused by: org.thymeleaf.exceptions.TemplateProcessingException: Error during execution of processor 'org.thymeleaf.standard.processor.StandardEachTagProcessor' (template: "mods/index" - line 21, col 17)
    at org.thymeleaf.processor.element.AbstractAttributeTagProcessor.doProcess(AbstractAttributeTagProcessor.java:117)
    at org.thymeleaf.processor.element.AbstractElementTagProcessor.process(AbstractElementTagProcessor.java:95)
    at org.thymeleaf.util.ProcessorConfigurationUtils$ElementTagProcessorWrapper.process(ProcessorConfigurationUtils.java:633)
    at org.thymeleaf.engine.ProcessorTemplateHandler.handleOpenElement(ProcessorTemplateHandler.java:1314)
    at org.thymeleaf.engine.TemplateHandlerAdapterMarkupHandler.handleOpenElementEnd(TemplateHandlerAdapterMarkupHandler.java:304)
    at org.thymeleaf.templateparser.markup.InlinedOutputExpressionMarkupHandler$InlineMarkupAdapterPreProcessorHandler.handleOpenElementEnd(InlinedOutputExpressionMarkupHandler.java:278)
    at org.thymeleaf.standard.inline.OutputExpressionInlinePreProcessorHandler.handleOpenElementEnd(OutputExpressionInlinePreProcessorHandler.java:186)
    at org.thymeleaf.templateparser.markup.InlinedOutputExpressionMarkupHandler.handleOpenElementEnd(InlinedOutputExpressionMarkupHandler.java:124)
    at org.attoparser.HtmlElement.handleOpenElementEnd(HtmlElement.java:109)
    at org.attoparser.HtmlMarkupHandler.handleOpenElementEnd(HtmlMarkupHandler.java:297)
    at org.attoparser.MarkupEventProcessorHandler.handleOpenElementEnd(MarkupEventProcessorHandler.java:402)
    at org.attoparser.ParsingElementMarkupUtil.parseOpenElement(ParsingElementMarkupUtil.java:159)
    at org.attoparser.MarkupParser.parseBuffer(MarkupParser.java:710)
    at org.attoparser.MarkupParser.parseDocument(MarkupParser.java:301)
    ... 54 more
Caused by: java.lang.IllegalArgumentException: Iteration variable cannot be null
    at org.thymeleaf.util.Validate.notNull(Validate.java:37)
    at org.thymeleaf.standard.expression.Each.<init>(Each.java:49)
    at org.thymeleaf.standard.expression.EachUtils.composeEach(EachUtils.java:169)
    at org.thymeleaf.standard.expression.EachUtils.internalParseEach(EachUtils.java:94)
    at org.thymeleaf.standard.expression.EachUtils.parseEach(EachUtils.java:65)
    at org.thymeleaf.standard.processor.StandardEachTagProcessor.doProcess(StandardEachTagProcessor.java:59)
    at org.thymeleaf.processor.element.AbstractAttributeTagProcessor.doProcess(AbstractAttributeTagProcessor.java:74)
    ... 67 more

Любая помощь приветствуется.Заранее спасибо, что просто взглянули, если у вас есть время.

Отладчик в контроллере модов Вот ссылка на мой репозиторий, если вы хотите скачать его и дать егопрогон.

Исключение гибернации в сеансе

Изменить на контроллер мод / индекс

1 Ответ

0 голосов
/ 31 января 2019

Этот вопрос оказался довольно сложным.История его разрешения выглядит следующим образом ...

Судя по трассировке стека:

Caused by: java.lang.IllegalArgumentException: Iteration variable cannot be null

была итерация в шаблоне тимелист, который имел итерацию переменной null.Единственное использование th:each, которое я смог найти, было:

<div th:if="${mods} != null">
    <tr th:each="mod : ${mods}">
         ...
    </tr>
</div>

Таким образом, казалось, что mods было null, и, следовательно, th:each="mod : ${mods}" - это то, в чем заключается проблема.

Однако была проверка для этого с <div th:if="${mods} != null">.Или был там?Будет ли полезно следующее:

<div th:if="${mods != null}">

т.е.переместите } так, чтобы проверка null была в выражении.

Это не помогло, поэтому был проверен результат modDao.findAll(), и были найдены два элемента.Так что это должно было быть что-то другое.

Изучение основ итерации в Thymeleaf показало, что, возможно, коллекция, возвращаемая findAll(), не является одним из поддерживаемых типов, которые th:each может повторять.over.

Таким образом, эта коллекция была скопирована в Iterable и получила другое имя, и проблема была решена.

Интересно, если переменной итерации было присвоено имя mod, проблемавсе еще произошло.Оказывается, mod является ключевым словом в hymeleaf и используется для работы модуля (%).

В конечном итоге возникли две проблемы с явно правильным кодом:

  1. DAO вернул коллекцию, но не ту, которую можно было бы перебрать с помощью th:each.
  2. mod - ключевое слово в Thymeleaf, и его не следует использовать в качестве имени переменной.
...