web-dev-qa-db-ja.com

Tomcat6.0.24でのEL2.2の使用

JSF 2を使用すると、次のことができるようになります。

<h:commandButton action="#{myBean.myAction(myParameter)}"/>

次に、アクションメソッドを呼び出し、パラメーターを渡します(整数であると想定します)。

@ManagedBean
@SessionScoped
public class MyBean {
    ...
    public String myAction(Integer myParameter) {
        // do something
        return null;
    }
    ...
}

これはGlassfishv3で完全に機能します。ただし、Tomcatではなく、解析エラーを通知するELExceptionが発生します

Caused by: javax.el.ELException: Error Parsing: ...

さて、 EL 2.2を使用してこれを機能させる文書化された方法 とTomcatlibディレクトリのel-api jarを置き換えることによるGlassfishの実装がありますが、それでも同じエラーが発生します。 Tomcatは本当に私を苛立たせ始めています! JSF2はもっと簡単になることを目的としています!

Maven POMフラグメント:

<repositories>
  <repository>
    <id>Sun</id>
    <url>http://download.Java.net/maven/2/</url>
  </repository>
  <repository>
    <id>jboss</id>
    <url>http://repository.jboss.com/maven2/</url>
  </repository>
</repositories>
...
  <dependency>
    <groupId>javax.el</groupId>
    <artifactId>el-api</artifactId>
    <version>2.2</version>
    <scope>provided</scope>
  </dependency>

  <dependency>
    <groupId>org.glassfish.web</groupId>
    <artifactId>el-impl</artifactId>
    <version>2.2</version>
    <scope>provided</scope>
  </dependency>

より詳しい情報。

これはスタックトレースの一部ですが、まだApache EL実装を使用しているようで、libにダンプしたものではありません。 Tomcatに付属している既存のel-api.jarを完全に削除しましたが、何かを上書きしている可能性のあるel-impl.jarも削除するつもりですか?

Was expecting one of:
    "}" ...
    "." ...
    "[" ...
    ">" ...
    "gt" ...
    "<" ...
    "lt" ...
    ">=" ...
    "ge" ...
    "<=" ...
    "le" ...
    "==" ...
    "eq" ...
    "!=" ...
    "ne" ...
    "&&" ...
    "and" ...
    "||" ...
    "or" ...
    "*" ...
    "+" ...
    "-" ...
    "/" ...
    "div" ...
    "%" ...
    "mod" ...

    at org.Apache.el.parser.ELParser.generateParseException(ELParser.Java:2142)
    at org.Apache.el.parser.ELParser.jj_consume_token(ELParser.Java:2024)
    at org.Apache.el.parser.ELParser.DeferredExpression(ELParser.Java:113)
    at org.Apache.el.parser.ELParser.CompositeExpression(ELParser.Java:40)
    at org.Apache.el.lang.ExpressionBuilder.createNodeInternal(ExpressionBuilder.Java:93)
    ... 64 more
17
jamiebarrow

コメントで述べたように、これはEL実装をアップグレードすることで解決できます(つまり、jasper-el.jarをel-impl-2.2.jarに置き換えます)

8
jamiebarrow

他の回答で述べたように、el-api-2.2.jarをTomcatサーバーのlibフォルダーに追加し、el-impl-2.2.jarをWEB-INF/libフォルダーに追加する必要があります。

他の回答は、ジャスパーの削除またはExpressionFactoryImplのカスタム実装の作成に言及しています。それはうまくいくかもしれませんが、あなたはそれをする必要はないはずです。

MyFacesのorg.Apache.myfaces.EXPRESSION_FACTORYまたはMojarraのcom.Sun.faces.expressionFactoryを使用して、式ファクトリの実装をオーバーライドする必要があります。

<context-param>
    <param-name>org.Apache.myfaces.EXPRESSION_FACTORY</param-name>
    <param-value>com.Sun.el.ExpressionFactoryImpl</param-value>
</context-param>
  <context-param>
    <param-name>com.Sun.faces.expressionFactory</param-name>
    <param-value>com.Sun.el.ExpressionFactoryImpl</param-value>
  </context-param>
25

JBossELを使用できます。

これは、Expression Language2.1の実装です。ただし、例のようにメソッドパラメータを許可する拡張機能があります。

<h:commandButton action="#{myBean.myAction(myParameter)}"/>

利点は、Webアプリケーションを変更するだけで、Tomcatのlibディレクトリは変更できないことです。

指示

  1. ダウンロード Seam 2の最新バージョン
  2. 抽出lib/jboss-el.jar
  3. WEB-INF/lib/jboss-el.jarにコピーします
  4. web.xmlセット内:

    <context-param>
        <param-name>com.Sun.faces.expressionFactory</param-name>
        <param-value>org.jboss.el.ExpressionFactoryImpl</param-value>
    </context-param>
    

直接メソッドまたはELのパラメータを持つメソッドを呼び出す も参照してください。

El-api.jarとel-impl.jarをel-api-2.2.jarとel-impl-2.2.jarに置き換えると、問題が解決します。

また、context.xmlにコンテキストパラメータを追加する必要があります

<context-param>
    <param-name>org.Apache.myfaces.EXPRESSION_FACTORY</param-name>
    <param-value>com.Sun.el.ExpressionFactoryImpl</param-value>
</context-param>
  <context-param>
    <param-name>com.Sun.faces.expressionFactory</param-name>
    <param-value>com.Sun.el.ExpressionFactoryImpl</param-value>
  </context-param>
1
Neos76