2010-08-04 4 views
1

코딩 한 JSF ViewHandlerWrapper에 약간의 문제가 있습니다. 대부분의 경우 잘 동작하지만 때때로 Mojarra의 핵심에서 NullPointerException을 얻고 따라서 ViewHandlerWrapper를 올바르게 구현했는지 궁금해하기 시작했습니다. 코드에서 JSF ViewHandlerWrapper로 인해 NullPointerException이 발생합니다.

public class TokenViewHandler extends ViewHandlerWrapper { 
    private ViewHandler parent; 

    public TokenViewHandler(ViewHandler parent) { 
     this.parent = parent; 
    } 

    @Override 
    public ViewHandler getWrapped() { 
     return parent; 
    } 

    @Override 
    public void renderView(FacesContext context, UIViewRoot viewToRender) throws IOException, FacesException { 
     final String token = UUID.randomUUID().toString(); 

     findAndModifyForms(viewToRender, token, context); 

     getWrapped().renderView(context, viewToRender); 
    } 

    private void findAndModifyForms(final UIComponent component, final String token, final FacesContext ctx) { 
     if (component instanceof UIForm) { 
      final HtmlInputHidden hidden = (HtmlInputHidden) ctx.getApplication().createComponent(HtmlInputHidden.COMPONENT_TYPE); 
      hidden.setValue(token); 
      component.getChildren().add(hidden); 
     } else { 
      for (UIComponent tempComponent : component.getChildren()) { 
       findAndModifyForms(tempComponent, token, ctx); 
      } 
     } 
    } 
} 

당신은 신속하게 내가보기에 각 형태에 UUID 값으로 inputHidden -component을 추가 할 것을 알고 있습니다.

ViewHandlerWrappers에 대한 좋은 예제를 찾지 못했지만 ExceptionHandlerWrapper처럼 보일 것이라고 생각했지만 ViewHandler를 사용하여 비정기 NPE를 얻었으므로 뭔가 잘못되었다고 생각하고 볼 수 없습니다. .

+0

NPE를 일으키는 라인은 무엇입니까? –

+0

내 코드의 행이 없습니다. 그것은 Mojarra 자체에 있으며, 정확하게 지적하기가 어렵습니다. 나는 java.lang.NullPointerException이 얻을 : 널 (null) \t com.sun.faces.application.view.StateManagementStrategyImpl $ 4.invokeContextCallback (StateManagementStrategyImpl.java:289) ~ [glassfish.jsf_1.0.0.0_2-0-2.jar에서 : 2.0.2-FCS] \t (javax.faces.component.UIComponent.invokeOnComponent (UIComponent.java:1253) ~ [javax.jsf_1.0.0.0_2-0.jar : 2.0.2-FCS] – SiCN

+0

) NPE는 다음보기가 Action, 즉 commandLink -> Action -> 결과와 같은 경우에 항상 occours됩니다. 그러나보기가 직접 호출되면 작동합니다. 이상한 물건 :) Mojarra 소스도 확인했는데 프레임 워크가 이전에 추가하지 않으면 새로운 구성 요소를 인식하지 못하는 것 같습니다. 문제는 이전에 수명주기에 빠져 있다면 viewRoot에 다른 구성 요소가 아직 추가되지 않았기 때문에 본질적으로 막혔습니다. – SiCN

답변

0

이것은 부분적인 상태 저장의 버그와 관련이있는 것으로 보입니다. issue 1414을 참조하십시오.

IceFaces들은 similar problem을 발견하고는 (일시적으로) 다음 줄을 추가하여 고정 가지고 :

facesContext.getViewRoot().addComponentResource(facesContext, new UIOutput(), "head"); 

그것을 시도 줄. 뷰를 렌더링하기 전에 수행하십시오.

+0

addComponentResource() - 호출이 sé에 도움이되지 않았지만 제공된 링크를 통해 Mojarra 2.0.3에서 문제가 해결 될 것이라는 표시가 나타납니다. 내 라이브러리를 업데이트 한 후 즉시 작동했습니다. – SiCN

+0

응원! 당신이 일하게되어 기뻐요. – BalusC

관련 문제