Составной компонент JSF2 выдает PropertyNotFoundException для метода действия

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

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


person Zack Marrapese    schedule 15.08.2010    source источник
comment
в качестве комментария вам не нужно писать @Named(value=saveDecisionsBean), если это одно и то же имя класса   -  person Dejell    schedule 15.08.2010
comment
Это делается по умолчанию в NetBeans.   -  person Zack Marrapese    schedule 16.08.2010
comment
Кроме того, если бы вышеизложенное сработало, то можно было бы также использовать <composite:attribute name="actionMethod" targets="captureButton" required="true" />, следовательно, без method-signature. Та же проблема.   -  person Arjan    schedule 07.02.2012
comment
к вашему сведению. Базовая ошибка исправлена. java.net/jira/browse/JAVASERVERFACES-1806   -  person Harsha R    schedule 05.06.2012


Ответы (2)


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

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

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

Итак, вывод состоит в том, что вы не можете использовать методы действия в 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;
    }
}
person Jorgen    schedule 14.09.2010
comment
Конечно, вы можете добавить Faces Message вместо того, чтобы выбрасывать IAE: - person Jorgen; 14.09.2010
comment
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(Some error....); Но это нарушает разделение bean-компонентов (как простых POJO) и JSF/Faces - person Jorgen; 14.09.2010
comment
Вы совершенно правы! Это определенно ошибка. Я сообщу об этом ребятам из JSF. - person BalusC; 14.09.2010
comment
Просто примечание: если вы удалите исключение, и ваш метод выдаст любое исключение RuntimeException, JSF выдаст исключение PropertyNotFoundException. - person Guilherme Torres Castro; 15.06.2012
comment
Это такой базовый вариант использования, что можно подумать, что для него нужен модульный тест. Почти два года спустя я все еще не могу создать составной компонент, который использует валидатор. - person Distortum; 23.06.2012

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

}

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

person BalusC    schedule 15.08.2010
comment
У меня это прекрасно работает, даже с использованием CDI. Я должен изучить это дальше. - person Zack Marrapese; 16.08.2010
comment
Может вложенная форма? См. также этот ответ для других подсказок. - person BalusC; 16.08.2010
comment
Там определенно нет вложенной формы... Я действительно использую CDI в bean-компоненте (я ввожу 3 разных bean-компонента из двух разных областей. Кроме того, я использую обязательные параметры представления. Я не уверен, что какой-либо из это имеет значение Я не думаю, что это было бы так, поскольку проблемы с параметрами представления или представления будут вызывать исключения задолго до того, как на самом деле попытаются вызвать действие. - person Zack Marrapese; 16.08.2010