日常总结(一)

2019-06-16  本文已影响0人  莫夏_b560

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使用步骤

@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;
    }
上一篇 下一篇

猜你喜欢

热点阅读