我有一个输入(JSF)应绑定到我的bean中的属性。这个属性代表另一个bean并且有一个辅助方法来检查它是否为null(我经常使用这个方法)。
问题是绑定无法获得正确的getter和setter。它不是读取返回bean的方法,而是读取返回布尔值的方法。
属性名称为来宾。方法是:
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}" />
答案 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; }
}