【发布时间】:2013-04-04 01:52:55
【问题描述】:
我目前正在审查代码,发现 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
【问题讨论】: