2

私は現在コードを見直しており、次のような 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

4

1 に答える 1

3

コンバーターのほとんどの部分は実際にはステートレスであるため、簡単に変換できます@ApplicationScoped。私の意見では、これが最も自然なスコープです。それにもかかわらず、一部のコンバーターは実際にはそうではありません。たとえば、DateTimeConverterビハインド<f:convertDateTime>タグは何らかの状態を保持します。@FacesConverterさらに、必要なときに新しいコンバーター インスタンスを作成する使用の既定の実装でApplication#createConverter(String converterId)あるため、要求ごとに複数回作成できます。

また、私が知る限り、カスタム コンバーターは、参照されているバッキング Bean とスコープの点で交差していないため、それらが交差しているかどうかは問題ではありませViewScopedん。コンバーターのスコープを選択する際に実際に重要なのは、BalusC によって適切に検出されたように、コンバーター インスタンスに保持されている状態のスコープです。

あなたの質問のコンバーターが実際にステートレスである限り、安全にそうすることができます@ApplicationScoped

于 2013-04-11T18:48:24.090 に答える