在spring 4.0 注解数据验证1中有基本的数据验证方法。还是那个POJO:
package com.suyin.pojo; import java.lang.reflect.Field; import org.hibernate.validator.constraints.NotBlank; public class People { private int id; @NotBlank private String name; private String address; private int age; public final int getId() { return id; } public final void setId(int id) { this.id = id; } public final String getName() { return name; } public final void setName(String name) { this.name = name; } public final String getAddress() { return address; } public final void setAddress(String address) { this.address = address; } public final int getAge() { return age; } public final void setAge(int age) { this.age = age; } @Override public String toString() { return "People [id=" + id + ", name=" + name + ", address=" + address + ", age=" + age + "]"; } public People set(String name, Object obj) { try { Field f = this.getClass().getDeclaredField(name); f.setAccessible(true); f.set(this, obj); } catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) { e.printStackTrace(); } return this; } }
有如下需求: 添加时要保证name不为空;修改时要保证name和address不为空。这怎么办?
spring4.0 提供了解决方案。先写两个标志接口 First和Second,类似于java.io.Serializable,如下:
package com.suyin.my.va; public interface First {}
和
package com.suyin.my.va; public interface Second {}
改造People如下:
package com.suyin.pojo; import java.lang.reflect.Field; import org.hibernate.validator.constraints.Email; import org.hibernate.validator.constraints.NotBlank; import com.suyin.my.va.First; import com.suyin.my.va.Second; public class People { private int id; @NotBlank(groups= {First.class,Second.class}) private String name; @NotBlank(groups= {Second.class}) private String address; private int age; public final int getId() { return id; } public final void setId(int id) { this.id = id; } public final String getName() { return name; } public final void setName(String name) { this.name = name; } public final String getAddress() { return address; } public final void setAddress(String address) { this.address = address; } public final int getAge() { return age; } public final void setAge(int age) { this.age = age; } @Override public String toString() { return "People [id=" + id + ", name=" + name + ", address=" + address + ", age=" + age + "]"; } public People set(String name, Object obj) { try { Field f = this.getClass().getDeclaredField(name); f.setAccessible(true); f.set(this, obj); } catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) { e.printStackTrace(); } return this; } }
在name上加了 @NotBlank(groups= {First.class,Second.class})
在address上加了 @NotBlank(groups= {Second.class})
可以猜测当遇到 First标志时会验证name,在遇到Second标志时会验证name和address。 那么现在只要告诉spring验证时使用First还是Second标志就可以了。
在Controller中有方法
@RequestMapping(value="/add") public String add(@Validated(First.class) People p,BindingResult result, HttpServletRequest request) { if(result.hasErrors()) { System.out.println(result.getFieldErrors()); return "error"; } this.peopleService.add(p); return "people/detail"; } @RequestMapping("/update") public String update(@Validated(Second.class) People p,BindingResult result,HttpServletRequest request) { if(result.hasErrors()) { System.out.println(result.getFieldErrors()); return "error"; } this.peopleService.update(p); return "people/detail"; }
在每个方法参数People p之前,把原来的@Valid改为了@Validated,并且分别加上了参数First.class和Second.class。
初步发觉@Valid和@Validated不能混用。也就是说如果在field上加了 groups={xxx.class},那么就没法用@Valid了,必须用@Validated