我使用的是JSF2和sprig3,我想从使用faces-config.xml迁移到注释。
老版本: faces-config.xml:
<managed-bean>
<managed-bean-name>banqueBean</managed-bean-name>
<managed-bean-class>commun.BanqueBean</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
<managed-property>
<property-name>banqueService</property-name>
<value>#{banqueService}</value>
</managed-property>
<managed-property>
<property-name>banqueId</property-name>
<value>#{param.banqueId}</value>
</managed-property>
</managed-bean>
新的:
public class BanqueBean{
private Banque banque;
@ManagedProperty(name = "banqueService", value = "#{banqueService}")
private BanqueService banqueService;
@ManagedProperty(value = "#{param.banqueId}")
private String banqueId;
// setters for banqueService and banqueId
使用以下命令设置banqueId的值:
<f:param value="#{banque.id}" name="banqueId" />
问题是,当使用faces-config.xml时,“系统”在调用参数banqueId的设置器之前调用banqueService的设置器,这样我就可以在setBanqueId方法中使用banqueService。
当使用注解时,它会在banqueService之前调用banqueId的设置器,这样我就会得到null作为它的值。
为什么它颠倒了这两个方法的调用?
发布于 2013-04-11 21:55:08
您根本不应该依赖托管属性setter方法调用顺序。这在规范中没有定义。
只需在JSF完成所有托管属性设置时挂接即可。这是带@PostConstruct
注释的方法。
@PostConstruct
public void init() {
banque = banqueService.find(banqueId);
}
停止在setter中执行业务逻辑,只有当您仍在使用不支持@PostConstruct
的遗留JSF1.1时,才需要这样做。
与无关的具体问题,你知道新的JSF2 <f:viewParam>
吗?它也可以帮助您摆脱bean中的这种样板,最终只有一个Banque
属性和一个可重用的Converter
。
另请参阅:
https://stackoverflow.com/questions/15950401
复制相似问题