springboot2.0中Spring MVC的JSR具体体现Hibernate Validator,Spring Boot自定义过滤器Filter

版权声明:本站所提供的文章资讯、软件资源、素材源码等内容均为本作者提供、网友推荐、互联网整理而来(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考,如有侵犯您的版权,请联系我,本作者将在三个工作日内改正。 https://blog.csdn.net/weixin_42323802/article/details/84000994

声明,基于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"));
    }

hgjds

结果显示均已经触发了校验规则,返回了错误信息;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,则递归验证其值元素
@Email 属性(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 具有较高的优先级;

j


在 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

猜你喜欢

转载自blog.csdn.net/weixin_42323802/article/details/84000994