0

我正在使用 JSF 2 和 Sprig 3,我想从使用 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 作为它的值。

为什么它反转了这两个方法的调用?

4

1 回答 1

1

您根本不应该依赖托管属性设置器方法调用顺序。这在规范中没有定义。

只需在 JSF 完成所有托管属性的设置时挂起即可。这就是@PostConstruct注解的方法。

@PostConstruct
public void init() {
    banque = banqueService.find(banqueId);
}

停止在 setter 中执行业务逻辑,仅当您仍在使用不支持@PostConstruct.


与具体问题无关,您知道新的 JSF2<f:viewParam>吗?它还可以帮助您摆脱 bean 中的这个样板文件,最终只拥有一个Banque属性和一个可重用的Converter.

也可以看看:

于 2013-04-11T13:55:08.213 回答