編集: この問題を再現するために必要な唯一のテクノロジはJSF 2.2
、Spring Boot 1.2.1
+ その組み込みTomcat 8.0.5
サーバーです。この質問にリストされている他のすべては、私が使用している技術に関するコンテキストを提供するためのものです.
更新 #2: BalusC の考えに従って、サンプルのカスタム コンポーネントをベアボーン
Servlet 3.1
+JSF 2.2
アプリケーションに移植しました。そのコードは Github here にあります。この単純なケースでは、ここで説明している問題は発生しません。
@FacesComponent
注釈が機能します。Spring 4.1.2
これは、問題がまたはSpring Boot
それ自体によって引き起こされていることを強く示唆しています。遅くなりましたので、明日以降の調査となります。
@FacesComponent
TL;DR:置換する属性とそのfoundation-components-html.taglib.xml
エントリ<component>
を使用したいfaces-config.xml
現在、XML 定義を使用してプロジェクトで動作するカスタム コンポーネントがあります。私は最近、JSF 2.2が XML を完全に不要にする機能を導入したことを知りました。これを使用したいのですが、純粋に注釈を使用すると、JSF によって無視されます。生のタグが HTML に表示されます。
(つまり<custom:paragraph></custom:paragraph>
)
Github でホストしている私のサンドボックスでこの問題を実証しました。その方法を知りたい場合は、この投稿の最後で説明します。
を削除し、 > のエントリをfoundation-components-html.taglib.xml
コメントアウトして、アプリケーションを実行するだけで問題が発生します。私はそれを「機能している」状態のままにしておいたので、助けたい人は誰でも簡単に、検証可能に正しい出発点を得ることができます。http://localhost:8080にアクセスするだけですfaces-config.xml
<component
使用される技術:
スプリング ブート 1.2.1
Mojarra 2.2.6経由のJSF 2.2
組み込み Tomcat 8.0.5
注:このセットアップは現在機能しますが、taglib および faces-config エントリで実行されていることに注意してください。私の質問は、最新の機能を使用してこれらの依存関係を削除する方法ですJSF 2.2
package foundation.components;
import java.io.IOException;
import javax.faces.component.FacesComponent;
import javax.faces.component.UIComponentBase;
import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;
/**
* The Paragraph Component
* @author Seth Ellison
*/
@FacesComponent(value=UIParagraph.COMPONENT_TYPE, createTag=true, tagName="paragraph", namespace="http://www.blah.com/components/html")
public class UIParagraph extends UIComponentBase {
public static final String COMPONENT_TYPE = "foundation.components.Paragraph";
private String value;
private String styleClass;
@Override
public void encodeBegin(final FacesContext facesContext) throws IOException {
// Encode Implementation Omitted for Brevity.
}
@Override
public String getFamily() {
return "blah.components.family";
}
// Getters/Setters...
}
<facelet-taglib version="2.2"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facelettaglibrary_2_2.xsd">
<namespace>http://www.blah.com/components/html</namespace>
<tag>
<tag-name>paragraph</tag-name>
<component>
<component-type>foundation.components.Paragraph</component-type>
</component>
</tag>
</facelet-taglib>
<faces-config xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_2.xsd"
version="2.2" metadata-complete="false">
<component>
<component-type>foundation.components.Paragraph</component-type>
<component-class>foundation.components.UIParagraph</component-class>
</component>
</faces-config>
XHTML テンプレート(わかりやすくするために省略)
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:jsf="http://xmlns.jcp.org/jsf"
xmlns:custom="http://www.blah.com/components/html">
<head jsf:id="head"></head>
<body jsf:id="body">
<custom:paragraph value="This is a template for a simple marketing or informational website. It includes a large callout called a jumbotron and three supporting pieces of content. Use it as a starting point to create something more unique." />
</body>
</html>
これを実行したい場合、最も簡単な方法は、Spring Tool Suite をダウンロードし、Github からコードを取得し、プロジェクトを右クリックして、Spring Boot アプリとして実行することです。(おそらく) ローカルの MySQL サーバーを実行していないため、JPA 構成が起動すると接続エラーが発生します。これについては心配しないでください。インデックス ページにアクセスしてタグのステータスを確認する必要はまったくありません。私は頻繁にアプリを実行し、DB を起動しても起動しなくても悪影響はありません。最後に、PrettyFaces を Spring Boot でうまく機能させるには、ターゲット/クラスから WEB-INF/ へのシンボリック リンクまたはハード リンクを作成する必要があります。PrettyFaces は、WEB-INF/classes または WEB-INF を参照するようにコーディングされています。注釈をスキャンするときは /lib。
BalusC のスニペット
この関数は、 でマークされ@Configuration
、実装しているクラスに存在します。ServletContextAware
@Bean
public ServletListenerRegistrationBean<ConfigureListener> jsfConfigureListener() {
return new ServletListenerRegistrationBean<ConfigureListener>(
new ConfigureListener());
}