java绑定结果给出了白标签错误页

utugiqy6  于 2021-07-11  发布在  Java
关注(0)|答案(1)|浏览(232)

我有一个thymeleaf表单,可以在其中向父类别添加子类别:

<div th:if="${parentCategories.size() == 0}">
        <span>There are no categories, please, add some categories!</span>
    </div>
    <div th:unless="${parentCategories.size() == 0}">
        <label for="subcategoryForm">Add a subcategory</label>
        <form id="subcategoryForm" th:action="@{/category/add-subcategory}" th:object="${category}" method="post">

            <label for="name">Category name</label>
            <input id="name" type="text" th:field="*{categoryName}"/>
            <span th:if="${#fields.hasErrors('categoryName')}" th:errors="*{categoryName}" th:errorclass="error"></span>

            <label for="selectParentCategory">Enter a parent category</label>
            <select id="selectParentCategory" th:field="*{parentCategoryName}">
                <option th:each="category : ${parentCategories}"
                        th:value="${category.categoryName}"
                        th:text="${category.categoryName}"/>
                <span th:if="${#fields.hasErrors('parentCategoryName')}" th:errors="*{parentCategoryName}" th:errorclass="error"></span>
            </select>

            <button type="submit">Add category</button>
        </form>
    </div>

我有一个分类:

@Setter
@Getter
public class CategoryDTO {

    @CategoryValidator
    private String categoryName;

    @ParentCategoryValidator
    private String parentCategoryName;

}

@categoryvalidator由categoryvalidatorimpl验证:

@Autowired
    private CategoryRepository categoryRepository;

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        if(value.isBlank()){
            context.disableDefaultConstraintViolation();
            context.buildConstraintViolationWithTemplate("{categoryDTO.blank}").addConstraintViolation();
            return false;
        }

        Optional<Category> optionalCategory = categoryRepository.findByName(value);
        if (optionalCategory.isPresent()) {
            context.disableDefaultConstraintViolation();
            context.buildConstraintViolationWithTemplate("{categoryDTO.alreadyExists}").addConstraintViolation();
            return false;
        }

        Pattern pattern = Pattern.compile("[a-zA-Z\\s]*");
        Matcher matcher = pattern.matcher(value);
        if (!matcher.matches()) {
            context.disableDefaultConstraintViolation();
            context.buildConstraintViolationWithTemplate("{categoryDTO.name.invalid}").addConstraintViolation();
            return false;
        }

        return true;
    }

以及categorycontroller的一部分:

@GetMapping("/subcategory-form")
public String getSubcategoryForm(Model model){
    List<CategoryDTO> listOfParentCategories = categoryService.getParentCategories();
    model.addAttribute("category", new CategoryDTO());
    model.addAttribute("parentCategories", listOfParentCategories);
    return "add-subcategory-form";
}

@PostMapping("/add-subcategory")
public String addSubcategory(@Valid @ModelAttribute("category") CategoryDTO categoryDTO, BindingResult bindingResult){

 if(bindingResult.hasErrors()){
            return "add-subcategory-form";
        }
        categoryService.add(categoryDTO);
        return "redirect:/category/subcategory-form";
    }

在输入字段中,当我输入空白时,验证器在控制器中正确使用HasError发现它,但是当我在发现空白并返回false之后返回表单时,它给出了:
此应用程序没有/error的显式Map,因此您将此视为回退。
11月18日星期三13:45:26 eet 2020出现意外错误(类型=内部服务器错误,状态=500)。模板解析(template:“class path resource[templates/add subcategory form.html]”)org.thymeleaf.exceptions.templateinputexception:模板解析(template:“class path resource[templates/add subcategory form.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:1373)位于org.springframework.web.servlet.dispatcherservlet.ProcessDispatchesResult(dispatcherservlet。java:1118)在org.springframework.web.servlet.dispatcherservlet.dodispatch(dispatcherservlet。java:1057)在org.springframework.web.servlet.dispatcherservlet.doservice(dispatcherservlet。java:943)位于org.springframework.web.servlet.frameworkservlet.processrequest(frameworkservlet。java:1006)在org.springframework.web.servlet.frameworkservlet.dopost(frameworkservlet。java:909)在javax.servlet.http.httpservlet.service(httpservlet。java:652)在org.springframework.web.servlet.frameworkservlet.service(frameworkservlet。java:883)在javax.servlet.http.httpservlet.service(httpservlet。java:733)位于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.filter.requestcontextfilter.dofilterinternal(requestcontextfilter。java:100)在org.springframework.web.filter.onceperrequestfilter.dofilter(onceperrequestfilter。java:119)位于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:93)在org.springframework.web.filter.onceperrequestfilter.dofilter(onceperrequestfilter。java:119)在org.apache.catalina.core.applicationfilterchain.internaldofilter(applicationfilterchain)。java:193)在org.apache.catalina.core.applicationfilterchain.dofilter(applicationfilterchain。java:166)在org.springframework.boot.actuate.metrics.web.servlet.webmvcmetricsfilter.dofilterinternal(webmvcmetricsfilter)。java:93)在org.springframework.web.filter.onceperrequestfilter.dofilter(onceperrequestfilter。java:119)位于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:201)在org.springframework.web.filter.onceperrequestfilter.dofilter(onceperrequestfilter。java:119)位于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:202)在org.apache.catalina.core.standardcontextvalve.invoke(standardcontextvalve。java:97)在org.apache.catalina.authenticator.authenticatorbase.invoke(authenticatorbase。java:542)在org.apache.catalina.core.standardhostvalve.invoke(standardhostvalve。java:143)在org.apache.catalina.valves.errorreportvalve.invoke(errorreportvalve。java:92)在org.apache.catalina.core.standardenginevalve.invoke(standardenginevalve。java:78)在org.apache.catalina.connector.coyoteadapter.service(coyoteadapter。java:343)在org.apache.coyote.http11.http11processor.service(http11processor。java:374)在org.apache.coyote.abstractprocessorlight.process(abstractprocessorlight。java:65)在org.apache.coyote.abstractprotocol$connectionhandler.process(abstractprotocol。java:868)在org.apache.tomcat.util.net.nioendpoint$socketprocessor.dorun(nioendpoint)。java:1590)在org.apache.tomcat.util.net.socketprocessorbase.run(socketprocessorbase。java:49)位于java.base/java.util.concurrent.threadpoolexecutor.runworker(threadpoolexecutor。java:1128)在java.base/java.util.concurrent.threadpoolexecutor$worker.run(threadpoolexecutor。java:628)在org.apache.tomcat.util.threads.taskthread$wrappingrunnable.run(taskthread。java:61)在java.base/java.lang.thread.run(thread。java:834)原因:org.attoparser.parseexception:异常求值springel表达式:“parentcategories.size()==0”(模板:“add subcategory form”-第13行,第10列)位于org.attoparser.markupparser.parsedocument(markupparser。java:393)在org.attoparser.markupparser.parse(markupparser。java:257)位于org.thymeleaf.templateparser.markup.abstractmarkuptemplateparser.parse(abstractmarkuptemplateparser)。java:230) ... 52更多原因:org.thymeleaf.exceptions.templateprocessingexception:exception求值springel表达式:“parentcategories.size()==0”(模板:“add subcategory form”-第13行,第10栏)位于org.thymeleaf.spring5.expression.spelvariableexpressionevaluator.evaluate(spelvariableexpressionevaluator。java:290)在org.thymeleaf.standard.expression.variableexpression.executevariableexpression(variableexpression。java:166)在org.thymeleaf.standard.expression.simpleexpression.executeSample(simpleexpression。java:66)在org.thymeleaf.standard.expression.expression.execute(表达式。java:109)在org.thymeleaf.standard.expression.expression.execute(expression。java:138)在org.thymeleaf.standard.expression.expression.execute(expression。java:125)在org.thymeleaf.standard.processor.standardiftagprocessor.isvisible(standardiftagprocessor。java:59)在org.thymeleaf.standard.processor.abstractstandardconditionalvisibilitytagprocessor.doprocess(abstractstandardconditionalvisibilitytagprocessor)。java:61)在org.thymeleaf.processor.element.abstractAttributeAgProcessor.doprocess(abstractAttributeAgProcessor。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.templatehandleradaptermarkuphandler.handleopenelementend(templatehandleradaptermarkuphandler)。java:304)位于org.thymeleaf.templateparser.markup.inlinedoutputexpressionmarkuphandler$inlinemarkupadapterprocestorhandler.handleopenelementend(inlinedoutputexpressionmarkuphandler)。java:278)在org.thymeleaf.standard.inline.outputExpressionInlinePreprocessHandler.handleopenelementend(outputExpressionInlinePreprocessHandler)。java:186)位于org.thymeleaf.templateparser.markup.inlinedoutputexpressionmarkuphandler.handleopenelementend(inlinedoutputexpressionmarkuphandler)。java:124)在org.attoparser.htmlelement.handleopenelementend(htmlelement。java:109)在org.attoparser.htmlmarkuphandler.handleopenelementend(htmlmarkuphandler。java:297)在org.attoparser.markupeventprocessorhandler.handleopenelementend(markupeventprocessorhandler。java:402)在parseopenelement(parsingelementmarkuputil。java:159)在org.attoparser.markupparser.parsebuffer(markupparser。java:710)在org.attoparser.markupparser.parsedocument(markupparser。java:301) ... 54其他原因:org.springframework.expression.spel.spelevaluationexception:el1011e:方法调用:尝试对org.springframework.expression.spel.ast.methodreference.throwifnotnullsafe(methodreference)上的空上下文对象调用method size()。java:154)在org.springframework.expression.spel.ast.methodreference.getvalueref(方法引用。java:83)在org.springframework.expression.spel.ast.compoundexpression.getvalueref(compoundexpression。java:70)在org.springframework.expression.spel.ast.compoundexpression.getvalueinternal(compoundexpression。java:91)在org.springframework.expression.spel.ast.opeq.getvalueinternal(opeq。java:42)在org.springframework.expression.spel.ast.opeq.getvalueinternal(opeq。java:32)在org.springframework.expression.spel.ast.spelnodeimpl.getvalue(spelnodeimpl。java:112)在org.springframework.expression.spel.standard.spelexpression.getvalue(spelexpression。java:337)在org.thymeleaf.spring5.expression.spelvariableexpressionevaluator.evaluate(spelvariableexpressionevaluator。java:263) ... 75个以上
问题是,对于我的另一个表单,我只需要添加父类别,如果我添加一个空格,它会返回thymeleaf并打印我写的错误消息,但是我不能为这个表单找到答案。

gblwokeq

gblwokeq1#

stacktrace对该问题有以下提示:
计算springel表达式时出现异常:“parentcategories.size()==0”(模板:“add subcategory form”-第13行,第10列)
以及:
试图对空上下文对象调用方法size()

相关问题