我的应用程序中配置了多个流程:
<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类?
答案 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
}
}
此外,使用整数增量定义流是不好的做法。将您的流注册表定义更改为如下所示。这样,您每次创建新流时都不必手动向其添加流。
<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类的重复方法。