我对编码的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