私は現在コードを見直しており、次のような 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% はそうであるため、 (私の知る限り、AJAX 要求ごとにコンバータ インスタンスを再作成する @RequestScoped の代わりに)@ViewScoped
コンバータも同様であることが最善であると考えました。@ViewScoped
次に、私の同僚は、コンバーターはおそらく、周囲の Bean が含まれるスコープに自動的にコンバーターを配置する必要があると付け加えました@Dependent
。しかし、私の知識はほとんどここで終わっているので、私は本当に反対することはできませんでした.
では、JSFから参照されるほとんどすべての Bean が@ViewScoped
.
PS: Seam 3 を使用して混合@Named
し、@ViewScoped