@Column(columnDefinition="BOOLEAN DEFAULT FALSE")
boolean delivered;
此外,必须将已送达(delivered)属性添加到视图中。请用以下代码修改 Order 的视图:@View(extendsView="super.DEFAULT",
members=
"estimatedDeliveryDays, delivered," + // 添加已送达
"invoice { invoice }"
)
...
public class Order extends CommercialDocument {
这个新属性允许用户在订单已送达时,改变订单的送达状态。试试新代码并将一些现有订单标记为已送达。@EntityValidator(
value=com.yourcompany.invoicing.validators.DeliveredToBeInInvoiceValidator.class, // 具有验证逻辑的类
properties= {
//这些属性的值会在执行验证之前从 Order 实体中移到验证器
@PropertyValue(name="year"),
@PropertyValue(name="number"),
@PropertyValue(name="invoice"),
@PropertyValue(name="delivered")
}
)
public class Order extends CommercialDocument {
每次新建或修改 Order 对象时,都会创建 DeliveredToBeInInvoiceValidator 对象。该对象会使用 Order 对象中的属性值,如 year、number、invoice 和 delivered。之后,验证器会执行 validate() 方法。现在我们将编写验证器的代码,首先创建 com.yourcompany.invoicing.validators 包,然后将下一个类放入其中:package com.yourcompany.invoicing.validators; // 在 validators 包
import com.yourcompany.invoicing.model.*;
import org.openxava.util.*;
import org.openxava.validators.*;
import lombok.*;
@Getter @Setter
public class DeliveredToBeInInvoiceValidator
implements IValidator { // 必须实现 IValidator
int year; // 要从 Order 注入的属性
int number;
boolean delivered;
Invoice invoice;
public void validate(Messages errors) // 验证的逻辑
throws Exception
{
if (invoice == null) return;
if (!delivered) {
errors.add( // 在 errors 添加消息,验证将失败
"order_must_be_delivered", // i18n 文件裡的 id
year, number); // 消息的参数
}
}
}
验证的逻辑非常简单:如果已经有发票但该订单未标记为已送达时,我们会添加一条错误的消息,因此验证将失败。您应该在 invoicing/src/main/resources/i18n/invoicing-messages_zh.properties 文件中添加错误消息并将 invoicing-messages_en.properties 文件删除。如下所示:# Messages for the Invoicing application
order_must_be_delivered=订单 {0}/{1} 必须已送达才能添加到发票中
//在这里,以上中文会以unicode(統一碼)显示 < 请勿复制这行
现在您可以尝试将订单添加到一个发票中,您将看到未送达的订单是如何被拒绝的。之后转到 Order 模块,选择发票的订单选项卡,然后点击增加: