【问题标题】:How to get validated field name and not arg0 when ConstraintViolationException is thrown抛出 ConstraintViolationException 时如何获取经过验证的字段名称而不是 arg0
【发布时间】:2019-04-08 15:19:32
【问题描述】:

我正在使用 Spring @Validated 注解来验证获取请求路径变量。我确实得到了一个我在@ControllerAdvice 类中处理的ConstraintViolationException,但问题是我想要该字段的名称并且我得到一个arg0 而不是名称本身(myField)

我知道我有类似的问题,但我尝试了以下但没有解决它。

我已经尝试过遍历异常

        for (Iterator<ConstraintViolation<?>> iterator = set.iterator(); iterator.hasNext(); ) {
            ConstraintViolation<?> next =  iterator.next();
            System.out.println(((PathImpl)next.getPropertyPath())
                    .getLeafNode().getName() + "  " +next.getMessage());
        }

以及使用 -parameters 编译(在 pom.xml 中)

                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <forceJavacCompilerUse>true</forceJavacCompilerUse>
                    <compilerArgs>
                        <arg>-parameters</arg>

同时为验证器创建一个配置文件,像这样:

        @Bean
        public Validator validator(){
            final ValidatorFactory validatorFactory = Validation.byDefaultProvider()
                    .configure()
                    .parameterNameProvider(new ReflectionParameterNameProvider())
                    .buildValidatorFactory();
            return validatorFactory.getValidator();
        }

这是我正在验证的方法

public void method(@RequestParam(value = "myField") @Pattern(regexp = "^([A-Za-z0-9]+)$", message = "is not valid") String myField)

但毕竟,我在检查异常对象时仍然得到 arg0。 在 Spring Boot 1.5 中使用 Java 8

【问题讨论】:

  • 在将 Spring Boot 版本从 2.2.13 升级到 2.5.6 后,我遇到了同样的问题。我无法在解析参数名称时配置要运行的测试...

标签: java spring-boot validation


【解决方案1】:

(以防将来有人遇到这个问题,我想在这里分享我的发现)

最后,我注意到我在我的 Application 类中注入了一个 @Validator return Validation.buildDefaultValidatorFactory().getValidator();

在我的例子中,这与 Spring 使用的验证器混淆了

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-01
    • 2017-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-16
    • 2014-09-30
    • 1970-01-01
    相关资源
    最近更新 更多