1、自定义异常抛出异常格式定义
public class UserNotExistException extends RuntimeException {
private String id;
public UserNotExistException(String id) {
super("user not exist");
this.id = id;
}
}
@ControllerAdvice
public class ControllerExceptionHandler {
//用于捕获抛出的请求自定义异常,捕获后对异常加工并把加工后的值返回
@ExceptionHandler(UserNotExistException.class)
@ResponseBody
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public Map<String, Object> handlerUserNotExistException(UserNotExistException ex) {
return new Hashtable<String, Object>() {{
put("id", ex.getId());
put("message", ex.getMessage());
}};
}
}
2、 @JsonView使用步骤
- (1)使用接口来声名多个视图
- (2)在值对象的get方法上指定视图
- (3)在Controller方法上指定视图
@Setter
public class User {
//用接口来声名视图
public interface UserSimpleView {};
public interface UserDetailView extends UserSimpleView {};
private String id;
@MyConstraint(message = "this is test")
private String username;
@NotBlank(message = "密码不能为空")
//@requestbody映射实体参数的时候,注解表示传入参数不能为空
//@valid @requestbody,添加@valid注解后,
// 会对实体参数进行校验,实体类变量上有注解的都会被校验
private String password;
@Past(message = "生日必须是过去的时间")//生日设定是,过去时间
private Date birthDay;
@JsonView(UserSimpleView.class)
public String getId() {
return id;
}
//在值对象的get方法上指定视图
@JsonView(UserSimpleView.class)
public String getUsername() {
return username;
}
//在值对象的get方法上指定视图
@JsonView(UserDetailView.class)
public String getPassword() {
return password;
}
//前后分离的情况,后台的date类型参数怎么传值:前台传时间戳,后台requestbody会
//自动映射成date时间格式。
public Date getBirthDay() {
return birthDay;
}
}
@GetMapping
//@GetMapping(value = "/user")
//@RequestParam(name = "searchname")searchname是请求参数的名称。
//如果不定义name则接口请求的参数应该名称与username一致
//required = false,则表示不是必填
//defaultValue = "tom" 不传的情况下的参数默认值
//public List<User> query(@RequestParam(name = "searchname", required = false, defaultValue = "tom") String username){
// return null;
//}
//参数里写一个实体,mvc会自动将参数映射到实体
//public List<User> query(UserQueryCondition condition){
// return null;
//}
//pageable size,page,sort(字符串:""age,desc),三个参数自动映射到pageable
//@PageableDefault(page = 2, size = 17,sort = "username,asc") 如果没穿从参数的默认配置
@JsonView(User.UserSimpleView.class) //在Controller方法上指定视图
public List<User> query(UserQueryCondition condition,
@PageableDefault(page = 2, size = 17,sort = "username,asc") Pageable pageable){
return null;
}
3、Hibernate Validator
(1)包提供注解
@NotNull 值不能为空
@Null 值必须为空
@Pattern(regex=) 字符串必须匹配正则表达式
@Size(min=,max=) 集合元素数量必须在min和max之间
@CreditCardNumber(ignoreNonDigitCharacters=) 字符串必须是信用卡号(按美国的标准校验的)
@Email 字符串必须是Email地址
@Length(min=,max=) 检查字符串的长度
@NotBlank 字符串必须有字符
@NotEmpty 字符串不为空,集合有元素
@Range(min=,max=) 数字必须大于等于min,小于等于max
@SafeHtml 字符串是安全的html
@URL 字符串是合法的URL
@AssertFalse 值必须是false
@AssertTrue 值必须是true
@DecimalMax(value=,inclusive=)
值必须小于等于(inclusive=true)/小于(inclusive=false)value属性指定的值。
可以注解在字符串类型的属性上
@DecimalMin(value=,inclusive=)
值必须大于等于(inclusive=true)/大于(inclusive=false)value属性指定的值。
可以注解在字符串类型的属性上
@Digits(integer=,fraction=)
数字格式检查,integer指定整数部分的最大长度,
fraction指定小数部分的最大长度
@Future 值必须是未来的日期
@Past 值必须是过去的日期
@Max(value=) 值必须小于等于value指定的值,不能注解在字符串类型的属性上
@Min(value=) 值必须大于等于value指定的值,不能注解在字符串类型的属性上
(2)自定义
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = MyConstraintValidator.class)
public @interface MyConstraint {
//自定义的话validator则必须要满足这三个属性
String message(); //可以设置默认值
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
/**
* ConstraintValidator<A,T> A表示要作用的注解类,T表示注解作用的字段类型,
* String的话只能用在String上,Object的话就可以作用在任何类型上
*/
public class MyConstraintValidator implements ConstraintValidator<MyConstraint, Object> {
//此处伪代码表示的是,在这个类型,可以使用spring管理的bean
// @Autowired
// private HelloService helloService;
@Override
public void initialize(MyConstraint myConstraint) {
System.out.println("自定义");
}
@Override
public boolean isValid(Object value, ConstraintValidatorContext constraintValidatorContext) {
//自定义的字段校验逻辑
//return false.则会把字段上添加注解里的massage对应的值给抛出来。如果返回true则通过,不抛出
return true;
}
}
@MyConstraint(message = "这是测试")
private String username;
4、controller层常用注解梳理
@GetMapping
//@GetMapping(value = "/user")
//@RequestParam(name = "searchname")searchname是请求参数的名称。
//如果不定义name则接口请求的参数应该名称与username一致
//required = false,则表示不是必填
//defaultValue = "tom" 不传的情况下的参数默认值
//public List<User> query(@RequestParam(name = "searchname", required = false, defaultValue = "tom") String username){
// return null;
//}
//参数里写一个实体,mvc会自动将参数映射到实体
//public List<User> query(UserQueryCondition condition){
// return null;
//}
//pageable size,page,sort(字符串:""age,desc),三个参数自动映射到pageable
//@PageableDefault(page = 2, size = 17,sort = "username,asc") 如果没穿从参数的默认配置
@JsonView(User.UserSimpleView.class) //在Controller方法上指定视图
public List<User> query(UserQueryCondition condition,
@PageableDefault(page = 2, size = 17,sort = "username,asc") Pageable pageable){
return null;
}
/**
*user/{id} {id}必须与@PathVariable String id 配合使用
*/
// @RequestMapping(value = "/user/{id}", method = RequestMethod.GET)
///user/{id:\d+}正则表达式将参数id的格式设置只能是数字
@GetMapping(value = "/{id:\\d+}")
@JsonView(User.UserDetailView.class) //在Controller方法上指定视图
public User getInfo(@PathVariable String id){
User user = new User();
user.setUsername("tom");
return user;
}
//post请求参数,只有通过@RequestBody映射到实体参数上,与GetMapping请求不一样
@PostMapping
//@Valid 注解触发对实体参数校验,实体参数内的变量上有注解的,都会被执行校验
// public User create(@Valid @RequestBody User user){
// user.setId("1");
// return user;
// }
//实体参数前使用@Valid注解,触发对实体类变量注解进行校验,bindingResult
//则是对校验结果做映射展示
public User create(@Valid @RequestBody User user, BindingResult errors){
//如果校验有问题,errors.hasErrors()则为true
if (errors.hasErrors()) {
errors.getAllErrors().stream().forEach(error ->{
// FieldError fieldError = (FieldError) error;
// String message = fieldError.getField()+","+error.getDefaultMessage();
System.out.println(error.getDefaultMessage());
});
}
user.setId("1");
return user;
}
网友评论