Spring webflow 部分验证不工作

Spring webflow partial validation not working

我正在尝试在 Spring Webflow 2.4 中实现部分验证。

我看过 Spring webflow partial validation 和那里给出的解决方案 - 但它对我不起作用。当我添加组时,验证根本不会启动(但在没有组的情况下工作正常)。

我有如下代码和配置:

流配置

<view-state id="page1" view="apply/page1" model="myModel">
    <binder>
        <binding property="foo" />
    </binder>
    <transition on="next" to="page2" validate="true" validation-hints="'group1'"></transition>
</view-state>

<view-state id="page2" view="apply/page2" model="myModel">
    <binder>
        <binding property="baz" />
    </binder>
    <transition on="next" to="page3" validate="true" validation-hints="'group2'"></transition>
</view-state>

<view-state id="page3" view="apply/page3" model="myModel">
    <on-render>
        <set name="requestScope.foo" value="myModel.foo" />
        <set name="requestScope.baz" value="myModel.baz" />
    </on-render>
</view-state>

型号class

public class MyModel implements Serializable {

    @NotBlank(message = "Bad foo!", groups = {Group1.class})
    private String foo;

    @NotBlank(message = "Bad baz!", groups = {Group2.class})
    private String baz;

    ...//getters and setters

    public interface Group1 {
    }

    public interface Group2 {
    }
}

html 观看次数:

<form th:object="${myModel}" th:action="${flowExecutionUrl}" method="post">

    <div class="error" th:if="${#fields.hasErrors('*')}">
    <span th:each="err : ${#fields.errors('*')}">
        <span th:text="${err}">Input is incorrect</span>
    </span>
    </div>

    <input type="text" th:field="*{foo}"/>

    <button type="submit" name="_eventId_next">Next</button>

</form>

<form th:object="${myModel}" th:action="${flowExecutionUrl}" method="post">

    <div class="error" th:if="${#fields.hasErrors('*')}">
    <span th:each="err : ${#fields.errors('*')}">
        <span th:text="${err}">Input is incorrect</span>
    </span>
    </div>

    <input type="text" th:field="*{baz}"/>

    <button type="submit" name="_eventId_next">Next</button>

</form>

我的意图是在构成向导流程的多个视图中使用单个模型作为支持表单 - 在进行过程中进行部分验证。但是当我介绍实现这一点所需的组时,验证不会在流程中的任何点触发。

如果我在验证提示名称中输入错别字,我会收到错误 - 例如:

<transition on="next" to="page2" 
    validate="true" validation-hints="'group1zzzz'"></transition>

结果

Failed to resolve validation hint [group1zzzz]

所以正在挑选这些团体。但是验证没有发生,我可以在不触发错误的情况下遍历数据输入。

我正在使用 spring-webflow 2.4.2.RELEASE

如果我遗漏了什么,或者这不起作用,有什么想法吗?

更新

我已经深入研究了 org.hibernate.validator.internal.engine.ValidatorImpl 的代码 - 它决定是否需要验证:

private boolean isValidationRequired(ValidationContext<?> validationContext,
        ValueContext<?, ?> valueContext,
        MetaConstraint<?> metaConstraint) {
    if ( validationContext.hasMetaConstraintBeenProcessed(
            valueContext.getCurrentBean(),
            valueContext.getPropertyPath(),
            metaConstraint
    ) ) {
        return false;
    }

    if ( !metaConstraint.getGroupList().contains( valueContext.getCurrentGroup() ) ) {
        return false;
    }
    return isReachable(
            validationContext,
            valueContext.getCurrentBean(),
            valueContext.getPropertyPath(),
            metaConstraint.getElementType()
    );
}

在:

    if ( !metaConstraint.getGroupList().contains( valueContext.getCurrentGroup() ) ) {
        return false;
    }

我在两个集合中看到了我的组实例 - 例如 'MyModel$Group2',但它们似乎不是同一个对象实例,因此 'Collection.contains()' 失败,并且 isValidationRequired() 总是 returns 错误。查看屏幕截图。

[![在此处输入图片描述][2]][2]

Aggggggggggghhhhhhh - 找到问题的原因

混合使用 spring-boot-devtools,似乎还有另一个 classloader 参与加载组标记接口的其他实例。这使得上面的 'Collection.contains()' 每次都失败。

如果我从构建堆栈中取出 spring-boot-devtools,它就可以工作。现在的问题变成了:

"how to get validation groups working with spring-boot-devtools in the mix?"

好吧,毕竟,如果您混合使用 spring-boot-devtools,那么 webflow 会导致类加载器出现一些问题。修复似乎是创建文件:

/WEB-INF/spring-devtools.属性

并将 webflow jar 添加到包含列表:

restart.include.webflow=/spring-webflow-2.4.2.RELEASE.jar

这似乎让 webflow 使用相同的 devetools 类加载器,并且在查找验证提示接口时验证现在可以正常启动。