将bean属性绑定到JSF中的元素时出现问题

时间:2011-02-14 18:07:30

标签: jsf binding naming-conventions entity javabeans

我有一个输入(JSF)应绑定到我的bean中的属性。这个属性代表另一个bean并且有一个辅助方法来检查它是否为null(我经常使用这个方法)。

问题是绑定无法获得正确的getter和setter。它不是读取返回bean的方法,而是读取返回布尔值的方法。

属性名称为来宾。方法是:

  • getGuest;
  • setGuest;
  • isGuest(检查guest是否为null)。

JSF正在尝试将对象绑定到 isGuest setGuest ,而不是 getGuest setGuest 。< / p>

我无法将 isGuest 重命名为 guestIsNull 或其他内容,因为这样做不太有意义(请参阅下面的课程)。

最后,我的问题是:如何在不重命名方法的情况下将此属性绑定到对象?有可能吗?

我也接受更好的方法名称的建议(但意思必须相同)。


实体

@Entity
public class Passenger {

    private Employee employee;
    private Guest guest;

    public Passenger() {
    }

    @Transient
    public boolean isEmployee() {
        return null != this.employee;
    }

    @Transient
    public boolean isGuest() {
        return null != this.guest;
    }

    @OneToOne
    public Employee getEmployee() {
        return this.employee;
    }

    public void setEmployee(Employee employee) {
        this.employee = employee;
    }

    @OneToOne
    public Guest getGuest() {
        return this.guest;
    }

    public void setGuest(Guest guest) {
        this.guest = guest;
    }

}

JSF

<h:inputText value="#{passenger.employee}" />
<h:inputText value="#{passenger.guest}" />

3 个答案:

答案 0 :(得分:4)

将方法名称更改为isGuestNull

您遇到的问题是由于EL允许您使用getFoo isFoo作为返回布尔值的getter方法的命名方式。< / p>

答案 1 :(得分:2)

不,那是不可能的。你要重命名它们。

另一种方法是添加一个getter,返回一个覆盖所有情况的枚举。

public enum Type {
    GUEST, EMPLOYEE;
}

public Type getType() {
    return guest != null ? Type.GUEST
         : employee != null ? Type.EMPLOYEE
         : null;
}

<h:something rendered="#{passenger.type == 'GUEST'}">

答案 2 :(得分:1)

如果您创建自定义ELResolver(apidocs),则可以使用任何方法绑定到任何属性。 elresolvers在faces配置中注册,并且在给定Object和定义属性的String的情况下,它们负责确定给定属性的值和类型(并且在需要时更改它)。

您可以轻松编写自己的ELResolver,它只适用于您选择的单一类型,并使用(例如在switch语句中)编写和读取属性所需的特定方法。对于其他类型,它将委托解析解析器链。这很容易做到,比听起来容易得多。

但不要这样做。标准的属性命名模式早于EL多年。它是JavaBeans™标准的一部分 - 这是Javaland中极少数无可争议的标准之一,无处不在 - 从ant脚本到Spring配置文件再到JSF。在一个班级中看到方法isPerson和getPerson实际上让我感到不安,因为它打破了我一直认为理所当然的事情,并且总能依靠。

如果您喜欢DDD并希望将您的方法名称保持纯净,请使用适配器。这很简单,很有趣,而且还提供了一些额外的内容,如果您为所生成的代码获得报酬,那就不值得嘲笑了:

public class MyNotReallyBean {

  public String checkName() { ... }
  public String lookUpLastName() { ... }
  public String carefullyAskAboutAge() { ... }

  public class BeanAdapter {
     public String getName() { return checkName(); }
     public String getLastName() { return lookUpLastName(); }
     public String getAge() { return carefullyAskAboutAge(); }
  }
  private static BeanAdapter beanAdapter = new BeanAdapter();

  private BeanAdapter getBeanAdapter(){ return beanAdapter; }

}