发表于: 2020-09-24 23:14:30

1 1352


今天完成的:
用Spring messageSource 配置错误信息,在接口处做校验,根据错误的类型返回对应的错误信息。
0、添加依赖
在pom.xml中添加依赖
<!-- https://mvnrepository.com/artifact/javax.validation/validation-api -->
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.hibernate.validator/hibernate-validator -->
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.1.5.Final</version>
</dependency>
1、配置spring的xml文件
#校验器的注册
<mvc:annotation-driven validator="validator" conversion-service="conversion-service"/>
#校验器的配置
<!--  校验器配置  -->
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
<property name="providerClass"  value="org.hibernate.validator.HibernateValidator"/>
<!--不设置则默认为classpath下的 ValidationMessages.properties -->
<property name="validationMessageSource" ref="validatemessageSource"/>
</bean>
<bean id="conversion-service" class="org.springframework.format.support.FormattingConversionServiceFactoryBean" />
<bean id="validatemessageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basename" value="classpath:validatemessages"/>
<property name="fileEncodings" value="utf-8"/>
</bean>
在validator中配置了错误信息源。在validatemessageSource中配置了错误信息文件的位置。
2、改写pojo类
@NotBlank(message = "{bid.null}")
private String bid;
@NotBlank(message = "{bname.null}")
private String bname;
@NotBlank(message = "{abs.null}")
private String abs;
@NotBlank(message = "{press.null}")
private String press;
@NotBlank注解需要导入javax.validation包,验证字符串非null,且长度必须大于0。
import javax.validation.constraints.NotBlank;
错误信息是在validatemessages.properties文件中配置
3、写校验信息文件validatemessages.properties
bid.null=please enter id of book
bname.null=please enter name of book
abs.null=please enter abstract of book
press.null=please enter press of book
4、改写controller
添加了@Validated注解,给book添加了校验。results是校验的结果,request是为了返回校验的错误信息。
如果出现了错误,就拿到错误信息,传到相应的jsp页面里。
/******************* 增 ************************/
@PostMapping(value = "/books")
public String addBook(@RequestBody @Validated Book book, BindingResult results, HttpServletRequest request){
if (results.hasErrors()) {
// 获得校验失败的信息
List<ObjectError> errors = results.getAllErrors();
ArrayList<String> errorsList = new ArrayList<>();
errors.forEach(o -> {
errorsList.add(o.getDefaultMessage());
});
request.setAttribute("errors", errorsList);
// 返回包含校验错误信息的jsp页面
return "add-valid-erorr";
}
if (bookService.add(book)) {
// 如果添加成功,就返回成功的json
return "add";
}
// 失败,就返回失败的json
return "addFail";
}
5、返回错误信息
我直接在jsp页面里写的。。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>参数校验不通过</title>
</head>
<body>
<h1>
<%
Object errors = request.getAttribute("errors");
out.print(errors);
%>
</h1>
</body>
</html>
用postman测试,id为空,abs为空,返回了相应的错误信息。
明天计划的:
看看nginx怎么配置静态资源。
师兄,我task2可以提交了吗?还有要改的不?
遇到的问题:
刚开始搜MessageResource,搜到的都是关于国际化的东西。
后来搜spring validation,才慢慢找到可以参考的东西。而且里面用到了hibernate-validator,我以为可以用别的validator。
搜了下才发现springboot都用的是hibernate-validator,应该是集成到框架中了,不知道理解的对不对。
在controller中进行参数校验,感觉跟正常的逻辑混在一起了。也不能加@ResponseBody,不方便把错误信息直接用GSON解析返回,但是把信息返回到jsp页面中我又不是很懂。。。
收获:
了解了spring validation最简单的用法。



返回列表 返回列表
评论

    分享到