2014-07-09 4 views
1

복합 구성 요소 단추가 있고 해당 동작이 특성에서옵니다.복합 구성 요소에서 일치하는 탐색 사례를 찾을 수 없습니다.

<comp:interface> 
    <comp:attribute name="buttonId" required="false"/> 
    <comp:attribute name="action" required="false" method-signature="java.lang.String action()"/> 
    <comp:attribute name="alt"/> 
    <comp:attribute name="value" /> 
    <comp:attribute name="immediate"/> 
</comp:interface> 

<comp:implementation> 
    <h:commandButton alt="#{cc.attrs.alt}" action="#{cc.attrs.action}" 
        value="#{cc.attrs.value}" id="#{cc.attrs.buttonId}" 
        immediate="#{cc.attrs.immediate}"/> 
</comp:implementation> 

버튼을 만들면 동작이 내 컨트롤러에서 발생합니다.

<test:myButton value="Test" alt="test" action="{myController.doSomething}" immediate="true" buttonId="testId"/> 

그때 나는 액션이 ​​# {cc.attrs.action}에서 오는 버튼을 클릭하면 myController.doSomething

<navigation-case> 
     <from-action>#{myController.doSomething}</from-action> 
     <from-outcome>success</from-outcome> 
     <to-view-id>/pages/test1.xhtml</to-view-id> 
     <redirect /> 
</navigation-case> 

에 대한 문제가 보이는 탐색 규칙이 그래서를 얻을 수 다음 오류가 발생했습니다.

Unable to find matching navigation case with from-view-id '/pages/test.xhtml' for action '#{cc.attrs.action}' with outcome 'success' 

어떻게이 문제를 해결할 수 있습니까?

+0

여기 모르겠지만 나는 그것이 가치가 시도 생각 : 행동 = "# {콩 [CC'에'행동 ="# {cc.attrs.action을} ''으로 변경하려고합니다. attrs.action]} ""을 호출하고 속성을 추가하십시오 : '' –

답변

1

action 속성을 commandButton에 다시 지정하기 위해 targets 속성을 추가하면 문제가 해결됩니다. action 속성은 commandButton에서 필요하지 않습니다.

http://www.devmanuals.com/tutorials/java/jsf/jsf2TagLibrary/composite/attribute.html

타겟

<comp:interface> 
    <comp:attribute name="buttonId"/> 
    <comp:attribute name="action" targets="#{cc.attrs.buttonId}" method-signature="java.lang.String action()"/> 
    <comp:attribute name="alt"/> 
    <comp:attribute name="value" /> 
    <comp:attribute name="immediate"/> 
</comp:interface> 

<comp:implementation> 
    <h:commandButton alt="#{cc.attrs.alt}" 
        value="#{cc.attrs.value}" id="#{cc.attrs.buttonId}" 
        immediate="#{cc.attrs.immediate}"/> 
</comp:implementation> 
이 (만약 존재한다면) 로 대상을 지정하는 요구 특성은 '메소드 서명'속성으로의 성분 클라이언트 ID를 호출한다. 다른 대상 클라이언트 ID는 대상 목록에서 공백 (탭 공간 아님)으로 구분할 수 있지만 이 속성을이 태그와 함께 사용하지 않고 method-signature 속성을 사용하면 'name'속성 값만 을 타겟팅하거나 'name'속성의 유일한 값을 타겟팅한다고 말할 수 있습니다.

아래 링크에서 targetAttributeName 속성 설명서에 설명 된 방법을 사용할 수도 있습니다. 기본적으로 cc:attribute의 이름을 commandButton id와 동일하게 설정 한 다음 targetAttributeName="action"을 사용하여 commandButton action 속성을 다시 지정한다고 말할 수 있습니다.

http://docs.oracle.com/javaee/6/javaserverfaces/2.1/docs/vdldocs/facelets/composite/attribute.html

+0

'buttonId'를 내부적으로 처리 할 수 ​​없습니까? 즉,'targets = "actualButtonId"'와 같은 내부 문자열을 사용하고''; 복합체에 외부 적으로 ID를 관리하는 대신? 좀 더 안전 해 보입니다 ... 아니면 뭔가 빠졌나요? – nuno