Составной компонент JSF2 создает исключение PropertyNotFoundException для метода действия - PullRequest
4 голосов
/ 15 августа 2010

У меня есть составной компонент:

<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}" />

и компонент, содержащий действие:

@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.)

Ответы [ 2 ]

9 голосов
/ 14 сентября 2010

У меня была та же проблема, и я обнаружил, что это произошло из-за того, что мой метод действия вызвал исключение IllegalArgumentException. Между тем об этом сообщается как об ошибке: Метод составного действия генерирует исключение PropertyNotFoundException, когда метод генерирует любое исключение .

Сложность (по крайней мере, для меня) заключалась в том, что мое приложение работало нормально, пока я не переместил часть кода в составной компонент (CC). До того, как мое приложение перехватило IAE и показало хорошее сообщение об ошибке, но при использовании CC проверка JSF (или что-то еще ...) сначала улавливает это и выдает это довольно запутанное сообщение об ошибке.

Я подтвердил это, используя измененную версию тестового кода, предоставленного BalusC (см. Ниже). На тестовой странице отображаются два компонента кнопки ввода и отправки. Если вы вводите что-то в текстовое поле (кроме «паники» (без кавычек)), то работает и CC-версия, и «встроенная» версия (смотрите вывод std). Если вы введете «панику» в «встроенной» версии, вы заметите IAE, как и ожидалось, но если вы введете то же самое в верхней «CC-версии», вы увидите вместо этого исключение PropertyNotFoundException. Кажется, что JSF смущает IAE и решает, что атрибут должен быть свойством, а не методом действия, в конце концов ... Не уверен, является ли это ошибкой или функцией. Это согласно Spec, кто-нибудь знает?

Итак, вывод здесь заключается в том, что вы не можете использовать методы действия в CC с bean-компонентами, которые генерируют исключения. Для меня это означает, что я не могу использовать составные компоненты. Грустно!

Надеюсь, это поможет ...

/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;
    }
}
1 голос
/ 16 августа 2010

Странно, я не могу воспроизвести это с Мохаррой 2.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;
    }

}

Сказанное выше работает и для вас?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...