java 校验框架_Spring自带的校验框架Validation的使用实例

本文介绍了一个SpringBoot项目中使用Spring的Validation框架进行表单验证的实例。从项目结构、前端页面、实体类、控制器到自定义校验器UserValidator的详细步骤逐一展开,强调了在编写过程中需要注意的类导入和错误处理。文章以一个小结结尾,提醒开发者在编码时的细心和检查的重要性。
摘要由CSDN通过智能技术生成

1.首先来一个项目结构图以及所需jar包

cb5b2fe07a425e9a85251a1238c5a9df.png

5f6bf3e90caafb8bb89fcf1759c92958.png

可以看到,没有添加除了日志和jstl相关的jar包外,没有其他spring以外的第三方jar包(即使用的是spring自带的校验框架)。

2.从前台页面开始,首先是接收用户信息的表单loginForm.jsp

pageEncoding="UTF-8"%>

测试validator接口验证

登录页

登录名:
密码:

3.实体类User.java

public class User {

private String loginname;

private String password;

//省略set和get方法…

}

4.控制器UserController.java

@Controller

public class UserController {

//注入UserValidator对象

@Autowired

@Qualifier("userValidator")

private UserValidator userValidator;

@RequestMapping(value="/{formName}")

public String loginForm(

@PathVariable String formName,Model model){

User user = new User();

model.addAttribute("user", user);

// 动态跳转页面

return formName;

}

@RequestMapping(value="/login", method=RequestMethod.POST)

public String login(@ModelAttribute User user,Model model,Errors errors){

model.addAttribute("user", user);

//调用userValidator的验证方法

userValidator.validate(user, errors);

//如果验证不通过跳转到loginForm视图

if(errors.hasErrors()){

return "loginForm";

}

return "success";

}

}

5.校验器UserValidator.java

//实现Spring的Validator接口

@Repository("userValidator")

public class UserValidator implements Validator{

//该校验器能够对clazz类型的对象进行校验

public boolean supports(Class> clazz) {

//User指定的class参数所表示的类或接口是否相同,或是否是其超类的超接口

return User.class.isAssignableFrom(clazz);

}

//对目标类target进行校验,并将校验错误记录在errors中

public void validate(Object target, Errors errors) {

/**

*使用ValidationUtils中的一个静态方法rejectIfEmpty()来对

*loginname属性进行校验,假若‘loginname'属性是null或者空字符

*串的话,就拒绝验证通过。

*/

ValidationUtils.rejectIfEmpty(errors, "loginname", null,"登录名不能为空");

ValidationUtils.rejectIfEmptyOrWhitespace(errors, "password", null,"密码不能为空");

User user = (User) target;

if(user.getLoginname().length() > 10){

//使用Errors的rejectValue方法验证

errors.rejectValue("loginname", null, "用户名不能超过10个字符");

}

if(user.getPassword() != null && !user.getPassword().equals("")

&& user.getPassword().length() <6){

errors.rejectValue("password", null, "密码不能小于6位");

}

}

}

6.spring的配置文件和web.xml的配置文件略……

小结:

第一遍敲这个代码的时候,有着各种各样的小问题出现,比较多的就是 类所对应的路径要import对,因为不同的包中可能会有相同名字的类,而此时一不小心就会导错了包,会给后面的编写代码带来不必要的麻烦。昨天的时候就调试这个小小的demo就花了好久的时间,后来也没再去管,然后今天有空了又重新敲了一遍代码,发现没有问题,直接一次就通过了,然后去对比昨天的代码发现,是我在第一遍敲代码的时候把实体类的get和set方法的名字敲错了(追溯起来的话是写属性的时候把属性名敲错了,然后get和set方法是自动生成的,后面去修改属性时导致没有将相应的set和get方法改正),哎,,,还是太粗心

ok,然后就是启动服务器运行程序…

915cbc4cce8e6d6087797116fe297211.png

b15345e95ec8607481282beae1bcbd64.png

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。如果你想了解更多相关内容请查看下面相关链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 使用Java注解校验框架可以很方便地校验集合对象。可以使用`@Valid`注解来指示校验器递归地校验集合的元素。 以下是一个示例代码段,它演示了如何在集合对象使用`@Valid`注解: ```java public class Order { @NotNull private String id; @NotNull @Size(min = 1) private List<@Valid Item> items; // ... getters and setters } public class Item { @NotNull private String productId; @Min(1) private int quantity; // ... getters and setters } ``` 在这个示例,`Order`类包含一个名称为`items`的列表属性,它包含了`Item`对象。`@Valid`注解告诉校验器要递归地校验`Item`对象。`@Size(min = 1)`注解指示`items`列表不能为空。`Item`类包含了`productId`和`quantity`属性,并使用`@NotNull`和`@Min`注解进行校验。 要执行校验,可以使用类似以下的代码: ```java ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); Validator validator = factory.getValidator(); Order order = new Order(); Set<ConstraintViolation<Order>> violations = validator.validate(order); if (violations.isEmpty()) { // 校验通过 } else { // 校验失败,对校验失败的信息进行处理 } ``` 这个示例演示了如何使用Java注解校验框架校验集合对象。在校验集合时,使用`@Valid`注解可以很方便地递归地校验集合的元素。 ### 回答2: 使用Java注解校验框架如Hibernate ValidatorSpring Validation可以方便地对集合对象进行校验。以下是一个使用Hibernate Validator校验集合对象的示例代码: 首先,我们创建一个包含集合对象的Java类,例如UserGroup: ```java public class UserGroup { @NotEmpty(message = "User list cannot be empty") private List<@Valid User> userList; // getters and setters } ``` 在UserGroup类,我们使用了Hibernate Validator提供的@NotEmpty注解来确保该列表不为空。同时,通过@Valid注解来校验列表的每个User对象。 接下来,我们创建一个包含校验逻辑的Java类,例如UserValidator: ```java public class UserValidator { public static void main(String[] args) { UserGroup userGroup = new UserGroup(); // 假设从数据库查询出了一些用户并将其添加到userList List<User> userList = new ArrayList<>(); userList.add(new User("", "123456")); userGroup.setUserList(userList); ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); Validator validator = factory.getValidator(); Set<ConstraintViolation<UserGroup>> violations = validator.validate(userGroup); for (ConstraintViolation<UserGroup> violation : violations) { System.out.println(violation.getMessage()); } } } ``` 在UserValidator,我们创建了一个UserGroup对象,并向其添加了一个用户名为空的User对象。接着,我们使用Validation.buildDefaultValidatorFactory()方法获取一个默认的ValidatorFactory实例,并通过该实例获取一个Validator,用于后续的校验操作。 然后,我们使用validator.validate(userGroup)方法对UserGroup对象进行校验,并将校验结果保存在一个Set集合。最后,我们遍历该集合,并输出每个校验错误的消息。 在上述示例,当我们运行UserValidator类时,会输出"User list cannot be empty"的错误消息,因为我们在UserGroup类的userList字段上标注了@NotEmpty注解,该注解要求该列表不为空。 通过以上示例,可以看出使用Java注解校验框架可以方便地对集合对象进行校验,可以通过不同的注解来定义校验规则,并通过校验器来执行校验操作。 ### 回答3: 使用java注解校验框架可以通过给集合对象定义自定义注解,并在注解添加相应的校验规则,然后使用注解处理器来对集合对象进行校验。以下是一段示例代码: 首先,定义一个用于校验集合对象的注解`@ValidateCollection`,并在注解添加一个校验规则`notEmpty`,用于判断集合对象是否为空。代码如下所示: ```java import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface ValidateCollection { boolean notEmpty() default true; } ``` 接下来,定义一个使用了`@ValidateCollection`注解的类`User`,其有一个使用了该注解的集合对象`roles`。代码如下所示: ```java import java.util.List; public class User { @ValidateCollection(notEmpty = true) private List<String> roles; // 省略其他属性和方法 } ``` 然后,创建一个注解处理器`ValidateCollectionProcessor`,用于处理`@ValidateCollection`注解,并对集合对象进行校验。代码如下所示: ```java import java.lang.reflect.Field; import java.util.Collection; public class ValidateCollectionProcessor { public static void validate(Object obj) throws IllegalAccessException { Field[] fields = obj.getClass().getDeclaredFields(); for (Field field : fields) { if (field.isAnnotationPresent(ValidateCollection.class)) { field.setAccessible(true); ValidateCollection annotation = field.getAnnotation(ValidateCollection.class); Collection collection = (Collection) field.get(obj); if (annotation.notEmpty() && (collection == null || collection.isEmpty())) { throw new IllegalArgumentException("集合对象不能为空"); } } } } } ``` 最后,在需要对集合对象进行校验的地方,调用`ValidateCollectionProcessor`类的`validate`方法进行校验。代码如下所示: ```java public class Main { public static void main(String[] args) throws IllegalAccessException { User user = new User(); user.setRoles(null); ValidateCollectionProcessor.validate(user); } } ``` 以上示例,我们对`User`类的`roles`集合对象进行了校验,根据`@ValidateCollection`注解的规则,如果`roles`集合对象为空,则会抛出异常提示集合对象不能为空。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值