4

複合コンポーネントがあります:

<composite:interface>
    <composite:attribute name="actionMethod" 
        method-signature="java.lang.String action()" required="true" />
</composite:interface>

<composite:implementation>
    <h:form>
        <h:commandButton id="captureButton" value="#{msgs.capture}" 
            action="#{cc.attrs.actionMethod}" />
    </h:form>
</composite:implementation>

そして、その複合コンポーネントを呼び出しているページ:

<ezcomp:captureTitle actionMethod="#{saveDecisionsBean.captureTitle}" />

およびアクションを含むBean:

@Named(value="saveDecisionsBean")
@SessionScoped
public class SaveDecisionsBean extends BackingBeanBase {
    ...
    public String captureTitle() {
        ...
    }
}

これが私の問題です。これを実行しようとすると、SaveDecisionsBeanにプロパティcaptureTitleがないというメッセージが表示されます。したがって、SaveDecisionsBean#getCaptureTitle()メソッドを追加する必要があります。私がこれを行うとき、それはうまく動作します。なぜこのメソッドを定義する必要があるのですか?それは<composite:attribute />メソッドであり、アクションとして使用されるということです。

これが私が得ている正確なエラーメッセージです:

javax.el.PropertyNotFoundException: /index.xhtml @54,86 
    actionMethod="#{saveDecisionsBean.captureTitle}": 
    The class 'com.example.persistence.SaveDecisionsBean_$$_javassist_209'
    does not have the property 'captureTitle'.

(SEOの理由で:他の実装ではクラス名が表示される場合がありWeldClientProxyます。)

4

2 に答える 2

9

同じ問題が発生しましたが、アクションメソッドがIllegalArgumentExceptionをスローしたことが原因であることがわかりました。一方、これはバグとして報告されています。メソッドが例外をスローすると、複合アクションメソッドはPropertyNotFoundExceptionをスローします

トリッキーな部分(少なくとも私にとって)は、コードの一部を複合コンポーネント(CC)に移動するまで、アプリが正常に機能していたことです。私のアプリがIAEをキャッチして素晴らしいエラーメッセージを表示する前に、CCを使用する場合、JSF検証(またはその他...)が最初にこれをキャッチし、このかなり紛らわしいエラーメッセージを生成します。

BalusCが提供するテストコードの修正バージョンを使用してこれを確認しました(以下を参照)。テストページには、2つの入力ボタンと送信ボタンのコンポーネントが表示されます。テキストフィールドに何かを入力すると(「パニック」(引用符なし)を除く)、CCバージョンと「インライン」バージョンの両方が機能します(標準出力を確認してください)。「インライン」バージョンで「パニック」と入力すると、期待どおりにIAEに気付くでしょうが、上部の「CCバージョン」に同じものを入力すると、代わりにPropertyNotFoundExceptionが表示されます。JSFがIAEによって混乱し、属性はアクションメソッドではなくプロパティである必要があると判断したようです...これがバグなのか機能なのかわからない。これはスペックによるものですか、誰か知っていますか?

したがって、ここでの結論は、例外をスローするBeanでCCのアクションメソッドを使用することはできないということです。私にとって、これは複合コンポーネントを使用できないことを意味します。悲しい!

お役に立てれば...

/resources/components/test.xhtml

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:cc="http://java.sun.com/jsf/composite">
<cc:interface>
  <cc:attribute name="text"/>
  <cc:attribute name="action" method-signature="java.lang.String action()" required="true" />
</cc:interface>
<cc:implementation>
  <h:form>
    <h:inputText value="#{cc.attrs.text}"/>
    <h:commandButton value="submit" action="#{cc.attrs.action}" />
  </h:form>
</cc:implementation>

/test.xhtml

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:cc="http://java.sun.com/jsf/composite/components">
<h:head>
  <title>Test</title>
</h:head>
<h:body>
  <!-- text and cmd-button as cc -->
  <cc:test text="#{bean.text}" action="#{bean.submit}" />

  <hr/>

  <!-- text and cmd-buuton inline -->
  <h:form id="inline">
    <h:inputText value="#{bean.text}"/>
    <h:commandButton value="submit2" action="#{bean.submit}" />
  </h:form>
</h:body>
</html>

そして最後の豆:

@ManagedBean
@RequestScoped
public class Bean {

  private String text;

  public String getText() {
    return text;
  }

  public void setText(String text) {
    this.text = text;
  }

  public String submit() {
        if (text.equalsIgnoreCase("panic")){
          throw new IllegalArgumentException("Panic!");
        }

        System.out.println(text);

        return null;
    }
}
于 2010-09-14T09:56:12.643 に答える
1

奇妙なことに、これをMojarra2.0.2で再現することはできません。たぶん、どちらかと衝突しているコードにもっと何かがありますか?または、実行していると思われるコードを実行していませんか?

完全を期すために、この問題を再現するために使用したテストスニペットを含めます。

/resources/components/test.xhtml

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:cc="http://java.sun.com/jsf/composite">
    <cc:interface>
        <cc:attribute name="action" method-signature="java.lang.String action()" required="true" />
    </cc:interface>
    <cc:implementation>
        <h:form>
            <h:commandButton value="submit" action="#{cc.attrs.action}" />
        </h:form> 
    </cc:implementation>
</html>

/test.xhtml

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:cc="http://java.sun.com/jsf/composite/components">
    <h:head>
        <title>Test</title>
    </h:head>
    <h:body>
        <cc:test action="#{bean.submit}" />
    </h:body>
</html>

com.example.Bean

package com.example;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;

@ManagedBean
@RequestScoped
public class Bean {

    public String submit() {
        System.out.println("submit");
        return null;
    }

}

上記はあなたにも役立ちますか?

于 2010-08-15T20:47:09.390 に答える