2012-11-12 8 views
6

私はWeblogic 10.3.3をインストールしており、再帰JSPタグに問題があるようです。インターネット上で同じ問題(herehere)を経験している他の人々が見つかりましたが、解決策はありませんでした。 Weblogic 12で修正されたか、9で作業していた人もいますが、確認できません。Weblogicタグと再帰JSPタグ

アプリケーションは、Spring/Spring Roo/Apache Tiles/jspxを使用して構築されています。

<jsp:root xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:jsp="http://java.sun.com/JSP/Page" xmlns:coursedataimport="urn:jsptagdir:/WEB-INF/tags/coursedataimport" version="2.0"> 
    <jsp:output omit-xml-declaration="yes" /> 

    <jsp:directive.attribute name="programme" type="package.Programme" required="true" rtexprvalue="true" /> 

    <c:out value="${programme.name}" /> 

    <ul> 
     <c:forEach var="p" items="${programme.programmes}"> 
      <li><coursedataimport:programme programme="${p}" /></li> 
     </c:forEach> 
    </ul> 

</jsp:root> 

これは動作しません。そして、私はこのようなtagxを持って

public class Programme { 

private String name; 
private final List<Programme> programmes = new ArrayList<Programme>(); 

...(getter/setter)... 
} 

:表示されているモデルクラスのようなものです。ページを要求すると、アプリケーションコンテナがクラッシュしているように見えます(おそらく、スタックのオーバーフローが発生しますが、ログにそのスタックが見つかりません)。アプリケーションコンテキストがリロードされます。 Tomcat 7ではうまく動作します。

示す例外は、このようなものですが、(それはエラーページについて語るので)私はそれが関連していますかはわからない:

[483389576 [アプリ@のServletContext:アプリ耳-0モジュール:appmodule path:/ CONTEXTROOT spec-version:2.5]]エラーページを処理中に問題が発生しました。 org.springframework.web.util.NestedServletException:要求の処理に失敗しました。ネストされた例外はjava.lang.ClassCastExceptionです:org.apache.tiles.ArrayStack at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:894)at org.springframework.web.servlet.FrameworkServlet.doGet( で javax.servlet.http.HttpServlet.service(HttpServlet.java:821)で javax.servlet.http.HttpServlet.service(HttpServlet.java:707)でFrameworkServlet.java:779)...

誰もが以前にこれらの問題を経験したことがありますか、誰かが修正を認識していますか?これをデバッグする方法や再帰タグを回避する方法についてのヒント(ツリーを表示したいので、少し難題です)。前もって感謝します。

+0

プログラムタグを再帰的に呼び出そうとしていますか?私も同様の問題があります。再帰的にタグファイルを呼び出す際、Tomcat 6では動作しますが、Weblogic 11では動作しません。 –

+0

はい、それが問題です。 Tomcatはうまく動作しますが、Weblogicはピタです。私たちは、再帰タグを使用しないようにコードを書き直すこととは別に、これを解決する方法を見つけたことはありませんでした。 – MikeN

答えて

0

タグレンダリングエンジンの修正方法がわかりません。しかし、私の答えは、回帰をなくす方法を回避することです。 java.util.Stackを使用することで再帰を減らすことができます。あなたはその何かを置くことができるJSPでその後

class FormattedProgramme{ 
    Programme programme; 
    int indent; 
} 
... 
java.util.List<FormattedProgramme> result = new ArrayList<FormattedProgramme>(); 
java.util.Stack<FormattedProgramme> programmeStack = 
    new java.util.Stack<FormattedProgramme>(); 
//you should know how to resolve root bean 'programme' 
programmeStack.push(new FormattedProgramme(programme, 0/*indent=0*/)); 

while(!programmeStack.empty()){ 
    FormattedProgramme parent = programmeStack.pop(); 
    result.add(parent); 
    for(Programme child:parent.programme.programmes){ 
     //create child item with indentation + 1 
     //may be you need keep order of items - then reverse this loop 
     programmeStack.push(new FormattedProgramme(child, parent.indent+1)); 
    } 
} 

:その後、ツリー状の構造にインデントとビルド線形リスト上の

Javaコードを表示するために予約する必要がありますどのように多くのスペースを示しますフィールドindentationを作成することができます埋め込みを作成します(padding-divの左に10pxを掛けたもの):

<c:forEach var="fp" items="${formatted}"> 
    <div style='padding-left:${fp.indent * 10}px'> 
     <c:out value="${fp.programme.name}" /> 
    </div> 
</c:forEach> 
関連する問題