java - 获取bean验证失败的字段名

标签 java bean-validation

因此,我正在执行 JSR-303 bean 验证的类有两个字段,每个字段都应用了相同的模式约束:

@Column(name="test_suite_revision")
@XmlElement(name="test_suite_revision")
@NotNull
@Pattern(regexp = "\\d\\d-\\d\\d-\\d\\d\\d\\d", message = "value must be of the form xx-xx-xxxx")
private String revisionTestSuite;

@Column(name="test_revision")
@XmlElement(name="test_revision")
@NotNull
@Pattern(regexp = "\\d\\d-\\d\\d-\\d\\d\\d\\d", message = "value must be of the form xx-xx-xxxx")
private String revisionTest;

重要 - 该类不是经典 Spring MVC Web 应用程序中的表单支持类,而是位于 Web 服务基础上的实体类。因此验证是在服务中进行的。

现在使用 Web 服务的 Web 客户端是一个 Spring MVC,并且有一个表单支持 bean,它与带有放置错误消息的位置的 jsp 相关联。

因此,假设用户在两个字段之一中输入了格式不正确的字符串。我可以用这个相当标准的代码片段捕获它<​​/p>

    Set<ConstraintViolation<TestCase>> violations = validator.validate( permit);
    if( !violations.isEmpty()) {
        logger.debug( "basic validation FAILED with " + violations.size() + " errors");
        Iterator<ConstraintViolation<TestCase>> iter = violations.iterator();
        while( iter.hasNext()) {
            ConstraintViolation<TestCase> cv = iter.next();
            logger.debug( "invalidValue:" + cv.getInvalidValue());
            logger.debug( "message:" + cv.getMessage());
            ConstraintDescriptor<?> cd = cv.getConstraintDescriptor();
            Map<String, Object> mapp = cd.getAttributes();
            for( String keey : mapp.keySet()) {
                logger.debug("mapp key:" + keey + ":" + mapp.get(keey));
            }

写出

basic validation FAILED with 1 errors
invalidValue:050607
message:value must be of the form xx-xx-xxxx
mapp key:message:value must be of the form xx-xx-xxxx
mapp key:payload:[Ljava.lang.Class;@1367702
mapp key:flags:[Ljavax.validation.constraints.Pattern$Flag;@bf5210
mapp key:groups:[Ljava.lang.Class;@a49be5
mapp key:regexp:\d\d-\d\d-\d\d\d\d

问题在于:如何找出哪个字段验证失败?我似乎找不到提取字段名称“revisionTest”或“revisionTestSuite”的方法 来自 ConstraintViolation 对象或 ConstraintDescriptor 对象。

javax.validation-api 版本 1.1.0.Final 中新提供的 getValidationAppliesTo() 方法似乎很有前途,但到目前为止,该方法在运行时会抛出 AbstractMethodError 。呃。

TIA,

仍在学习的史蒂夫

最佳答案

参见ConstraintViolation#getPropertyPath方法:

/**
 * @return the property path to the value from {@code rootBean}
 */
Path getPropertyPath();

Path.Node#getName 将为您提供属性名称。对于嵌套 bean 中的字段名称,您已经走过了这条路。

关于java - 获取bean验证失败的字段名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33731709/

相关文章:

java - 日历中的月数不是常数?

使用 Hibernate API 的 Java 字符串日期验证

java - 来自 javax.validation.constraints 的注释与自定义 ConstraintValidator 相结合

java - JSR 303 Bean 验证 + Javascript 客户端验证

java - JPA 验证策略

java - 无法检测到测试类 : class path resource does not exist 的默认资源位置

java - 使用 java.lang.Object 字段的 JAXB 编码对象

java - Java 8 默认方法如何帮助 lambda?

java - 有关检查样式的提示

jakarta-ee - javax.servlet.ServletException:HV000030:找不到以下类型的验证器:java.lang.Integer