1

Trinidad で Java EE を学習している最中ですが、問題が発生しました。Trinidad 2.x の例では JSPX を使用していますが、古いデモ サイトでは純粋な JSF (XHTML) を使用しています。XHTML で Facelets を使用してテスト ページを作成しようとすると、java.lang.stackoverflow エラーが発生し続けました。構成の問題なのか構文エラーなのかわかりません。

Glassfish V3、MySQL 5.6、JSF 2.1 (Apache MyFace)、Apache Trinidad 2.0 を使用しています。そして、私はこのガイドのほとんどに従います: http://jianmingli.com/wp/?p=3813

スタック トレース残りのログは長すぎるため省略しました

java.lang.StackOverflowError
    at java.net.URLStreamHandler.equals(URLStreamHandler.java:331)
    at java.net.URL.equals(URL.java:862)
    at java.util.concurrent.ConcurrentHashMap.get(ConcurrentHashMap.java:995)
    at com.sun.faces.util.ExpiringConcurrentCache.get(ExpiringConcurrentCache.java:95)

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"      xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    version="2.5">
    <display-name>jsf2.myfaces2.trinidad2.one</display-name>

    <!-- ================= JSF Settings ================= -->
    <!-- Faces Servlet -->
    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <!-- Faces Servlet Mappings -->
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>/faces/*</url-pattern>
    </servlet-mapping>

    <!-- resource loader servlet -->
    <servlet>
        <servlet-name>resources</servlet-name>
        <servlet-class>org.apache.myfaces.trinidad.webapp.ResourceServlet</servlet-class>
    </servlet>

    <!-- Important: You must include this adf mapping even though you are not 
        using ADF features. Without this mapping, JSF navigation will fail! -->
    <servlet-mapping>
        <servlet-name>resources</servlet-name>
        <url-pattern>/adf/*</url-pattern>
    </servlet-mapping>

    <!-- setting the project stage to be DEVELOPMENT -->
    <context-param>
        <param-name>javax.faces.PROJECT_STAGE</param-name>
        <param-value>Development</param-value>
    </context-param>

    <!-- Use client-side state saving. In Trinidad, it is an optimized, token-based 
        mechanism that is almost always a better choice than the standard JSF server-side 
        state saving. -->
    <context-param>
        <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
        <param-value>client</param-value>
        <!--param-value> server</param-value -->
    </context-param>


    <!-- ================= Trinidad Settings ================= -->
    <context-param>
        <param-name>org.apache.myfaces.trinidad.USE_APPLICATION_VIEW_CACHE</param-name>
        <param-value>false</param-value>
    </context-param>

    <context-param>
        <param-name>org.apache.myfaces.trinidad.CHANGE_PERSISTENCE</param-name>
        <param-value>session</param-value>
    </context-param>

    <context-param>
        <param-name>javax.faces.FACELETS_VIEW_MAPPINGS</param-name>
        <param-value></param-value>
    </context-param>

    <context-param>
        <param-name>org.apache.myfaces.trinidad.ALTERNATE_VIEW_HANDLER</param-name>
        <!-- TrinidadFaceletViewHander must be the alternate view handler if SessionChangeManager 
            is used -->
        <param-value>org.apache.myfaces.trinidadinternal.facelets.TrinidadFaceletViewHandler</param-value>
    </context-param>

    <context-param>
        <!--Unfortunately, Facelets provides no hook for plugging the PageResolver 
            into the logic handling "facelets.VIEW_MAPPINGS". You should leave "facelets.VIEW_MAPPINGS" 
            unset and use "org.apache.myfaces.trinidad.FACELETS_VIEW_MAPPINGS" instead. -->
        <param-name>org.apache.myfaces.trinidad.FACELETS_VIEW_MAPPINGS</param-name>
        <param-value>*.xhtml</param-value>
    </context-param>

    <filter>
        <filter-name>trinidad</filter-name>
        <filter-class>org.apache.myfaces.trinidad.webapp.TrinidadFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>trinidad</filter-name>
        <servlet-name>faces</servlet-name>
    </filter-mapping>

</web-app>

index.xhtml

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!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:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:trh="http://myfaces.apache.org/trinidad/html"
    xmlns:tr="http://myfaces.apache.org/trinidad">

<ui:composition template="" >
        <tr:table value="#{userTable.userList}" var="row">
            <tr:column>
                <f:facet name="header">
                    <tr:outputText value="User Name" />
                </f:facet>
                <tr:outputText value="#{row.username}" />
            </tr:column>
            <tr:column>
                <f:facet name="header">
                    <tr:outputText value="Password" />
                </f:facet>
                <tr:outputText value="#{row.password}" />
            </tr:column>
        </tr:table>
</ui:composition>

</html>

index.jspxこれは、「javax.faces.FACELETS_VIEW_MAPPINGS」を *.jspx に構成し、web.xml で Trinidad Facelets 固有の構成を省略した場合に機能します。

<?xml version="1.0" encoding="iso-8859-1"?>
<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.0"
          xmlns:f="http://java.sun.com/jsf/core" 
          xmlns:h="http://java.sun.com/jsf/html"
          xmlns:trh="http://myfaces.apache.org/trinidad/html"
          xmlns:tr="http://myfaces.apache.org/trinidad">
    <f:view>
        <tr:document>
            <tr:table value="#{userTable.userList}" var="row">
                <tr:column>
                    <f:facet name="header">
                        <tr:outputText value="User Name" />
                    </f:facet>
                    <tr:outputText value="#{row.username}" />
                </tr:column>
                <tr:column>
                    <f:facet name="header">
                        <tr:outputText value="Password" />
                    </f:facet>
                    <tr:outputText value="#{row.password}" />
                </tr:column>
            </tr:table>
        </tr:document>
    </f:view>
</jsp:root>
4

2 に答える 2

0

StackOverflowErrorFaceletes でテンプレートへの相対パスを使用すると、Trinidad が原因でエラーが発生するようです。あなたの場合、無関係なtemplate=""属性を削除するとui:component、問題が修正されました。私の場合、実際にはビューでテンプレートを使用していたため、属性を削除できませんでした。代わりに、テンプレート ビューへの絶対パスを使用して問題を回避することができました。

たとえば、次のビュー構造を使用します。

/views/template.xhtml
/view/index.xhtml

index.xhtml相対パスを指定するtemplate.xhtmlと、StackOverflowError次のようになります。

<f:view
  xmlns:f="http://java.sun.com/jsf/core"
  xmlns:ui="http://java.sun.com/jsf/facelets">
    <ui:include src="template.xhtml" />
</f:view>

修正の絶対パスに変更すると、次のことが/views/template.xhtml修正されますStackOverflowError

<f:view
  xmlns:f="http://java.sun.com/jsf/core"
  xmlns:ui="http://java.sun.com/jsf/facelets">
    <ui:include src="/views/template.xhtml" />
</f:view>
于 2021-02-26T14:54:11.350 に答える
0

問題は修正されており、私はui:composition template=""が StackOverFlowError の原因であると考えています。template=""ビットを削除すると、機能しました。さらに、Trinidad 2.0 と Facelet の web.xml の構成に関して、Apache Trinidad のメール アーカイブで次のような記述を見つけました。

Trinidad 2.0 では ALTERNATE_VIEW_HANDLER のエントリは必要ありません。

Trinidad は JSF 2.0 の部分的な状態の保存とまだ互換性がないため、エラーが発生しています。Facelets を使用すると、部分的な状態の保存がデフォルトで有効になるため、明示的に無効にする必要があります。次のコンテキスト パラメータを web.xml に追加します。

<context-param>
<param-name>javax.faces.PARTIAL_STATE_SAVING</param-name>
<param-value>false</param-value>
</context-param>

Apache Trinidad メール投稿へのリンク

于 2012-12-19T22:46:43.037 に答える