一、表单参数校验
1、@Valid
- 引入依赖,因为常用在web项目,所以引入了 spring-boot-starter-web的话就不需要再引入
- 表单入参实体属性添加需要的注解,比如我这里是判空
public class Product {
@NotNull
private Integer id;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
}
- 接着还需要在接口参数前加注解 @Valid,否则不起效果
@RestController
public class ProductController {
@RequestMapping("/product")
public String product(@Valid @RequestBody Product product){
return "product:content";
}
}
- 没加之前,即使为空也可以直接调用,而我们常用的做法就是自己在代码里判空之类的
- 加入之后,加了判空的属性如果没传就不能成功调用接口
2、利用 ConstraintValidator 自定义校验器注解
-
依赖同上,有spring-boot-starter-web的话就不需要再引入
-
增加一个自定义注解,还有一个校验器,校验器实现 ConstraintValidator,并绑定自定义的注解
/**
* 自定义校验注解
*/
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD,ElementType.PARAMETER})
@Constraint(validatedBy = ParamValidatorClass.class)
public @interface ParamValidator {
int value() default 0;
String message() default "value is not found";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
/**
* 参数校验器
* ConstraintValidator泛型第一个传入注解类,第二个是校验的值类型
*/
public class ParamValidatorClass implements ConstraintValidator<ParamValidator,Integer> {
@Autowired
ProductsService productsService;
/**
* 这个方法写自己想要的校验逻辑,比如查询数据校验某值是否存在等
*/
@Override
public boolean isValid(Integer value, ConstraintValidatorContext constraintValidatorContext) {
Product product = productsService.getProduct(value);
if(null != product){
return true;
}
return false;
}
}
//实体
public class Product {
@ParamValidator
private Integer id;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
}
- 最后需要在使用实体的接口入参上加入 @Validated 注解
@RestController
public class ProductController {
@RequestMapping("/product")
public String product(@Validated @RequestBody Product product){
return "product:content";
}
}
- 加入之后,如果查询的值不存在,则报错
- 我们还可传入校验值和被校验值类型不同,如下方,预先定义好的值用String[] 类型传入,但该属性是Integer类型
/**
* 自定义校验注解
*/
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD,ElementType.PARAMETER})
@Constraint(validatedBy = ParamValidatorClass.class)
public @interface ParamValidator {
String[] value() default {};
String message() default "value is not found";
}
/**
* 参数校验器
* ConstraintValidator泛型第一个传入注解类,第二个是校验的属性类型
*/
public class ParamValidatorClass implements ConstraintValidator<ParamValidator,Integer> {
@Autowired
ProductsService productsService;
//存储传入的值
private String[] values;
/**
* 该方法不是必须的,没有写该方法也能默认获取到传入的值,只是不能自定义类型,比如上面的情况
*/
@Override
public void initialize(ParamValidator flagValidator) {
this.values = flagValidator.value();
}
/**
* 这个方法写自己想要的校验逻辑,比如查询数据校验某值是否存在等
*/
@Override
public boolean isValid(Integer value, ConstraintValidatorContext constraintValidatorContext) {
boolean isExist = false;
for(int i=0;i<values.length;i++){
if(values[i].equals(String.valueOf(value))){
isExist = true;
break;
}
}
return isExist;
}
}
//实体
public class Product {
@ParamValidator(value = {"1","2"}, message = "id不存在")
private Integer id;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
}
二、swagger2
- 引入依赖
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.7.0</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.7.0</version>
</dependency>
- 增加配置类
/**
* Swagger2
*/
@Configuration
@EnableSwagger2
public class Swagger2Config {
@Bean
public Docket createRestApi(){
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
//为当前包下controller生成API文档
.apis(RequestHandlerSelectors.basePackage("com.example.project.module"))
.paths(PathSelectors.any())
.build();
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("学习项目")
.description("test")
.version("1.0")
.build();
}
}
- 接口上使用
@Api(value = "IndexController", description = "首页管理")
@RestController
public class IndexController {
@ApiOperation(value = "首页")
@RequestMapping(value = "/index",method = RequestMethod.GET)
public String index(HttpServletRequest request){
return "index:content";
}
}
- 浏览器访问,项目地址加 /swagger-ui.html,比如我这里是 http://localhost:8090/swagger-ui.html
三、缓存
- 启动类上增加打开缓存的注解
@EnableCaching
public class ProjectApplication {
public static void main(String[] args) {
SpringApplication.run(ProjectApplication.class, args);
}
}
- 在需要缓存的接口上注解,假如pom文件没有引入redis,则会使用本地缓存,如若有redis,则会缓存到redis
//这里的key记得用井号带上形参,如果是不用跟参数,即写死,用 key = "'myname'",注意用单引号包住值,如果希望值为null不缓存,则加上 unless="#result == null"
@Cacheable(value="user",key = "#username")
User findByUsername(String username);
//更新时需要删除缓存,这里的形参对象用p0,代表第一个参数。不要用参数名var1,试过会失败
@CacheEvict(value="user",key = "#p0.username")
boolean updateById(User var1);