ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Spring Validator验证器与Web Formatter

2022-07-25 22:34:43  阅读:161  来源: 互联网

标签:Web return 验证 Spring class Validator annotation public


Spring Validator验证器与Web Formatter

Validator

Spring提供了Validator接口和注解帮助对业务数据进行验证,这些方法可以不仅在Web端使用

使用 Spring 的 Validator 接口进行验证

Validator 接口通过使用 Error 对象来工作,在进行验证时,可以向 Error 对象报告验证失败

该接口有两个方法,分别为:

  • supports(Class):这个验证器是否可以验证该类的对象
  • validate(Object, org.springframework.validation.Errors):验证给定的对象

可以使用ValidationUtils 工具类帮助进行验证:

public class PersonValidator implements Validator {

    /**
     * This Validator validates only Person instances
     */
    public boolean supports(Class clazz) {
        return Person.class.equals(clazz);
    }

    public void validate(Object obj, Errors e) {
        ValidationUtils.rejectIfEmpty(e, "name", "name.empty");
        Person p = (Person) obj;
        if (p.getAge() < 0) {
            e.rejectValue("age", "negativevalue");
        } else if (p.getAge() > 110) {
            e.rejectValue("age", "too.darn.old");
        }
    }
}

Validator 也可以嵌套,实现逻辑的重用

自定义约束

自定义验证约束由两部分组成:

  • 一个是@Constraint,作为元注解
  • 实现ConstraintValidator 接口,定义具体的验证行为

自定义一个注解:

@Target({ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy=MyConstraintValidator.class)
public @interface MyConstraint {
}

实现ConstraintValidator接口:

import javax.validation.ConstraintValidator;

public class MyConstraintValidator implements ConstraintValidator {

    @Autowired;
    private Foo aDependency;

    // ...
}

Spring实现了:LocalValidatorFactoryBean,该类实现了java的验证器以及Spring的验证器

Formatter

core.Convert下定义了类型转换的逻辑,而在web端也有对接口数据编解转换的需求,Spring提供了Formatter接口便于解决这些问题。

接口定义:

package org.springframework.format;

public interface Formatter<T> extends Printer<T>, Parser<T> {
}

该接口扩展了Printer和Parser,具体来说是print和parse这对方法

我们可以自定义Formatter注解,实现 AnnotationFormatterFactory即可:

package org.springframework.format;

public interface AnnotationFormatterFactory<A extends Annotation> {

    Set<Class<?>> getFieldTypes();

    Printer<?> getPrinter(A annotation, Class<?> fieldType);

    Parser<?> getParser(A annotation, Class<?> fieldType);
}

方法解析:

  • getFieldTypes返回支持的类类型
  • getPrinter返回输出Printer对象
  • getParser返回解析Parser对象

一个示例:

public final class NumberFormatAnnotationFormatterFactory
        implements AnnotationFormatterFactory<NumberFormat> {

    public Set<Class<?>> getFieldTypes() {
        return new HashSet<Class<?>>(asList(new Class<?>[] {
            Short.class, Integer.class, Long.class, Float.class,
            Double.class, BigDecimal.class, BigInteger.class }));
    }

    public Printer<Number> getPrinter(NumberFormat annotation, Class<?> fieldType) {
        return configureFormatterFrom(annotation, fieldType);
    }

    public Parser<Number> getParser(NumberFormat annotation, Class<?> fieldType) {
        return configureFormatterFrom(annotation, fieldType);
    }

    private Formatter<Number> configureFormatterFrom(NumberFormat annotation, Class<?> fieldType) {
        if (!annotation.pattern().isEmpty()) {
            return new NumberStyleFormatter(annotation.pattern());
        } else {
            Style style = annotation.style();
            if (style == Style.PERCENT) {
                return new PercentStyleFormatter();
            } else if (style == Style.CURRENCY) {
                return new CurrencyStyleFormatter();
            } else {
                return new NumberStyleFormatter();
            }
        }
    }
}

标签:Web,return,验证,Spring,class,Validator,annotation,public
来源: https://www.cnblogs.com/kmchen/p/16519086.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有