2010-08-15 8 views
4

에 대한 PropertyNotFoundException가 발생합니다JSF2 복합 구성 요소는 내가 복합 구성 요소가 액션 메소드

@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을 표시 할 수 있습니다)

+0

를, 당신이없는이 @Named (값을 기록합니다 = "saveDecisionsBean") – Dejell

+0

과 동일한 이름 인 경우 NetBeans에서는 기본적으로이 작업을 수행합니다. –

+0

위와 같은 것이 효과가 있었다면, 또한 'method-signature'없이 ''를 사용할 수 있습니다. 그래도 같은 문제. – Arjan

답변

9

나는 같은 문제가 있었는데, 그게 내 행동 방식이 IllegalArgumentException을 던 졌기 때문이라고 알았다. 그 사이에 이것은 버그로보고되었습니다 : Composite action method throws PropertyNotFoundException when method throws any exception.

까다로운 부분은 (적어도 나를 위해) 코드의 일부를 CC (Composite Component)로 옮기기 전까지는 내 앱이 잘 작동한다는 것입니다. 내 응용 프로그램이 IAE를 잡아서 좋은 오류 메시지를 표시하기 전에 CC를 사용하면 JSF 유효성 검사 (또는 기타 ...)가 먼저이를 잡아 당겨이 혼란스러운 오류 메시지를 생성합니다.

이 내용은 BalusC에서 제공 한 수정 코드 버전을 사용하여 검증되었습니다 (아래 참조). 테스트 페이지에는 두 개의 입력 & 제출 버튼 구성 요소가 표시됩니다. "패닉"(따옴표 제외)과 별도로 텍스트 필드에 내용을 입력하면 CC 버전과 "인라인"버전이 모두 작동합니다 (표준 출력보기). "인라인"버전에서 "패닉"을 입력하면 IAE가 예상대로 작동하지만 상위 "CC 버전"에 동일한 항목을 입력하면 대신 PropertyNotFoundException이 표시됩니다. JSF가 IAE에 혼란스러워하고 속성이 결국 행동 메소드가 아닌 속성이어야한다고 판단합니다. 이것이 버그인지 기능인지는 확실하지 않습니다. Spec에 의하면 이거 아나요?

그래서 여기서 예외는 예외를 throw하는 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; 
    } 
} 
+0

물론, IAE를 던지기보다는 얼굴 메시지를 추가 할 수 있습니다. – Jorgen

+0

FacesContext. addMessage (null, new FacesMessage ("Some error ....");) 이렇게하면 bean (단순한 POJO와 같은)과 JSF/Faces의 분리가 깨질 것입니다. – Jorgen

+2

정말 옳습니다! JSF 소년에게보고 해 드리겠습니다. – BalusC

1

홀수, 나는 인 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; 
    } 

} 

위 내용도 귀하에게 효과가 있습니까?

+0

CDI를 사용하는 경우에도 저에게 잘 돌아갑니다. 나는 더 자세히 살펴 봐야 할 것이다. –

+0

아마도 중첩 된 양식일까요? 다른 힌트를 얻으려면 [이 답변] (http://stackoverflow.com/questions/2118656/hcommandlink-is-not-being-invoked/2120183#2120183)도 참조하십시오. – BalusC

+0

중첩 된 형식이 아닙니다 ... 저는 ** 콩에서 CDI를 사용합니다 (두 개의 서로 다른 범위에서 3 개의 다른 콩을 주입합니다.) 또한 필요한 뷰 매개 변수를 사용합니다. 차이점이 있습니다. 난독 화 또는 뷰 매개 변수 문제가 실제로 액션을 호출하기 전에 예외를 던지기 때문에 상상할 수 없습니다. –

관련 문제