Spring Webflow:每个流程都可以手动设置验证器吗?

时间:2015-04-23 14:29:49

标签: spring-webflow spring-webflow-2

我的应用程序中配置了多个流程:

<flow:flow-registry id="flowRegistry" flow-builder-services="flowBuilderServices" >
    <flow:flow-location id="reservation1"   path="/WEB-INF/flows/flow1.xml" />
    <flow:flow-location id="reservation2"   path="/WEB-INF/flows/flow2.xml" />
</flow:flow-registry>

这两个流为其model属性使用单独的类,称为Flow1DTO.java和Flow2DTO.java。但是,它们使用一组通用的JSP / Tiles作为它们的实际接口。

<form:form modelAttribute="reservationForm">
   <!-- etc -->
</form:form>

是否可以为每个流定义一个单独的Validator类?

2 个答案:

答案 0 :(得分:0)

您可以为每个特定的视图状态ID为同一个Model类定义多个验证方法。每个自定义验证方法映射到特定Webflow视图状态ID的位置。

您的模型的验证器类名称需要使用名称“$ {model} Validator”定义(并且具有@Component注释),并且每个验证方法名称都需要命名为“validate $ {state}([ ModelClassType] model,ValidationContext context)“

因此,假设您有一个名为“Reservation.java”的模型类和2个使用此模型的不同流定义,并且每个流定义都具有视图状态定义

<!-- defined in your first flow file -->
<view-state id="ReservationSameDayViewState" view="sumting" model="reservationForm">
</view-state>
....
<!-- defined in your 2nd flow file -->
<view-state id="ReservationFutureViewState" view="sumting" model="reservationForm">
</view-state>

Reservation模型的验证器类是这样的:

@Component
public class ReservationValidator {
    public void validateReservationSameDayViewState(Reservation reservation, ValidationContext context) {
         // perform custom validation for first flow
    }

    public void validateReservationFutureViewState(Reservation reservation, ValidationContext context) {
         // perform custom validation for 2nd flow
    }
}

http://docs.spring.io/autorepo/docs/webflow/2.4.x/reference/html/views.html#view-validation-programmatic-validator

此外,使用整数增量定义流是不好的做法。将您的流注册表定义更改为如下所示。这样,您每次创建新流时都不必手动向其添加流。

<flow:flow-registry id="flowRegistry" flow-builder-services="flowBuilderServices" base-path="/WEB-INF/flows">
    <flow-location-pattern value="/**/*-flow.xml" />
</flow:flow-registry>

注意:流名称以“-flow.xml”结尾。这是定义流注册表和流名称的非官方标准方法。

答案 1 :(得分:0)

我找到了一个解决方案,它允许我使用表单验证器的单个实现来验证多个表单。

代码看起来像这样:

public void validateMethodName(Flow1DTO dto, ValidationContext context) {
    valMethodName(dto, context);
}

public void validateMethodName(Flow2DTO dto, ValidationContext context) {
    valMethodName(dto, context);
}

private void valMethodName(CommonFlowDTO dto, ValidationContext context) {
    // do stuff
}

将验证方法放在DTO类本身不是一种选择。验证需要调用数据库,这会将DTO对象耦合到业务逻辑,并使DTO的创建更加复杂。

我发现验证方法无法指定接口,导致每个具体DTO类的重复方法。