Spring实战第五版第二章
2.3 校验表单输入
在编写"/design"页面post处理逻辑时,按照书本上直接'return "design"; '方式,会报如下错误:
Caused by: java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'design' available as request attribute
at org.springframework.web.servlet.support.BindStatus.<init>(BindStatus.java:153)
at org.springframework.web.servlet.support.RequestContext.getBindStatus(RequestContext.java:903)
at org.thymeleaf.spring5.context.webmvc.SpringWebMvcThymeleafRequestContext.getBindStatus(SpringWebMvcThymeleafRequestContext.java:227)
at org.thymeleaf.spring5.util.FieldUtils.getBindStatusFromParsedExpression(FieldUtils.java:306)
at org.thymeleaf.spring5.util.FieldUtils.getBindStatus(FieldUtils.java:253)
at org.thymeleaf.spring5.util.FieldUtils.getBindStatus(FieldUtils.java:227)
at org.thymeleaf.spring5.processor.AbstractSpringFieldTagProcessor.doProcess(AbstractSpringFieldTagProcessor.java:174)
at org.thymeleaf.processor.element.AbstractAttributeTagProcessor.doProcess(AbstractAttributeTagProcessor.java:74)
... 63 more
个人猜测post请求时,model数据模型中的数据被清空,导致重新请求视图时,绑定的“design”对象为空,在渲染输入框中“design”对象属性时报错。可采用redirect方式重新请求“/design”的get方法,或重新设置model。
@PostMapping
public String processDesign(@Valid Taco design, Errors error,Model model){
//若校验不生效,则检查valid依赖包是否引入完整
if(error.hasErrors()){
model.addAttribute("design",new Taco());
return "design";//直接请求视图报错,可能因为model中的map.design为空
// return "redirect:design";
}
log.info("processing design :"+design);
return "redirect:/orders/current";//type=Not Found, status=404
// return "/orders/current";//直接请求视图,未编辑网页时报错模板不存在
}
通过传入model的方式解决报错后,请求校验不通过时前后页面变化如下图,原“ingredients”信息不再存在,进一步证实model中数据未在视图中保存。
ps:字段校验不生效,需检查javax.validation依赖包是否完整导入
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>1.1.0.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.4.1.Final</version>
</dependency>
<dependency>
<groupId>org.jboss.logging</groupId>
<artifactId>jboss-logging</artifactId>
<version>3.3.0.Final</version>
</dependency>
<dependency>
<groupId>com.fasterxml</groupId>
<artifactId>classmate</artifactId>
<version>1.3.3</version>
</dependency>