背景/問題
コンポーネントを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でオートコンプリートが機能することを非常に嬉しく思います。