0
点赞
收藏
分享

微信扫一扫

spring参数校验之validation的自定义注解

穆风1818 2022-03-11 阅读 77
spring后端

validation的自定义注解

接上一篇

@Data
public class ValidaUser {
	
	private final String reg = "^((http|https)://)[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|]";
	    
	    
	 # @CheckUrl为我的自定义注解,详见如下
	@CheckUrl(regexp = reg, message = "contractCallBackUrl地址非法")
    private String contractCallBackUrl;

    @CheckUrl(regexp = reg, notEmpty = false, message = "archivesCallBackUrl地址非法地址非法地址非法")
    private String archivesCallBackUrl;

    public ValidaUser(String contractCallBackUrl, String archivesCallBackUrl) {
        this.contractCallBackUrl = contractCallBackUrl;
        this.archivesCallBackUrl = archivesCallBackUrl;
    }
}
@RestController
@RequestMapping("/valida")
public class ValidaController {
	
	@RequestMapping("/validaParam")
    public String validaParam(@Validated @RequestBody ValidaUser user, BindingResult result) throws Exception{

        if (result.hasFieldErrors()) {
            String errorInfo = ValidationUtils.operateBindingResult(result);
            System.out.println(errorInfo);
//            return errorInfo;
        }
		System.out.println("请求参数::"+JSONObject.toJSONString(user));
        return "success";
    }
}

@RunWith(SpringRunner.class)
@SpringBootTest
@WebAppConfiguration
@AutoConfigureMockMvc
public class ValidaControllerTest {

	 @Autowired
    private MockMvc mockMvc;

    @Test
    public void validaParam(){
        List<String> list = Arrays.asList("1212", "1212", "1212", "1212", "1212", "1212", "1212", "1212", "1212", "1212", "1212", "1212");
         ValidaUser validaUser = new ValidaUser("","");
        try {
            mockMvc.perform(post("/valida/validaParam")//请求地址使用post方式请求
                            .content(JSON.toJSONString(validaUser))
                            .contentType(MediaType.APPLICATION_JSON_VALUE))//媒体类型为JSON
//                    .andExpect(status().isOk());//返回状态为200
                    .andDo(print());// 打印请求和响应的详情

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

1、单元测试类中的参数都设置为 “” 空字符串
在这里插入图片描述
问题:两个参数都为空使用的是同一个参数校验注解为什么只提示一个

原因如下:在编写自定义注解时,甚至了一个开关,false为空字符 “” 时不校验, true时则校验
在这里插入图片描述

自定义注解如下

@Constraint(validatedBy = CheckUrlValidator.class)

CheckUrlValidator 为注解的校验类

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;

/**
 * @author zsg
 */
@Target({ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = CheckUrlValidator.class)
public @interface CheckUrl {

    String regexp();

    boolean notEmpty() default true;  # 空字符是否校验 ,默认校验

    String message() default "路径地址错误";

	# 以下两个为必须  校验默认分组
    Class<?>[] groups() default {};
	
    Class<? extends Payload>[] payload() default {};
}

实现接口:ConstraintValidator<A extends Annotation, T>


import org.springframework.util.StringUtils;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.regex.Pattern;

/**
 * FileName: com.example.demo.utils.CheckUrlValidator
 *
 * @author: zsg
 */

public class CheckUrlValidator implements ConstraintValidator<CheckUrl, String> {

    private String regexp;

    private boolean notEmpty;

    @Override
    public void initialize(CheckUrl constraintAnnotation) {
        this.regexp = constraintAnnotation.regexp();
        this.notEmpty = constraintAnnotation.notEmpty();
    }

    @Override
    public boolean isValid(String url, ConstraintValidatorContext constraintValidatorContext) {
        if(StringUtils.isEmpty(url)){
            return !notEmpty;
        }
        Pattern pattern = Pattern.compile(regexp);
        return pattern.matcher(url).matches();
    }
}

1、正常参数请求如下

在这里插入图片描述

举报

相关推荐

0 条评论