spring-boot整合validate
在Contrller中进行验证
创建spring-boot整合validate工程,在Controller中验证形参
springboot版本是2.0.0.RELEASE已经内置hibernate validate好的,隶属于jsr303规范
官网:(以官网为准)
http://hibernate.org/validator/
api doc
https://docs.jboss.org/hibernate/stable/validator/api/
创建工程,添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
spring-boot-starter-web已将依赖添加了
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
测试在不进行验证时候的返回值
编写Controler代码
@RestController
@RequestMapping("validate")
@Slf4j
public class ValidateController {
@RequestMapping("validate")
public String validateTest(String address) {
log.info("address={}", address);
return "success";
}
}
访问http://localhost:8080/validate/validate返回如下
{
"timestamp": "2019-11-20T08:06:15.728+0000",
"status": 400,
"error": "Bad Request",
"message": "Required String parameter 'address' is not present",
"path": "/user/validate"
}
访问http://localhost:8080/validate/validate?address返回success
测试在进行进行验证的时候的返回值
请求方法中的请求参数上直接添加验证规则 如:@NotNull ,需要在该类上面需要添加@Validated
import org.hibernate.validator.constraints.NotBlank;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import lombok.extern.slf4j.Slf4j;
@RestController
@RequestMapping("validate")
@Slf4j
@Validated
public class ValidateController {
@RequestMapping("validate")
public String validateTest(@NotBlank(message = "地址不能为空!") String address) {
log.info("address={}", address);
return "success";
}
}
再次访问http://localhost:8080/validate/validate?address如下.成功的进行了验证
{
"timestamp": "2019-11-20T08:13:53.382+0000",
"status": 500,
"error": "Internal Server Error",
"message": "validateTest.address: 地址不能为空!",
"path": "/user/validate"
}
验证实体类
编写一个实体类,@Past验证生日字段
import java.util.Date;
import javax.validation.constraints.Past;
import org.springframework.format.annotation.DateTimeFormat;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
@Data
public class User {
private String name;
@Past(message = "生日必须是一个过去的日期")
@JsonFormat(pattern = "yyyy/MM/dd", timezone = "GMT+8")
@DateTimeFormat(pattern = "yyyy/MM/dd")
private Date birthday;
}
在Controller中进行验证
Contrller的类上添加@Validated,方法的形参的实体类上添加@Valid注解,后面紧跟着BindingResult result(必须强制性的),校验的结果放在了result中。
import javax.validation.Valid;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.biillrobot.study.spring.validte.dataobject.User;
import lombok.extern.slf4j.Slf4j;
@RestController
@RequestMapping("user")
@Slf4j
@Validated
public class UserController {
@RequestMapping("add")
public String add(@Valid User user, BindingResult result) {
log.info("user={}", user);
return "success";
}
}
测试访问
http://localhost:8080/user/add?name=l