我對編碼的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);
}
}
}
}
從代碼,你就會發現我要添加inputHidden -component與UUID值在視圖中的每個形式。
因爲我還沒有找到ViewHandlerWrappers的任何好例子,我認爲它應該看起來像一個ExceptionHandlerWrapper,但由於我使用ViewHandler得到了偶爾的NPE,我認爲有些事情是錯誤的,我似乎無法看到它。
什麼生產線導致NPE? – 2010-08-04 07:43:24
我的代碼中沒有任何行。這是在Mojarra本身,這使它有點難以查明。 我得到java.lang.NullPointerException:null \t at 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 at javax.faces.component.UIComponent.invokeOnComponent(UIComponent.java:1253)〜[javax.jsf_1.0.0.0_2-0.jar:2.0.2-FCS] – SiCN 2010-08-04 08:16:28
似乎是如果下一個視圖流經一個Action,即commandLink - > Action - > Outcome,NPE總是會發生。但是,如果視圖是直接調用的,它就可以工作。奇怪的東西:)我也在檢查Mojarra的來源,看來,該框架沒有意識到新的組件,除非加入更早。問題是,如果我早點掛鉤了生命週期,其他組件還沒有添加到viewRoot中,所以我基本上被卡住了。 – SiCN 2010-08-04 12:54:48