2013-08-26 84 views
1

我正在尝试在我的电子商务网站中设置Hibernate验证。 我有一个分配有多个对象的订单对象。当客户通过结帐时,我希望能够单独验证这些对象 - 有时使用一种形式对多个对象进行验证。Hibernate验证的自定义错误消息

例如,在提交交货单时,应验证deliveryCharge和deliveryAddress。如果此验证失败,交付表单将返回一个验证错误列表。

我可以通过java实现验证对象,但是当我尝试在视图层上使用<form:error />标记查看这些对象时,我没有收到任何东西。

订货型号

@Entity 
@Table(name = "bees_address") 
public class Address { 
    @OneToOne 
    @JoinColumn(name = "paymentAddress") 
    private Address payment; 

    @OneToOne 
    @JoinColumn(name = "deliveryAddress") 
    private Address payment; 

    @Column(name = "deliveryCharge") 
    private Integer deliveryCharge; 
    ... 

地址模式

@Entity 
@Table(name = "bees_address") 
public class Address { 
    @Size(min=2, max=150) 
    @Column(name = "line1", length = 150) 
    private String line1; 
    ... 

控制器

public String updateDelivery(HttpServletRequest request, @ModelAttribute("basket") Order basketUpdate) { 

    Address deliveryAddress = basketUpdate.getDeliveryAddress(); 

    if (!Validate.isValid(request, deliveryAddress)) { 
    logger.info("Delivery address does not validate"); 
    return "redirect:/checkout/delivery";   
    } else { 
    /* do stuff here */ 
    } 

    return "redirect:/checkout/payment"; 
} 

验证 Hibernate Validation Docs

public static Boolean isValid(HttpServletRequest request, Address address) { 
    ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); 
    Validator validator = factory.getValidator(); 

    Set<ConstraintViolation<Address>> constraintViolations = validator.validate(address); 
    request.getSession().setAttribute("formErrors", constraintViolations); 

    return constraintViolations.size() < 1; 
} 

JSP结构

<form:form action="${url}" method="post" modelAttribute="basket" 
    Charge: <form:input path="deliveryCharge" /> 
    Address: <form:input path="deliveryAddress.line1" /> 
      <form:error path="deliveryAddress.line1" /> 
    ... 

非常感谢

+0

你能重新表达你的问题吗?真的很难说现在你在问什么? – Hardy

回答

1

我觉得你以后有什么是确认团组。它们允许您在几个步骤中验证不同的约束集。

通过定义的接口声明所需的组并分配约束到一个或多个基团:通过将组标识符来validate()

public interface DeliveryChecks{} 
public interface PaymentChecks{} 

public class Address { 

    @NotNull(groups = PaymentChecks.class) 
    private Address payment; 

    @Min(value=5, groups = DeliveryChecks.class) 
    private Integer deliveryCharge; 
    ... 
} 

然后验证所需要的基团(一个或多个)为每个表单或页面:

Set<ConstraintViolation<Address>> constraintViolations = 
    validator.validate(address, PaymentChecks.class); 

Hibernate Validator reference guide有关于此主题的更多信息。

+0

这并不完全是我以前的样子,但这是一种将它们粘在一起的相当不错的方式(我以前是单独验证,然后将错误捆绑在一起)。这可以用任何方式与http://www.mkyong.com/spring-mvc/spring-3-mvc-and-jsr303-valid-example/结合?干杯 – Toby

相关问题