1

e コマース サイトで Hibernate Validation をセットアップしようとしています。複数のオブジェクトが割り当てられた注文オブジェクトがあります。顧客がチェックアウトするときに、これらのオブジェクトを個別に検証できるようにしたいと考えています。1 つのフォームで複数のオブジェクトを検証することもあります。

たとえば、配送フォームの送信時に、deliveryCharge と deliveryAddress を検証する必要があります。この検証が失敗した場合、配信フォームは検証エラーのリストとともに返されます。

<form:error />Java 実装を介してオブジェクトを検証できますが、タグを使用してビュー層でこれらを表示しようとすると、何も得られません。

注文モデル

@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 検証ドキュメント

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" />
  ...

どうもありがとう

4

1 に答える 1

1

あなたが求めているのは検証グループだと思います。これらを使用すると、いくつかの手順でさまざまな制約のセットを検証できます。

インターフェイスを定義して必要なグループを宣言し、1 つ以上のグループに制約を割り当てます。

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;
    ...
}

次に、グループ識別子を に渡して、各フォームまたはページに必要なグループを検証しますvalidate()

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

Hibernate Validatorリファレンス ガイドには、このトピックに関する詳細情報があります。

于 2013-09-04T14:43:30.203 に答える