0. 注解校验无效的教训是需要spring mvc的支持,cxf不得行
@Validated和@Valid区别
@NotEmpty等JSR-303注解groups属性+BingResult的使用
一次校验不生效的排查记录+springmvc底层的校验实现
简单的一个demo
simple code在gitee中
@NotEmpty、@NotBlank、@NotNull三种注解的区别
一切都要从JSR-303规范提案说起,@Valid就是其抽象层面的产物…
1. @Validated和@Valid区别
@Valid支持,但@Validated不支持对象属性的注解 -> 对象属性如果是需要嵌套校验的情况下需要使用@Valid
// controller 中
@post find(@validated @reqbody Dto dto,BingResult br);
class Dto{
// 嵌套校验
@Valid
list<User> users;
@NotEmpty
string id;
}
2. 校验异常信息自动注入到BingResult
BindingResult需要放到@Validated/@Valid注释的对象后面
3. @NotEmpty等注解的groups属性
允许同一个被校验对象在不同情况下表现出不同校验行为
4. springmvc 底层对校验逻辑的支持
Spring Validation只是一个抽象,真正执行参数校验的是hibernate validator
spring mvc 真正做的是:捕获由validator抛出的异常,并封装到BingResult
5. simple code
import lombok.AllArgsConstructor;
import lombok.Data;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
/**
* @Author: weng
* @Date: 2022/5/4
* @Description: com.weng.cloud.service8881.javax.validation.controller
*
* spring controller中借助@NotNull注解可以抛出异常
*
* 其他地方使用这类注解好像只是文档的作用...
*/
@RestController
@RequestMapping("/javax/validation/testValidation")
public class TestValidationController {
@RequestMapping(value = "/testNotNull")
public String testNotNull(@Valid User user){
return "i wanna be a friend...";
}
public void testFinal(final String weng){
//do not thing
}
public static void main(String[] args) {
//编译是不会报错的-->final null
new TestValidationController().testFinal(null);
}
}
@Data
@AllArgsConstructor
class User{
@NotNull(message = "哎哎哎")
String name;
//int age;
}