Verificação em segundo plano

Estrutura de validação em segundo plano BeanValidate

Um. Importe as seguintes dependências no Maven
  <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-validator</artifactId>
        <version>6.0.13.Final</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/javax.validation/validation-api -->
    <dependency>
        <groupId>javax.validation</groupId>
        <artifactId>validation-api</artifactId>
        <version>6.0.13.Final</version>
    </dependency>
2) Adicione a seguinte configuração no contexto da primavera
<bean id="validator"  class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>
    <bean id="beanValidator" class="com.twgfs.commons.utils.BeanValidator">
        <property name="validator" ref="validator" />
    </bean>

Nota: acimaO com.twgfs.commons.utils.BeanValidator atrás da classe interna é o local do pacote de verificação Java

3) Verificação de escrita
package com.twgfs.commons.utils;

import org.springframework.beans.factory.annotation.Autowired;

import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;
import javax.validation.Validator;
import java.util.*;

public class BeanValidator {
    @Autowired
    private static Validator validator;

    public static void setValidator(Validator validator) {
        BeanValidator.validator = validator;
    }

    /**
     *调用 JSR303 的 validate 方法, 验证失败时抛出 ConstraintViolationException.
     */
    private static void validateWithException(Validator validator, Object object, Class<?>... groups) throws ConstraintViolationException {
        Set constraintViolations = validator.validate(object, groups);
        if (!constraintViolations.isEmpty()) {
            throw new ConstraintViolationException(constraintViolations);
        }
    }


     /*辅助方法, 转换 ConstraintViolationException 中的 Set<ConstraintViolations> 中为 List<message>.*/

    private static List<String> extractMessage(ConstraintViolationException e) {
        return extractMessage(e.getConstraintViolations());
    }


      /*辅助方法, 转换 Set<ConstraintViolation> 为 List<message>*/

    private static List<String> extractMessage(Set<? extends ConstraintViolation> constraintViolations) {
        List<String> errorMessages = new ArrayList<>();
        for (ConstraintViolation violation : constraintViolations) {
            errorMessages.add(violation.getMessage());
        }
        return errorMessages;
    }

    //辅助方法, 转换 ConstraintViolationException 中的 Set<ConstraintViolations> 为 Map<property, message>.

    private static Map<String, String> extractPropertyAndMessage(ConstraintViolationException e) {
        return extractPropertyAndMessage(e.getConstraintViolations());
    }

    //辅助方法, 转换 Set<ConstraintViolation> 为 Map<property, message>.

    private static Map<String, String> extractPropertyAndMessage(Set<? extends ConstraintViolation> constraintViolations) {
        Map<String, String> errorMessages = new HashMap<>();
        for (ConstraintViolation violation : constraintViolations) {
            errorMessages.put(violation.getPropertyPath().toString(), violation.getMessage());
        }
        return errorMessages;
    }


    //辅助方法, 转换 ConstraintViolationException 中的 Set<ConstraintViolations> 为 List<propertyPath message>.

    private static List<String> extractPropertyAndMessageAsList(ConstraintViolationException e) {
        return extractPropertyAndMessageAsList(e.getConstraintViolations(), " ");
    }

//辅助方法, 转换 Set<ConstraintViolations> 为 List<propertyPath message>.

    private static List<String> extractPropertyAndMessageAsList(Set<? extends ConstraintViolation> constraintViolations) {
        return extractPropertyAndMessageAsList(constraintViolations, " ");
    }

//辅助方法, 转换 ConstraintViolationException 中的 Set<ConstraintViolations> 为 List<propertyPath + separator + message>.

    private static List<String> extractPropertyAndMessageAsList(ConstraintViolationException e, String separator) {
        return extractPropertyAndMessageAsList(e.getConstraintViolations(), separator);
    }

    //辅助方法, 转换 Set<ConstraintViolation> 为 List<propertyPath + separator + message>.

    private static List<String> extractPropertyAndMessageAsList(Set<? extends ConstraintViolation> constraintViolations, String separator) {
        List<String> errorMessages = new ArrayList<>();
        for (ConstraintViolation violation : constraintViolations) {
            errorMessages.add(violation.getPropertyPath() + separator + violation.getMessage());
        }
        return errorMessages;
    }
    /**
     * 服务端参数有效性验证
     *
     * @param object 验证的实体对象
     * @param groups 验证组
     * @return 验证成功:返回 null;验证失败:返回错误信息
     */
    public static String validator(Object object, Class<?>... groups) {
        try {
            validateWithException(validator, object, groups);
        } catch (ConstraintViolationException ex) {
            List<String> list = extractMessage(ex);
            list.add(0, "注意:");

            // 封装错误消息为字符串
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < list.size(); i++) {
                String exMsg = list.get(i);
                if (i != 0 ){
                    sb.append(String.format("%s. %s", i, exMsg)).append(list.size() > 1 ? "&nbsp;&nbsp;" : "");
                } else {
                    sb.append(exMsg).append(list.size() > 1 ? "&nbsp;&nbsp;" : "");
                }
            }
            return sb.toString();
        }
        return null;
    }
}

Nota: Esta classe é uma classe de captura de exceção, um método é adicionado no final da classe da seguinte maneira

public static String validator(Object object, Class<?>... groups) {
        try {
            validateWithException(validator, object, groups);
        } catch (ConstraintViolationException ex) {
            List<String> list = extractMessage(ex);
            list.add(0, "注意:");

            // 封装错误消息为字符串
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < list.size(); i++) {
                String exMsg = list.get(i);
                if (i != 0 ){
                    sb.append(String.format("%s. %s", i, exMsg)).append(list.size() > 1 ? "&nbsp;&nbsp;" : "");
                } else {
                    sb.append(exMsg).append(list.size() > 1 ? "&nbsp;&nbsp;" : "");
                }
            }
            return sb.toString();//返回自己写的错误提示信息
        }
        return null;
    }

Isso é usado para capturar o erro de verificação e, em seguida, gerar as informações de erro correspondentes.Este método produzirá as informações na anotação de acordo com sua anotação na classe da entidade.

4) Adicione as anotações correspondentes aos campos que precisam ser verificados em segundo plano da classe de entidade A seguir, é minha classe de entidade.
package com.twgfs.domain.entity;
import com.twgfs.commons.utils.RegexpUtils;
import lombok.Data;

import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.Pattern;

@Data
public class User {
  private Integer id;
 @NotEmpty(message = "用户名不能为空")
  private String username;
  @NotEmpty(message = "密码不能为空")
  private String password;
  @NotEmpty(message = "电话号码不能为空")
  @Pattern(regexp = RegexpUtils.PHONE, message = "手机格式不正确")
  private String phone;
  @NotEmpty(message = "邮箱不能为空")
  @Pattern(regexp = RegexpUtils.EMAIL, message = "邮箱格式不正确")
  private String email;
  //数据库ORM会忽略该字段
//  @Transient
//  public int totalPage;

}

1. O @NotEmpty acima é uma verificação não vazia em Validar. Se você adicionar uma mensagem = "XXXXX" na parte principal, ela será verificada quando o valor de entrada estiver vazio. Escreva a classe de verificação para capturar e obter o valor correspondente. Se você ainda precisar executar a verificação regular, poderá adicionar @Pattern (regexp = RegexpUtils.EMAIL, message = "o formato da caixa de correio está incorreto") neste campo , Mas aqui RegexpUtils.EMAIL é um campo na classe regular a ser correspondido, a classe regular correspondente é a seguinte

package com.twgfs.commons.utils;

public class RegexpUtils {
    /**
     * 验证手机号
     */
    public static final String PHONE = "^((13[0-9])|(15[^4,\\D])|(18[0,5-9]))\\d{8}$";

    /**
     * 验证邮箱地址
     */
    public static final String EMAIL = "\\w+(\\.\\w)*@\\w+(\\.\\w{2,3}){1,3}";

    /**
     * 验证手机号
     * @param phone
     * @return
     */
    public static boolean checkPhone(String phone) {
        return phone.matches(PHONE);
    }

    /**
     * 验证邮箱
     * @param email
     * @return
     */
    public static boolean checkEmail(String email) {
        return email.matches(EMAIL);
    }
}

5. Após uma série dessas preparações, ela pode ser usada no projeto, aqui está uma verificação não-vazia do meu módulo de registro, por exemplo.
@RequestMapping("/regist")
    public String regist(User user, Model model){
        String result = BeanValidator.validator(user);
        int flag = loginRegistService.ToRegist(user);
        model.addAttribute("validatemsg",result);
        System.out.println(result+"=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-");
        return "index";
    }
  1. Aqui String result = BeanValidator.validator (user); é aplicar a validação ao projeto
  2. Coloque o usuário da classe de mapeamento de entidade registrado em primeiro plano em BeanValidator.validator (user) para concluir a verificação em segundo plano
  3. A classe de entidade da verificação em segundo plano é verificada de acordo com a anotação.Se uma incompatibilidade for encontrada, um erro será relatado e o erro será capturado pela classe de verificação gravada para ser impressa uma a uma de acordo com o conteúdo da classe na mensagem na classe de entidade O resultado impresso aqui é incompatível
Publicado 19 artigos originais · elogiado 7 · visualizações 6633

Acho que você gosta

Origin blog.csdn.net/William_TWG/article/details/85235932
Recomendado
Clasificación