SpringbootValidation é simples de usar

Este blog é mais básico e completo, mas ainda não entendo a validação personalizada

Suplemento:

   <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
        </dependency>

Compreender

@Validated só pode ser adicionado ao controlador, é inútil adicioná-lo a outras camadas de serviço, não pode ser relatado errado

Se ocorrer um erro, um erro BindException será relatado. BindException tem um método para obter todos os erros, esses erros são da classe ObjectError. Possui o método mais importante: getDefaultMessage para receber a mensagem de erro.

Segunda vez: já sei como personalizar as anotações de verificação:

1. Crie uma classe de anotação personalizada: @interface

Isso é meu

package com.imooc.miaosha.validator;

import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
import static java.lang.annotation.ElementType.CONSTRUCTOR;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.PARAMETER;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import javax.validation.Constraint;
import javax.validation.Payload;

@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = {IsMobileValidator.class })//关联到哪个注解类
public @interface  IsMobile {
	//这些都是注解的参数
	boolean required() default true;//我自己加的
	
	String message() default "手机号码格式错误";//如果校验不通过默认提示的信息

	Class<?>[] groups() default { };//先不管

	Class<? extends Payload>[] payload() default { };//先不管
}

Como escrever? Referência direta ao que já está lá: cliquei na anotação NotNull para ver sua implementação:

/*
* JBoss, Home of Professional Open Source
* Copyright 2009, Red Hat, Inc. and/or its affiliates, and individual contributors
* by the @authors tag. See the copyright.txt in the distribution for a
* full listing of individual contributors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package javax.validation.constraints;

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

import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
import static java.lang.annotation.ElementType.CONSTRUCTOR;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.PARAMETER;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

/**
 * The annotated element must not be {@code null}.
 * Accepts any type.
 *
 * @author Emmanuel Bernard
 */
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = { })
public @interface NotNull {

	String message() default "{javax.validation.constraints.NotNull.message}";

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

	Class<? extends Payload>[] payload() default { };

	/**
	 * Defines several {@link NotNull} annotations on the same element.
	 *
	 * @see javax.validation.constraints.NotNull
	 */
	@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
	@Retention(RUNTIME)
	@Documented
	@interface List {

		NotNull[] value();
	}
}

Na verdade é muito simples

1. Copiei estas linhas de código:
Insira a descrição da imagem aqui
e:
Insira a descrição da imagem aqui
As funções dessas linhas de código foram escritas nos comentários do meu código com mais detalhes.
Insira a descrição da imagem aqui
Insira a descrição da imagem aqui

2. Em seguida, crie a classe validadora: implemente a lógica de julgamento

package com.imooc.miaosha.validator;
import  javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

import org.apache.commons.lang3.StringUtils;

import com.imooc.miaosha.util.ValidatorUtil;

public class IsMobileValidator implements ConstraintValidator<IsMobile, String> {

	private boolean required = false;
	//constraintAnnotation 这个参数就是上面定义的注解,这里给传过来了
	public void initialize(IsMobile constraintAnnotation) {
		//于是我可以拿到这个注解传过来的参数,交给我的成员变量。在下面的isValid方法中可以用到
		required = constraintAnnotation.required();
	}
	//这个方法参数中的value是被注解所作用到的成员属性
	public boolean isValid(String value, ConstraintValidatorContext context) {
		if(required) {
			return ValidatorUtil.isMobile(value);//这是我编写的一个判断工具类,逻辑是如果符合手机格式就返回true
		}else {
			if(StringUtils.isEmpty(value)) {
				return true;
			}else {
				return ValidatorUtil.isMobile(value);
			}
		}
	}

}


Veja abaixo aqui, essa restriçãoAnnotation é a própria anotação.

Insira a descrição da imagem aqui
Insira a descrição da imagem aqui
Para genéricos aqui, IsMobile é o nome da anotação, que é o @IsMobile personalizado. String refere-se a qual tipo de atributo de membro a anotação se aplica.
Insira a descrição da imagem aqui
Aqui está String, então:
Insira a descrição da imagem aqui
aqui está String

Verificação de um único parâmetro: o controlador nem sempre pode ser passado para uma entidade

1. Adicione ao controlador: @Validated (isso não afeta o @Validated adicionado no método)
2. Insira a descrição da imagem aqui
3. Se o erro for gerado aqui, não é BindException, mas: ConstraintViolationException.

Publicado 56 artigos originais · Gosto1 · Visitas1509

Acho que você gosta

Origin blog.csdn.net/weixin_44841849/article/details/105175508
Recomendado
Clasificación