常见注解,json view,valid注解和bindingresult使用,开发自定义注解
编辑工具favorites 使用
restful 常见注解
@requestParam 请求参数
@PageableDefault 指定分页参数默认值
@PathVarible 映射url片段到java方法的参数
@RequestBody 映射请求体到java方法的参数
@JsonView
1.使用接口来声明多个视图
2.在值对象的get方法上指定视图
3.在Controller方法上指定视图
json view使用
第1,2步,这里使用lombok,具体可以百度
@Data
@ToString
public class User {
public interface UserSimpleView {
}
public interface UserDetailView extends UserSimpleView {
}
@JsonView(UserSimpleView.class)
private int id;
@MyConstraint(message = "这是一个测试")
@JsonView(UserSimpleView.class)
private String username;
@NotBlank
@JsonView(UserDetailView.class)
private String password;
@Past(message = "生日必须是过去")
@JsonView(UserSimpleView.class)
private Date birthday;
}
第3步
@GetMapping(value = "/{id}")
@JsonView(User.UserDetailView.class)
public User getInfo(@PathVariable String id) {
User user = new User();
user.setUsername("tom");
return user;
}
jsonpath
$— json数据的根元素
https://github.com/json-path/JsonPath
日期类型参数的处理
建议前后台用时间戳来传输
@Valid注解 约束
@notblank 不为空
BindingResult验证请求参数的合法性并处理校验结果
@valid 一般情况下与bindingresult 同时使用,单@valid获取到检验不能通过时,
会将error 给bindingresult(比如下面代码
public User create(@Valid @RequestBody User user, BindingResult error) {
if (error.hasErrors()) {
error.getAllErrors().stream().forEach(err -> {
System.out.println(err.getDefaultMessage());
});
}
}
hibernate validator
注解 | 意义 |
---|---|
@Notnull | 值不能为空 |
@Null | 值必须为空 |
@Pattern(regex=) | 字符串必须匹配正则表达式 |
@Size(min=,max=) | 集合的元素必须在min和max之间 |
字符串必须是Email地址 | |
@Length(min=,max=) | 检查字符串的长度 |
@NotBlank | 字符串必须有字符 |
@NotEmpty | 字符串不为null,集合有元素 |
@Range(min=,max=) | 数字必须大于min 小于max |
@SafeHtml | 字符串是安全的Html |
@URL | 字符串是合法的URl |
@AssertFalse | 值必须是false |
@AssertTrue | 值必须是true |
@DecimalMax(value=, inclusive=false) | 值必须小value |
@Min(value) | 值必须大于value, 只能注解到数值上啊 |
@Future | 值必须是未来的日期 |
@Past | 值必须是以前的日期 |
开发自定义valid注解
创建@inteface注解
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;
/**
* @author mjp
* @ClassName : MyConstraint
* @Date: 2019/5/30 13:56
* @Description: 自定义valid注解
* @Copyright 2019 www.videasoft.com Inc. All rights reserved.
* 注意:本内容仅限于苏州微缔软件股份有限公司内部传阅,禁止外泄以及用于其他的商业目的
* @Version 1.0
*/
// 注解位置
@Target({ElementType.METHOD,ElementType.FIELD})
// 运行时注解
@Retention(RetentionPolicy.RUNTIME)
// 当前注解用什么类来验证
@Constraint(validatedBy = MyConstraintValidator.class)
public @interface MyConstraint {
/**
* 这三个属性必须有
* @return
*/
String message();
Class<?>[] groups() default { };
Class<? extends Payload>[] payload() default { };
}
编写注解验证类
import com.imooc.validator.service.HelloService;
import org.springframework.beans.factory.annotation.Autowired;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
/**
* @author mjp
* 此处不需要添加@Component 等spring注解,就可以直接获取到spring的bean对象
* 这是因为
* Sprin容器,发现这个类实现了
* ConstraintValidator 这个借口会自动注入
*
*/
public class MyConstraintValidator implements ConstraintValidator<MyConstraint,Object> {
@Autowired
private HelloService helloService;
/**
* 初始化
* @param constraintAnnotation
*/
@Override
public void initialize(MyConstraint constraintAnnotation) {
System.out.println("MyConstraintValidator init");
}
/**
* 检验逻辑
* @param value 校验值
* @param context 校验上下文
* @return
*/
@Override
public boolean isValid(Object value, ConstraintValidatorContext context) {
helloService.greeting("123 jj");
System.out.println(value);
return false;
}
}
使用
@MyConstraint(message = "这是一个测试")
@JsonView(UserSimpleView.class)
private String username;