如何使用@Valid批注在Spring 3中验证复杂的模型对象?

问题描述

| 我有一个建模采购订单的模型对象。采购订单具有一些字段(例如ID和日期),以及作为ArrayList的行项目列表。我可以确认父采购订单正常,但是在验证行项目时会感到窒息。 谁能帮助我验证复杂的对象?如果无法自动神奇地验证复杂对象,如何编写依赖于父项中的约束注释然后在子项上进行迭代的自定义验证器?该Validator实例必须能够调用“ 0”和(对于每个行项目)调用“ 1”。我从哪里得到“东西”? 我在
dispatcher-servlet
中指定了
<mvc:annotation-driven />
。我没有使用
@InitBinder
。我在控制器的方法中使用“ 5”注解进行验证
    @RequestMapping(params=\"confirmpurchaSEOrder\")
    public String confirm(
            @modelattribute(\"purchaSEOrder\") @Valid PurchaSEOrder purchaSEOrder,BindingResult result,@RequestParam(\"account\") String accountString,@RequestParam(\"division\") String divisionString,Model model)
    {
        if (result.hasErrors()) {
            return PURCHASE_ORDER_CREATE_VIEW;
        }
域类如下所示:-
public class PurchaSEOrder implements Comparable<PurchaSEOrder> {
    /** Based on GUID */
    private String id;

    /** SOP */
    @NotNull
    private Integer SOP;

    /** Reference from client */
    @NotBlank
    private String purchaSEOrderReference;

    /** PO date */
    @DateTimeFormat(style=\"S-\")
    @NotNull
    private Date date;

    @Valid
    private final Collection<LineItem> lineItems = new ArrayList<LineItem>();
public class LineItem {
    ...Elided

    /** Generated from GUID */
    private String id;

    @NotNull
    @DateTimeFormat(style=\"S-\")
    @Future
    private Date expiry;

    private String softwareversion;

    @NotNull
    @NumberFormat(style = Style.NUMBER)
    @Min(1)
    private Integer licenceCount;
提交具有空有效日期的采购订单时,出现以下异常:
org.springframework.web.util.nestedservletexception: Request processing Failed; nested exception is org.springframework.beans.InvalidPropertyException: Invalid property \'lineItems[]\' of bean class [com.nit.ols.domain.PurchaSEOrder]: Invalid index in property path \'lineItems[]\'; nested exception is java.lang.NumberFormatException: For input string: \"\"
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:730)
    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:634)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    

解决方法

在您的
PurchaseOrder
班级中,尝试将
lineItems
的收藏改为
List
。看来您在此问题中也遇到了相同的问题。     ,就像大卫说的那样,声明类型为
List
lineItems
应该可以解决问题。在Hibernate Validator 4.2.0 CR1(尚未发布的atm中,如果您感兴趣,可以使用最新的快照构建),也可以使用
Collection
,有关更多详细信息,请参见HV-468。