java SpringBoot中自定义参数校验

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java SpringBoot中自定义参数校验相关的知识,希望对你有一定的参考价值。

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * Author: vincent
 * Date: 2019-01-12 12:35:00
 * Comment: 自定义验证注解,用于验证订单ID的合法性
 */

@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = UserOrderConstraintValidator.class)
@Target(value = { ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER })
public @interface UserOrderValidation {

    String message();

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
}
import com.vincent.security.session.model.UserOrderService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;

import javax.annotation.Resource;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

/**
 * Author: vincent
 * Date: 2019-01-12 12:37:00
 * Comment: 想让自定义验证注解生效,需要实现 ConstraintValidator 接口。
 * 接口的第一个参数是自定义注解,第二个参数是返回值类型。这里因为订单ID是String类型,我们第二个参数定义为 String
 * ConstraintValidator 接口的实现类无需添加 @Component 注解就可以将我们写的 Service Mapper 等注入进来。
 */

@Slf4j
public class UserOrderConstraintValidator implements ConstraintValidator<UserOrderValidation, String> {

    @Resource
    private UserOrderService userOrderService;

    /**
     * 初始化方法,我们可以做一些初始化的工作
     * @param constraintAnnotation
     */
    @Override
    public void initialize(UserOrderValidation constraintAnnotation) {
        log.info("initialize constraint");
    }

    /**
     * 判断 value 是否为空,不为空的情况下去数据库查询订单ID是否邮箱
     * @param value 被注解的字段的值,也就是 userOrderId
     * @param context
     * @return
     */
    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        return StringUtils.isNotEmpty(userOrderId) && userOrderService.exists(userOrderId);
    }
}
import com.vincent.security.session.validator.UserOrderValidation;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * Author: vincent
 * Date: 2019-01-12 23:55:00
 * Comment:
 */

@RestController
@RequestMapping("/user/orders")
public class UserOrderController {

    /**
     * 查看订单详情
     * @param userOrderId 订单ID
     * @return
     */
    @GetMapping("/{id}")
    public ResponseEntity<?> show(@PathVariable("id") @UserOrderValidation String userOrderId) {
        return ResponseEntity.ok().build();
    }

}

以上是关于java SpringBoot中自定义参数校验的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot中自定义properties文件配置参数并带有输入提示

springBoot参数联合校验,自定义分组校验

Springboot通过切面校验参数完整性

SpringBoot中集成参数校验

SpringBoot中集成参数校验

spring boot中自定义验证的参数化junit测试