验证参数对我接触过的框架来说就struts2有自带参数验证,对于springmvc来说以前的项目只能一个个来验证
接下来分享一下springmvc怎么验证参数,让前端调用接口的时候能能很清楚的了解有那个值没传
这里要拥戴hibernate的一个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.1.0.Final</version> </dependency> <dependency> <groupId>javax.el</groupId> <artifactId>el-api</artifactId> <version>2.2</version> </dependency>
在创建一个实体的验证类(这里我用的是登陆需要账号密码)
package com.yuanxinbuluo.service.user.valid; import java.io.Serializable; import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; import javax.validation.groups.Default; import com.yuanxinbuluo.util.valid.group.GroupB; /** * 用户验证实体*/ public class UserValid implements Serializable{ private static final long serialVersionUID = 4615558843543647320L; /** * 用户名称 */ @NotNull(message="用户名不能为空") private String userNm;/** * 用户密码 */ @Size(min=6 ,max= 20 ,message = "密码长度不符合标准") private String userPwd; public String getUserNm() { return userNm; } public void setUserNm(String userNm) { if(!userNm.trim().equals("")){ this.userNm = userNm; } }public String getUserPwd() { return userPwd; } public void setUserPwd(String userPwd) { this.userPwd = userPwd; } }
接下来在控制器用对象封装传过来的值
@ResponseBody @RequestMapping(value = "/login", method = RequestMethod.POST) public Map<String, Object> login(@Validated UserValid user, BindingResult result){ /** * 验证 */ if(result.hasErrors()){ List<FieldError> error = result.getFieldErrors(); String msg = error.get(0).getDefaultMessage(); return super.result(RequestHttpCode.SC_BAD_REQUEST, msg); }
--业务-- }
好了,user这个类是刚刚创建的验证参数的验证实体类,BindingResult 是一个验证,如果传过来的值不符合刚刚在实体类的注解时,调用方法
hasErrors() 如果有错误返回true否则false 后面代码只是获取错误定义返回message
这时候调试的时候,获取的message是无序的,怎么能做到有序呢,
创建几个类
package com.yuanxinbuluo.util.valid.group; import javax.validation.GroupSequence; import javax.validation.groups.Default; /** * 验证顺序接口*/ @GroupSequence( { Default.class, GroupA.class, GroupB.class }) public interface Group { }
package com.yuanxinbuluo.util.valid.group; /** * 验证顺序接口*/ public interface GroupA { }
package com.yuanxinbuluo.util.valid.group; /** * 验证顺序接口*/ public interface GroupB { }
这是在把user这个类添加group
/** * 用户号码 */
@NotNull(message="用户名不能为空", groups = Default.class)
private String userNm;
/** * 用户密码 */ @Size(min=6 ,max= 20 ,message = "密码长度不符合标准", groups = GroupA.class) private String userPwd;
@ResponseBody @RequestMapping(value = "/login", method = RequestMethod.POST) public Map<String, Object> login(@Validated(Group.class) UserValid user, BindingResult result){ }
这个时候他会去先去检验用户名在密码,当一个验证实体类的属性,有几个属性是一个接口验证,另外几个属性是另外一个接口验证,
这种情况也可以用上面去分组
groups 是可以有多个