2013-02-10 5 views
0

두 개의 JSF 페이지가 있습니다. layout.xhtml 및 page.xhtml. 레이아웃은 다음과 같습니다 :이 같은JSF가 객체를 템플릿에 전달합니다.

<ui:composition>                              
<h:panelGroup id="menu" layout="block">                       
    <h:outputText value="#{menuBean}" />                       
    <h:form>                              
     <ui:repeat var="menuItem" value="#{menuBean.menuItems}">                 
      <button:menuItem label="#{msgs[menuItem.label]}" action="#{menuBean.selectItem(menuItem.label)}" update="#{update}" /> 
     </ui:repeat>                            
    </h:form>                              
</h:panelGroup>                             
<ui:repeat var="menuItem" value="#{menuBean.menuItems}">                   
    <h:panelGroup layout="block" rendered="#{menuBean.selectedItemLabel eq menuItem.label}">          
     <ui:include src="#{menuItem.page}" />                      
    </h:panelGroup>                            
</ui:repeat>                              

그리고 페이지 :

<h:panelGroup binding="#{page}" layout="block">    
    <ui:decorate template="../template.xhtml">     
     <ui:param name="menuBean" value="#{pageBean}" />   
     <ui:param name="update" value=":#{page.clientId}" /> 
    </ui:decorate> 
</h:panelGroup> 

을 내가 처음 페이지 다 (메뉴 아이템이 등 렌더링) 괜찮 렌더링합니다. 아무 버튼이나 클릭하면 Target Unreachable, identifier 'menuBean' resolved to null이됩니다.

menuBean이 다시 할당되지 않은 이유에 대해 누구든지 설명 할 수 있습니까? 그리고 이런 종류의 일을 성취 할 수있는 다른 방법이 존재한다면 (일부 일반 레이아웃 페이지를 가지고 거기에 일부 객체를 전달하고 페이지를 생성합니까?)? 내 콩은 봄에 의해 관리됩니다.

업데이트 : 표준 시간으로 태그를 교체 할 경우

<composite:interface name="menuItem">                         
    <composite:attribute name="action" targets="button" />                   
    <composite:attribute name="styleClass" />                       
    <composite:attribute name="label" />                        
    <composite:attribute name="update" />                        
    <composite:attribute name="rendered" />                       
    <composite:insertChildren />                          
</composite:interface>                            

<composite:implementation>                           
    <h:commandButton id="button" value="#{cc.attrs.label}" style="width: 150px;" action="#{cc.attrs.action}"       
     rendered="#{empty cc.attrs.rendered ? true : cc.attrs.rendered}" styleClass="menu-item #{cc.attrs.styleClass}" type="button"> 
     <f:ajax render="#{cc.attrs.update}" />                      
    </h:commandButton>                            
</composite:implementation> 

: 명령 단추 모든 것을 완벽하게 작동

나는 문제가 어떻게 든 다음과 같습니다 내 복합 버튼에 연결되어있는 것 같아요. 개체를 템플릿에 전달할 때 템플릿이 전달 된 개체를 복합체로 전달하지만 확실히 뭔가 누락되었습니다.

답변

0

문제는 콩의 범위와 관련이 있다고 생각합니다. 내가 이해하고 있듯이 페이지 빈 요청 빈이 있습니다. 더 넓은 범위의 범위를 변경하십시오 (뷰 범위 @ViewScoped 여야 함). JSF 대신 CDI 어노테이션을 사용하면 @ConversationalScope를 볼 수 있습니다 (또는 Luiggi가 언급 한대로 MyFacesCODI 라이브러리를 사용할 수 있습니다).

+0

'@ ViewScoped'는 JSF에서 가져온 것이지 PrimeFaces에서 가져온 것이 아닙니다. CDI에서'@ ViewScoped'를 사용하려면이 기능을 추가하는 MyFacesCODI 라이브러리를 추가 할 수 있습니다. –

+0

예, 저는 이미 저의 과오를 드러내지 않았고 나의 단서를 편집했습니다. MyFacesCODI에 대한 정보를 보내 주셔서 감사합니다. – dimas

+0

포틀릿 (Liferay 6) 환경에서 ICEFaces를 사용하고 있습니다. 빈은 Spring에 의해 관리되고 내 pageBean은 ViewScoped입니다 :((심지어 SessionScope도 동일하게 동작합니다) – svobol13

관련 문제