【问题标题】:JSR 303 Different rules on a object based on instancesJSR 303 基于实例的对象的不同规则
【发布时间】:2026-01-30 14:25:02
【问题描述】:

我在 Internet 上查看过,但在 JSR 303 上找不到任何可以解决我的问题的示例。

假设你有以下类(这个设计不能改变!):

有住所和通讯地址的人表示如下:

public class Person {

    private Address domicile = null;
    private Address correspondence = null;


    public Address getDomicile() {
        return domicile;
    }

    public void setDomicile(final Address domicile) {
        this.domicile = domicile;
    }

    public Address getCorrespondence() {
       return correspondence;
    }

    public void setCorrespondence(final Address correspondence) {
      this.correspondence = correspondence;
    }

}

public class Address {

  private String streetName = null;

  public String getStreetName() {
    return streetName;
  }

 public void setStreetName(final String streetName) {
    this.streetName = streetName;
 }

}

如何使用 JSR 303 方法来实现一条规则,即如果街道名称指的是住所地址,则它不能为空?

例如 运行这样的验证我应该得到验证失败(住所地址的街道为空):

Person p = new Person();

Address a = new Address();
a.setStreetName("some street");
p.setCorrespondence(a);

a = new Address();
p.setDomicile(a);

validator.validate(p);

针对 bean Person 调用验证器。 根据这个设计,我认为我应该在 2 Addresses 实例(在 Person 类中)上定义一些注释,并在某些方面将这些信息传递给在 streetName 字段本身(例如 NotBlank)上定义的一些约束,但我没有不知道该怎么做。

我知道 JSR 303 组技术,但它似乎不适合我的特殊要求。

【问题讨论】:

    标签: inheritance bean-validation


    【解决方案1】:

    解决方案是编写自定义验证器,它将应用于 Person 类的级别。

    @ValidateAddress
    public class Person {
    
        private Address domicile = null;
        private Address correspondence = null;
    
        //....
    }
    

    这样的验证器可以访问这两个字段,并且可以验证不为空的。

    【讨论】:

      最近更新 更多