Utilice el validador springmvc en el entorno springboot

Escribir al frente

Este artículo se basa en el entorno de Springboot para realizar pruebas. Si aún no hay un entorno, puede consultar aquí .

1: el sistema viene con verificación

1.1: Definir la clase de validación

public class ValidatorPojo {
    
    
	@NotNull(message = "id不能为空")
	private Long id;

	// 只能是将来的日期
	@Future
	@DateTimeFormat(pattern = "yyy-MM-dd")
	@NotNull
	private Date date;

	@NotNull
	// 最小值0.1
	@DecimalMin(value = "0.1")
	// 最大值10000
	@DecimalMin(value = "10000.00")
	private Double doubleValue = null;

	// 最小值为1
	@Min(value = 1, message = "最小值为1")
	// 最大值为88
	@Max(value = 88, message = "最大值为88")
	// 不能为空
	@NotNull
	private Integer integer;

	// 限定范围
	@Range(min = 1, max = 888, message = "范围为1 至 888")
	private Long range;

	// 邮箱验证
	@Email(message = "邮箱格式错误")
	private String email;

	@Size(min = 20, max = 30, message = "字符串长度要求20到30之间。")
	private String size;

	...getter setter tostring...
}

1.2: Definir el controlador

@RequestMapping(value = "/valid/validate")
@ResponseBody
public Map<String, Object> validate(
        @Valid @RequestBody ValidatorPojo vp,
        Errors errors) {
    
    
    Map<String, Object> errMap = new HashMap<>();
    List<ObjectError> objectErrors = errors.getAllErrors();
    for (ObjectError objectError : objectErrors) {
    
    
        String key = null;
        String msg = null;
        if (objectError instanceof FieldError) {
    
    
            FieldError fieldError = (FieldError) objectError;
            key = fieldError.getField();
        } else {
    
    
            key = objectError.getObjectName();
        }
        // 错误信息
        msg = objectError.getDefaultMessage();
        errMap.put(key, msg);
    }
    return errMap;
}

1.3: Prueba

rizo:

curl \
	-H "Content-Type: application/json" \
	-X POST \
	-d '{"id": null, "date": "2017-08-08", "doubleValue": 999999.09, "integer": 100, "range": 1000, "email": "email", "size": "adv1212"," regexp": "a,b,c,d"}' \
	http://localhost:9875//valid/validate

resultado:

{
    
    
    "date": "需要是一个将来的时间",
    "size": "字符串长度要求20到30之间。",
    "range": "范围为1 至 888",
    "integer": "最大值为88",
    "id": "id不能为空",
    "email": "邮箱格式错误"
}

Solicito una prueba localmente:

xbdeMacBook-Air:~ xb$ curl \
> -H "Content-Type: application/json" \
> -X POST \
> -d '{"id": null, "date": "2017-08-08", "doubleValue": 999999.09, "integer": 100, "range": 1000, "email": "email", "size": "adv1212"," regexp": "a,b,c,d"}' \
> http://localhost:9875//valid/validate
{
    
    "date":"需要是一个将来的时间","size":"字符串长度要求20到30之间。","range":"范围为1 至 888","integer":"最大值为88","id":"id不能为空","email":"邮箱格式错误"}

2: validador personalizado

El validador personalizado solo necesita implementar la org.springframework.validation.Validatorinterfaz, y el código fuente de la interfaz es el siguiente:

public interface Validator {
    
    

	// 验证是否支持验证指定类型
	boolean supports(Class<?> clazz);

	// 执行验证的方法
	// 参数target是待验证的控制器接受参数
	// 参数errors是错误信息,可以在控制器中接受
	void validate(Object target, Errors errors);
}

Pero no se puede usar después de haber sido definido. Debe configurarse a través del mecanismo WebDataBinder. El método específico es definir el método en el controlador y luego usar el @InitBindermétodo de anotación , en el cual el WebDataBinder se pasará como un y luego podemos configurar nuestro parámetro personalizado. Ahora, ¡comencemos!

2.1: Validador personalizado

public class UserValidator implements Validator {
    
    
    /**
     * 判断是否支持验证的方法
     * @param aClass 待验证对象类型
     * @return 是否支持验证
     */
    @Override
    public boolean supports(Class<?> aClass) {
    
    
        return aClass.equals(User.class);
    }

    /**
     * 验证目标对象方法
     * @param target 待验证的目标对象
     * @param errors 错误信息,该对象可以在controller中使用
     */
    @Override
    public void validate(Object target, Errors errors) {
    
    
        if (target == null) {
    
    
            errors.rejectValue("", null, "用户不能为空");
            return;
        }
        // 强转
        User user = (User) target;
        // 用户名非空串
        if (StringUtils.isEmpty(user.getUserName())) {
    
    
            errors.rejectValue("userName", null, "用户名不能为空");
        }
    }
}

2.2: Registrar un validador

/**
* 使用了@InitBinder会在进入控制器方法前调用该方法,
* 并将WebDataBinder作为参数传递过来
* @param binder
*/
@InitBinder
public void initBinder(WebDataBinder binder) {
    
    
   // 绑定我们自定义的验证器
   binder.setValidator(new UserValidator());
}

2.3: Objeto de modelo de datos

public class User {
    
    
    private Long id;
    private String userName;

    ...getter setter toString...
}

2.4: convertidor personalizado

Debido a que la recepción de parámetros en este ejemplo requiere un convertidor personalizado, es necesario definirlo. Si no tiene claro el convertidor, puede pasar aquí .

@Component
public class MyStringToUserConverter implements Converter<String, User> {
    
    

    @Override
    public User convert(String source) {
    
    
        User user = new User();
        if (StringUtils.isEmpty(source)) return user;
        String[] userFieldValArr = StringUtils.commaDelimitedListToStringArray(source);
        int length = userFieldValArr.length;
        if (length >= 1) {
    
    
            user.setId(Long.valueOf(userFieldValArr[0]));
        }
        if (length >= 2) {
    
    
            user.setUserName(userFieldValArr[1]);
        }
        return user;
    }
}

2.5: Prueba

2.5.1: Los datos son normales

Inserte la descripción de la imagen aquí

2.5.2: Error de datos

Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/wang0907/article/details/113034280
Recomendado
Clasificación