博客详情

JSR-303和springmvc的参数校验(@Validated) (原创)

作者: 朝如青丝暮成雪
发布时间:2019-04-13 14:02:33  文章分类:java编程   阅读(1969)  评论(0)

一、什么是JSR

JSR是Java Specification Requests的缩写,意思是Java 规范提案。是指向JCP(Java Community Process)提出新增一个标准化技术规范的正式请求。任何人都可以提交JSR,以向Java平台增添新的API和服务。JSR已成为Java界的一个重要标准。

二、什么是JSR-303

JSR-303 是 JAVA EE 6 中的一项子规范,叫做 Bean Validation,官方参考实现是Hibernate Validator。
此实现与 Hibernate ORM 没有任何关系。 JSR 303 用于对 Java Bean 中的字段的值进行验证。 
Spring MVC 3.x 之中也大力支持 JSR-303,可以在控制器中对表单提交的数据方便地验证。 
注:可以使用注解的方式进行验证。


三、springmvc集成JSR-303(@validated)

1、pom.xml中引入相应jar包

<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.2.1.Final</version>
    </dependency>

2 、springmvc.xml 配置


 <mvc:annotation-driven  validator="validator"></mvc:annotation-driven>

<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
     <property name="providerClass" value="org.hibernate.validator.HibernateValidator"/> 
     <property name="validationMessageSource" ref="validationMessageSource" />
</bean>

    <bean id="validationMessageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basenames">
  <list>
     <value>classpath:validationMessageSource</value>  
   </list>
</property>
</bean>


3、 在需要校验的bean上添加相应的JSR-303的校验注解


/**
 * @author jelly
 */
public class Goods implements Serializable {
 
	private static final long serialVersionUID = 1L;
	
	@NotBlank(message="{goods.name.notBlank}")
	@Length(min=1,max=20,message="{goods.name.add}",groups= {GoodsAddVG.class})//add 
	@Size(min=1,max=30,message="{goods.name.update}",groups= {GoodsUpdateVG.class})//update 
	private String goodsName;//商品名称
	
	private Integer stockNum;//库存
	@NotBlank(message="{goods.remark.notBlank}")
	private String remark;//备注
	public String getGoodsName() {
		return goodsName;
	}
	public void setGoodsName(String goodsName) {
		this.goodsName = goodsName;
	}
	public Integer getStockNum() {
		return stockNum;
	}
	public void setStockNum(Integer stockNum) {
		this.stockNum = stockNum;
	}
	public String getRemark() {
		return remark;
	}
	public void setRemark(String remark) {
		this.remark = remark;
	}
  
}


4、在springmvc的controller方法参数前标记@Validated注解


package com.tingcream.pagehelper.controller;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.validation.ObjectError;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.tingcream.pagehelper.common.RetMsg;
import com.tingcream.pagehelper.model.Goods;
import com.tingcream.pagehelper.req.GoodsAddVG;
import com.tingcream.pagehelper.req.GoodsUpdateVG;

/**
 * 商品controller  group分组校验
 * @author jelly
 *
 */
@RestController
@RequestMapping("/goods")
public class GoodsController {

	/**
	 * add 方法
	 * @param goods
	 * @param bindingResult
	 * @return
	 */
	@RequestMapping("/add")
	public  RetMsg add(HttpServletRequest request, HttpServletResponse response, 
			@Validated(value= {GoodsAddVG.class}) Goods goods,
			BindingResult bindingResult) {
		 if(bindingResult.hasErrors()){// 参数验证失败
		       List errList =bindingResult.getAllErrors();
		       Map map= new HashMap<>();
		       errList.stream().forEach((ObjectError err)->{
		            String field= ((FieldError)err).getField();
		            String msg =err.getDefaultMessage();
		            map.put(field,msg);
		       });
		       return  RetMsg.fail(map);
		     }
		     return RetMsg.success();
	}
	/**
	 * update 方法
	 * @param goods
	 * @param bindingResult
	 * @return
	 */
	@RequestMapping("/update")
	public  RetMsg update(@Validated(GoodsUpdateVG.class) Goods goods,
			BindingResult bindingResult) {
		if(bindingResult.hasErrors()){// 参数验证失败
			List errList =bindingResult.getAllErrors();
			Map map= new HashMap<>();
			errList.stream().forEach((ObjectError err)->{
				String field= ((FieldError)err).getField();
				String msg =err.getDefaultMessage();
				map.put(field,msg);
			});
			return  RetMsg.fail(map);
		}
		return RetMsg.success();
	}
	
}



import javax.validation.groups.Default;
/**
 * 商品添加  验证组
 * @author jelly
 */
public interface GoodsAddVG  extends Default{

}



package com.tingcream.pagehelper.req;

import javax.validation.groups.Default;

/**
 * 商品修改 验证组  
 * @author jelly 
 */
public interface GoodsUpdateVG  extends Default{

}


validationMessageSource.properties 配置

goods.name.notBlank=商品名称不能为空 goods.name.add=商品名称为1-20个字符
goods.name.update=商品名称为1-30个字符
goods.remark.notBlank=备注不能为空


注 :

1 、STS(eclipse) 中可以安装Properties Editor 插件,支持properties文件中编写中文的属性值。

2、 bean注解示例:

@NotNull(message = "所属部门不能为空")
private Integer deptId;
@NotBlank(message = "手机号不能为空")
@Pattern(regexp = "^(13|14|15|16|17|18|19)[0-9]{9}$", message = "手机号格式错误")
private String phone;
@NotBlank(message = "登录账号不能为空")
@Length(min=6,max=32,message="登录账号长度为6~32位")
private String loginName;




关键字:  JSR-303  springmvc  validated
评论信息
暂无评论
发表评论

亲,您还没有登陆,暂不能评论哦! 去 登陆 | 注册

博主信息
   
数据加载中,请稍候...
文章分类
   
数据加载中,请稍候...
阅读排行
 
数据加载中,请稍候...
评论排行
 
数据加载中,请稍候...

Copyright © 叮叮声的奶酪 版权所有
备案号:鄂ICP备17018671号-1

鄂公网安备 42011102000739号