3

編集: この問題を再現するために必要な唯一のテクノロジはJSF 2.2Spring 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それ自体によって引き起こされていることを強く示唆しています。遅くなりましたので、明日以降の調査となります。

@FacesComponentTL;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...

}

Taglib 定義

<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());
}
4

1 に答える 1

3

わかりました、問題の原因がわかりました。

今朝Servlet 3.1、コードの動作中のバージョンと壊れたSpring Bootバージョンの違いについて考えてみました。主な違いは、コードの実行方法でした。組み込みサーバーとスタンドアロン。

Spring Bootの組み込み Tomcatサーバーが原因でした。

この回答に従ってサンドボックスを切り替えると、すべてが正常にオンになり、カスタム コンポーネントは純粋に@FacesComponent注釈から外れて機能しました。

これは、組み込みサーバーで起動後にクラスを編成する方法と、Pivo​​tal Tomcat サーバーに個別にデプロイする方法に関係があると考えています。その場合、JSF の注釈スキャナーは単純に注釈を無視するようです。

于 2015-02-18T17:03:57.490 に答える