gpt4 book ai didi

java - 使用 CDI (Seam 3) View 范围时的 JSF 转换器范围

转载 作者:行者123 更新时间:2023-11-30 04:25:32 24 4
gpt4 key购买 nike

我目前正在审查代码并发现 CDI 转换器,例如:

@Named
@RequestScoped
public class BankConverter implements Converter, Serializable
{
@EJB
private BankService bankService;

@Override
public Object getAsObject( FacesContext ctx, UIComponent comp, String identifier )
{
if ( identifier == null || identifier.trim().isEmpty() )
{
return null;
}

Bank bank = null;

try
{
bank = this.bankService.findByPrimaryKey( Long.valueOf( identifier ) );
}
catch( Exception e )
{
// omitted
}

return bank;
}

@Override
public String getAsString( FacesContext ctx, UIComponent comp, Object obj )
{
if ( obj == null || ( ( Bank ) obj ).getId() == null )
{
return null;
}

return ( ( Bank ) obj ).getId().toString();
}

}

转换器基本上总是这样使用(注意converter="#{bankConverter}"):

<p:autoComplete id="bank"
value="#{employeeDepotManager.selectedBank}"
var="bnk"
converter="#{bankConverter}"
completeMethod="#{autoCompleter.completeBankSearch}"
itemLabel="#{bnk.name}"
itemValue="#{bnk}"
forceSelection="false"
minQueryLength="3"
global="true"
validator="#{employeeDepotManager.validateBank}"
scrollHeight="200">
<p:ajax event="itemSelect" update="bank-code bank-name" />
<p:column>#{bnk.code}</p:column>
<p:column>#{bnk.name}</p:column>
</p:autoComplete>

我目前正在与一位同事讨论哪种范围最适合转换器...

从 JSF 页面引用的管理器 Bean 中有 95% 是 @ViewScoped,因此我认为转换器最好也是 @ViewScoped(而不是@RequestScoped,据我了解,它会为每个 AJAX 请求重新创建一个转换器实例)。

然后我的同事补充说,转换器可能应该是@Dependent,因为这会自动将转换器放入周围 bean 所在的范围内。我的感觉是,这行不通。然而,我真的不能不同意,因为我的知识几乎到此为止。

那么,当 JSF 引用的几乎所有 bean 都是 @ViewScoped 时,转换器的最佳作用域是什么?

PS:请注意,我们使用 Seam 3 来混合 @Named@ViewScoped

最佳答案

由于大多数转换器实际上是无状态的,因此它们很容易成为 @ApplicationScoped ,在我看来,这是他们最自然的范围。尽管如此,有些转换器实际上并非如此。例如,DateTimeConverter后面<f:convertDateTime>标签确实保存了一些状态。而且,默认实现@FacesConverter使用Application#createConverter(String converterId)在需要时创建一个新的转换器实例,因此每个请求可以多次创建它。

此外,就我而言,自定义转换器在范围方面与引用的支持 bean 没有任何交集,因此它们是否 ViewScoped 并不重要。或不。在选择转换器的范围时,真正重要的是转换器实例中保存的状态范围,正如 BalusC 正确发现的那样。

就您问题中的转换器而言,事实上是无状态的,它可以安全地是 @ApplicationScoped .

关于java - 使用 CDI (Seam 3) View 范围时的 JSF 转换器范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15956072/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com