1

背景/問題

コンポーネントをjarにパッケージ化することで、多くのアプリケーション間で共有できる再利用可能なJSF複合コンポーネントを作成しようとしています(JSF複合コンポーネントを共有用にデプロイし、JSF 2.0複合コンポーネントをjarにデプロイする同様です)。

EclipseのWebプロジェクトのファセットページでこれらのコンポーネントを参照しようとすると、複合コンポーネントのタグまたは属性がオートコンプリート(コンテンツアシスト)されません。

NetBeansで同じ複合コンポーネントjarを使用すると機能します(オートコンプリートが機能します!)。

クイックサマリー

  • Eclipse(実際にはRational Software Architect 8.0.4.1-Eclipse Heliosに基づく)

  • 動的WebモジュールとJSFファセットが有効になっているWebプロジェクト

  • ビルドパス上の複合コンポーネントjar

  • フェイスレットページで宣言された複合コンポーネントの名前空間(興味深いことに、コンポーネントの名前空間文字列をオートコンプリートします)

  • 標準のJSFタグ(h:、f:、ui:など)とPrimefaces(p:)のみ

  • 複合コンポーネントのオートコンプリートがありません:(

  • コンポーネントをWebプロジェクトに移動し、そこから使用すると、オートコンプリートは機能します(ただし、他のプロジェクトでは再利用できなくなります)。

詳細

複合コンポーネントjar構造

私の複合コンポーネントjarは、コンパイル時に次の構造になります(実際には、Mavenを使用しているため、ソース構造は少し異なります)。

composite-component.jar
|- META-INF/
|   |- beans.xml          (empty - just the beans tag)
|   |- faces-config.xml   (empty - just the faces-config tag/attributes)
|   \- resources
|       \- example
|           \- country.xhtml
\- com
     \- example
           |- Country.java
           |- CountryController.java  (the CDI managed bean)

複合コンポーネントの定義

country.xhtmlの内容は次のとおりです

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:p="http://primefaces.org/ui"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:cc="http://java.sun.com/jsf/composite"
    xmlns:c="http://java.sun.com/jsp/jstl/core">

<!-- INTERFACE -->
<cc:interface>
    <cc:attribute name="value"
        shortDescription="A value expression for the selected value."
        required="true" />
</cc:interface>

<!-- IMPLEMENTATION -->
<cc:implementation>

    <p:autoComplete value="#{cc.attrs.value}"
        completeMethod="#{countryController.complete}" var="country"
        itemLabel="#{country.name}" itemValue="#{country.code}" dropdown="true"
        forceSelection="true">
    </p:autoComplete>

</cc:implementation>
</html>

マネージドBean

私のCDIマネージドBeanには次の内容があります

package example;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import javax.enterprise.context.ApplicationScoped;
import javax.inject.Named;

@ApplicationScoped
@Named
public class CountryController {

    private static final List<Country> COUNTRIES = Arrays.asList(
        new Country("AUS", "Australia"), 
        new Country("FRA", "France"), 
        new Country("USA", "United States of America"));

    public List<Country> complete(String query) {
        List<Country> suggestions = new ArrayList<Country>();
        for (Country c : COUNTRIES) {
            if (c.getName().toLowerCase().contains(query.toLowerCase())) {
                suggestions.add(c);
            }
        }
        return suggestions;
    }
}

複合コンポーネントの消費

NetBeansでJSFプロジェクトを作成し、複合コンポーネント(およびPrimefaces)をビルドパスに追加すると、正しい名前空間をフェイスレットページ(xmlns:x="http://java.sun.com/jsf/composite/example")に追加できます。

コンポーネントとその属性のオートコンプリートを取得し、コンポーネントの定義からのドキュメントも使用します。

同じ複合コンポーネントjarをEclipseWebプロジェクトのビルドパスに追加した場合(JSFファセットが有効)、何も得られません。標準のJSFタグとPrimefacesに対してはオートコンプリートしますが、私のコンポーネントに対してはオートコンプリートしません。

Primefacesがtaglibファイルを使用していることに気づきました-これは私のシナリオに必要なものですか?オートコンプリートを機能させるには、情報を複製する必要があります。

編集:

taselが示唆しているように、(これまでのところ)最善の解決策はJBoss Tools(具体的にはRichFacesプラグイン)をインストールすることです。これにより、jarファイルにパッケージ化された複合コンポーネントのオートコンプリートが可能になります(すべての必須属性の挿入、およびホバードキュメントを使用した他のすべての属性のオートコンプリートを含む)。

CDIを使用している場合は、JBoss Tools CDIプラグインをインストールすることもお勧めします。これにより、CDI管理対象Beanとそのプロパティ/メソッドのオートコンプリートが可能になります。

Eclipse更新サイトのURLは次のとおりです。

ヘリオス:

http://download.jboss.org/jbosstools/updates/stable/helios/

インジゴ:

http://download.jboss.org/jbosstools/updates/stable/indigo/

更新サイトのURLからのインストールで問題が発生し、更新ページからp2リポジトリをダウンロードしてローカルにインストールすることになりましたが、それ以外は、Eclipseでオートコンプリートが機能することを非常に嬉しく思います。

4

1 に答える 1

1

残念ながら、EclipseでのJSFのサポートは、NetBeansほど快適ではありません。私はjBossのRichFacesToolsプラグインを使用することを好みます(これはRichFacesがなくてもコンテナーでも完全に機能します)。あなたはそれを試してみるかもしれません。

JSFのより良いサポートは、私がまだ試していませんが、現在のEclipseリリース「Juno」で利用可能であると考えられています。

于 2012-07-19T10:14:42.003 に答える