声明,基于springboot 上一篇博文 ,地址:
https://blog.csdn.net/weixin_42323802/article/details/83964225
在spring中,输入验证提供2种方式,一种基于spring框架,一种基于Hibernate Validator;
Hibernate Validator是JSR规范请求(Java Specification Request)的具体体现,其中包含了大部分输入验证所需要的注解,也可以自定义添加注解;
子模块项目结构:
首先在 WebController 添加一个保存的方法 saveUser,参数为 User。
/**
* @valid 注解表明 该对象开启了结果校验
* BindingResult 是把校验结果储存到该对象中,若校验通过储存,不通过把错误信息打印出来
* 校验,需要在user中,对不同的filed 添加不同的校验规则;
* @param user
* @param result
* @return
*/
@RequestMapping("/saveUser")
public void saveUser(@Valid User user, BindingResult result){
System.out.println(user);
// 对校验结果进行判断,获取校验信息
if (result.hasErrors()){
List<ObjectError> allErrors = result.getAllErrors();
for (ObjectError error : allErrors) {
System.out.println(error.getCode()+""+error.getDefaultMessage());
}
}
}
接下来在 User 中给需要校验的参数添加对应的注解,对不同的属性,按照规则添加不同的校验内容。
/**
* @auther SyntacticSugar
* @data 2018/11/11 0011下午 10:03
*/
public class User {
@NotEmpty(message = "姓名不能够为空")
private String name;
@Max(value = 100,message = "年龄不能够大于100岁")
private int age;
@Length(min = 6,message = "密码长度不能够小于6位")
private String pass;
// getter setter
.......
}
添加 test 方法、运行
/**
* 对user 的属性 进行valid 测试
*/
@Test
public void saveUsers() throws Exception {
mockMvc.perform(MockMvcRequestBuilders.post("/saveUser").param("name","").
param("age","666").param("pass","123"));
}
结果显示均已经触发了校验规则,返回了错误信息;Hibernate Validator 常见的注解如下:
注解 | 应用目标 | 运行时检查 | Hibernate 元数据影响 |
---|---|---|---|
@Length(min=, max=) | 属性(String) | 检查字符串长度是否符合范围 | 列长度会被设到最大值 |
@Max(value=) | 属性(以 numeric 或者 string 类型来表示一个数字) | 检查值是否小于或等于最大值 | 对列增加一个检查约束 |
@Min(value=) | 属性(以 numeric 或者 string 类型来表示一个数字) | 检查值是否大于或等于最小值 | 对列增加一个检查约束 |
@NotNull | 属性 | 检查值是否非空(not null) | 列不为空 |
@Past | 属性(date 或 calendar) | 检查日期是否是过去时 | 对列增加一个检查约束 |
@Future | 属性(date 或 calendar) | 检查日期是否是将来时 | 无 |
@Pattern(regex=“regexp”, flag=) | 属性(string) | 检查属性是否与给定匹配标志的正则表达式相匹配(见 java.util.regex.Pattern ) | 无 |
@Range(min=, max=) | 属性(以 numeric 或者 string 类型来表示一个数字) | 检查值是否在最小和最大值之间(包括临界值) | 对列增加一个检查约束 |
@Size(min=, max=) | 属性(array,collection,map) | 检查元素大小是否在最小和最大值之间(包括临界值) | 无 |
@AssertFalse | 属性 | 检查方法的演算结果是否为 false(对以代码方式而不是注解表示的约束很有用) | 无 |
@AssertTrue | 属性 | 检查方法的演算结果是否为 true(对以代码方式而不是注解表示的约束很有用) | 无 |
@Valid | 属性(object) | 对关联对象递归进行验证。如果对象是集合或数组,就递归地验证其元素;如果对象是 Map,则递归验证其值元素 | 无 |
属性(String) | 检查字符串是否符合有效的 email 地址规范 | 无 |
Spring Boot自定义 Filter;
Spring Boot中自定义过滤器 Filter 有两种实现方式,@WebFilter 和FilterRegistrationBean ;但是第一种不支持顺序优先级;
自定义 Filter 两个步骤:
-> 实现 Filter 接口,实现其中的 doFilter() 方法;
-> 添加 @Configuration 注解,将自定义 Filter 加入过滤链。
->新建 MyFilter 类,重写 doFilter() 方法:
自定义 MyFilter ,和 MyFilter2 ;
package com.neo.springbootweb.filter;
/**
* @auther SyntacticSugar
* @data 2018/11/12 0012上午 10:15
*/
// filter 导包javax.servlet.Filter;
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
// url级别的filter
HttpServletRequest request= (HttpServletRequest) servletRequest;
System.out.println("这是自定义的filter,url"+request.getRequestURI());
filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public void destroy() {}
}
MyFilter2为MyFilter copy 一份并更改打印内容;然后将自定义 Filter 加入过滤链:
/**
* @auther SyntacticSugar
* @data 2018/11/12 0012上午 10:26
*/
@Configuration
public class WebConfiguration {
/**
* :http://localhost:8080/getUsers 进行访问
* @RequestMapping(value = "/getUsers",method = RequestMethod.POST)
* 需要把 method = RequestMethod.POST 去掉,不然不支持get请求
* @return
*/
@Bean
public FilterRegistrationBean testFilterRegistrationBean() {
FilterRegistrationBean frb = new FilterRegistrationBean();
// 把自定义的filter 传进去
frb.setFilter(new MyFilter());
//
frb.addUrlPatterns("/*");
frb.setName("MyFilter");
frb.setOrder(6);
return frb;
}
/**
* 把 Myfilter2 添加到过滤器中,设置 order 为1
* order 越低,优先级越高;
* @return
*/
@Bean
public FilterRegistrationBean test2FilterRegistrationBean() {
FilterRegistrationBean frb = new FilterRegistrationBean();
// 把自定义的filter 传进去
frb.setFilter(new MyFilter2());
//
frb.addUrlPatterns("/*");
frb.setName("MyFilter2");
frb.setOrder(1);
return frb;
}
}
将 MyFilter 的 Order 属性设置为 6,将 MyFilter2 的 Order 属性设置为 1,重新启动项目,在浏览器中输入地址:http://localhost:8080/getUsers,就会看到控制台打印如下信息:
MyFilter2 具有较高的优先级;
在 Web 开发的过程中,经常需要自定义一些配置文件,如何使用呢?
->在 application.properties 中配置:
neo.title=打豆豆
neo.description=品味生活
->在 other.properties 中配置:
other.title=keep smile
other.blog=www.youknow.com
->注:同时存在 application.yml 和 application.properties,并且里面配置相同,application.properties 的配置会覆盖 application.yml。
创建单元测试:
package com.neo.springbootweb;
/**
* @auther SyntacticSugar
* @data 2018/11/12 0012上午 11:08
*/
@RunWith(SpringRunner.class)
@SpringBootTest
public class PropertiesTest {
/**
* 对自定义的 properties 进行测试
*/
@Value("${neo.title}")
private String title;
@Test
public void test() {
Assert.assertEquals(title, "打豆豆1");
}
}
/**
* @Value("${neo.title}") 默认读取application.properties文件中neo.title 赋值给title
* Assert.assertEquals用来判断 title 和“ 打豆豆 ”是否一致;
*/
运行结果如下,不一致 test不通过,执行测试用例运行正常,说明属性值加载成功。
读取多个配置:
定义一个 NeoProperties 对象,来接收所有以 neo 开头的配置内容。
/**
* @auther SyntacticSugar
* @data 2018/11/12 0012上午 11:55
*/
@ConfigurationProperties(prefix = "neo")
@Component
public class NeoProperties {
private String title;
private String description;
// setter getter
}
@ConfigurationProperties(prefix = “neo”)
neo 开头的 自动赋值到对象的属性中,neo.description 赋值到>description中
@Component 交给ioC
单元测试,把NeoProperties 对象注入即可;
/**
* 添加 @PropertySource 指定配置文件的位置
*/
@ConfigurationProperties(prefix = "other")
@Component
@PropertySource("classpath:other.properties")
public class OtherProperties {
private String title;
private String blog;
// getter setter
}
自定义一个配置文件
有时候需要自定义配置文件,以便和系统使用的 application.properties 文件区分开,避免混淆。Spring Boot 对这种情况也有很好的支持。
在 resources 目录下创建一个 other.properties 文件,内容如下:
@Autowired
private NeoProperties neoProperties;
@Test
public void testMore() {
System.out.println("title:" + neoProperties.getTitle());
System.out.println("description:" + neoProperties.getDescription());
}
/**
* 其他的配置类
*/
@Autowired
private OtherProperties otherProperties;
@Test
public void testOther() {
System.out.println("title:" + otherProperties.getTitle());
System.out.println("description:" + otherProperties.getBlog());
}
分别运行单元测试如下:
title:打豆豆
description:品味生活
说明成功;
打印结果:
title:keep smile
description:www.youknow.com
->自定义的other.properties 也成功了;
如果测试中出现中文乱码,可按照以下方法进行设置:
依次单击 File | Settings | Editor | File Encodings 命令,将 Properties Files (*.properties) 下的 Default encoding for properties files 设置为 UTF-8,勾选 Transparent native-to-ascii conversion 复选框。
参考资料来自:
纯洁的微笑 大神的分享 https://me.csdn.net/ityouknow