1

以前はこれが機能していましたが、いくつか変更したため、再び機能させることはできません。ユーザーが何をクリックしたかに応じて、サービス層を使用してデータベースにアクセスし、コンバーター クラスから正しいオブジェクトを取得しようとしています。スプリングを使用して、サービス プロパティをコンバーターに挿入します。デバッグ中に、プロパティが適切に設定されていることがわかります。しかし、getService を呼び出すと、null になります。

@FacesConverter("PlaceConverter")

@SessionScoped public class PlaceConverter は Converter {

private SearchQueryService searchQueryService;

/**
 * @return the searchQueryService
 */
public SearchQueryService getSearchQueryService() {
    return searchQueryService;
}

/**
 * @param searchQueryService the searchQueryService to set
 */
public void setSearchQueryService(SearchQueryService searchQueryService) {
    this.searchQueryService = searchQueryService;
}

@Override
public Object getAsObject(FacesContext arg0, UIComponent arg1, String submittedValue) {
        try {
            Criteria criteria = new Criteria();
            criteria.setId(Integer.parseInt(submittedValue));
            return getSearchQueryService().findPlaces(criteria).get(0);
        } catch (NumberFormatException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    return null;
}

@Override
public String getAsString(FacesContext arg0, UIComponent arg1, Object value) {
    ((Place) value).setCategory(" (" + ((Place) value).getCategory() + ")");
    return String.valueOf(((Place) value).getPlaceId());
}

}

<bean id="placeConverterBean" class="com.ghghg.converter.PlaceConverter">
    <property name="searchQueryService" ref="searchQueryServiceBean" />
</bean>
4

4 に答える 4

1

コンバーターでの依存性注入は、対象の依存性注入フレームワークによってコンバーターがマネージド Bean として宣言されている場合にのみ機能します。たとえば、JSF の@ManagedBean、または CDI の@Named、または Spring の@Component@FacesConverterコンバーター ID で参照するのではなく、EL スコープでコンバーター インスタンスを完全に削除して参照する必要があります。

したがって、そう

<h:inputXxx converter="#{placeConverter}" />

また

<f:converter binding="#{placeConverter}" />

それ以外の

<h:inputXxx converter="PlaceConverter" />

また

<f:converter converterId="PlaceConverter" />

あなたの具体的な問題は、コンバーター ID で参照していたことを示唆しています (したがって、 経由で@FacesConverter)。このようにして、注入された依存関係なしでコンバーター インスタンスを取得することになります。

以下も参照してください。

コンバーター自体の役割に関しては、HTML コードは 1 つの大きな文字列として表現され、HTTP 要求パラメーター値は文字列としてしか表現できないため、これは必須です。そうしないと、複雑な Java オブジェクトがObject#toString()like soを介して出力さcom.example.Place@hashcodeれ、サーバー側で使用できなくなります。

于 2013-01-27T12:04:58.467 に答える
0

Converterモデル Bean を更新する前に機能します。ユーザーが何らかの入力を行い、この値が最初にサーバーに転送されると、サーバー側のコンポーネントが更新され、次の変換が行われます。ユーザー側からはすべてが文字列であるため (メソッドが呼び出されます) 、Bean に保存された ( method を使用してgetAsObject) 変換された値は、Bean からのビュー値をレンダリングする前に再度変換されます。StringgetAsString

要約Converterすると、メソッドは、ユーザー入力をアプリケーションロジックや Bean フィールドに変更したり、ロジックや Bean フィールドをユーザーフレンドリーな文字列に変換したりするのに最適な場所です。

あなたの質問と問題のために。メソッドSearchQueryService内では利用できないということです。適切な属性をgetAsObject持つ addnotation を追加してみてください。そうすれば、コンテナによって注入されるはずです。@Resourcename

于 2013-01-27T09:35:50.573 に答える
0

jsf 2.0を使用したJava EEでこのように動作するようになりました。コンバーターをバッキング Bean のメンバーにする。CDI を使用してこのメ​​ンバーをインスタンス化しますが、Spring でも同じように機能するはずです。

まず、バッキング Bean:

@ViewScoped
@ManagedBean
public class SomeView implements Serializable {

    private static final long serialVersionUID = 1L;

    @Inject
    private SomeConverter converter;

    public Converter getConverter() {
        return converter;
    }
}

そして、これは jsf xhtml です:

<p:selectOneMenu id="someId" value="#{someView.value}" converter="#{someView.converter}">
    <f:selectItems value="#{someView.values}" var="object" itemLabel="#{object.name}" />
</p:selectOneMenu>
于 2014-11-25T08:15:27.937 に答える
0

私はより良い方法、そしておそらく私が望むものを手に入れるためのより適切な方法を見つけました. コンバーターがどのように機能し、選択されたアイテムの値がマネージド Bean にどのように返されるかについては、完全にはわかりませんでした。メソッドで新しい Place オブジェクトを宣言し、必要な値を設定しました。次に、マネージドBeanに渡されたことがわかりました

于 2013-01-27T01:24:21.760 に答える