【发布时间】:2017-01-18 03:02:50
【问题描述】:
我正在尝试在 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>
模型类
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() 始终返回 false .查看屏幕截图。
[![在此处输入图片描述][2]][2]
Agggggggggghhhhhhh - 发现问题的原因
在混合使用 spring-boot-devtools 时,似乎有另一个类加载器参与加载组标记接口的其他实例。这使得上面的“Collection.contains()”每次都失败。
如果我从构建堆栈中取出 spring-boot-devtools,它就可以工作。现在问题变成了:
“如何让验证组与 spring-boot-devtools 混合使用?”
【问题讨论】:
标签: spring spring-mvc spring-boot spring-webflow hibernate-validator