2013-04-02 5 views
2

Я создал составной компонент JSF для проверки некоторых телефонных номеров. Если я размещаю необработанный код непосредственно на странице, все работает, но когда я пытаюсь использовать код в CC, я получаю NPE на загрузке страницы.

ЦК:

<!-- INTERFACE --> 
<cc:interface> 
    <cc:attribute required="true" name="gridID"/> 
    <cc:attribute required="true" name="coutry"/> 
    <cc:attribute required="true" name="listener"/> 
    <cc:attribute required="true" name="number"/> 
    <cc:attribute required="true" name="validator"/> 
    <cc:attribute required="true" name="groupID"/> 
</cc:interface> 

<!-- IMPLEMENTATION --> 
<cc:implementation> 
    <h:panelGrid id="#{cc.attrs.gridID}" 
       columns="5"> 

     <h:outputText value="Telephone*:" 
         styleClass="field-label" 
         style="margin-right: 22px"/> 
     <pou:selectOneMenu value="#{cc.attrs.coutry}" 
          effect="fade" 
          required="true" 
          requiredMessage="Telephone country is required"> 
      <f:selectItem itemLabel="#{web['W0033']}" 
          itemValue="" /> 
      <f:selectItems value="#{worldCountriesUtilMb.listAll()}"/> 
      <pou:ajax listener="#{cc.attrs.listener}" 
         update="#{cc.attrs.groupID}" /> 
     </pou:selectOneMenu> 

     <pou:inputText value="#{cc.attrs.number}" 
         required="true" 
         requiredMessage="Telephone number is required" 
         style="margin-left: 10px"> 
      <pou:ajax event="keyup" 
         listener="#{cc.attrs.listener}" 
         update="#{cc.attrs.groupID}" /> 

     </pou:inputText> 

     <h:panelGroup id="#{cc.attrs.groupID}" 
         style="margin-left: 10px"> 
      <pou:graphicImage value="#{publicURLGeneratorMb.s3Icon('cross-grey-1.svg')}" 
           width="20" 
           height="20" 
           rendered="#{!cc.attrs.validator}"/> 

      <pou:graphicImage value="#{publicURLGeneratorMb.s3Icon('tick-blue-1.svg')}" 
           width="20" 
           height="20" 
           rendered="#{cc.attrs.validator}"/> 

      <!-- Phone number validation --> 
      <h:inputHidden value="#{cc.attrs.validator}" 
          validator="booleanTrueRequired" 
          required="true" 
          requiredMessage="Please make sure the phone number is valid." 
          rendered="#{!cc.attrs.validator}"/> 

     </h:panelGroup> 

    </h:panelGrid> 
</cc:implementation> 

Как я использую его:

<ez:phone-validator 
    gridID="panelGrid3" 
    coutry="#{profileMb.roleOneProfileObj.phoneNumber.country}" 
    listener="#{profileMb.roleOneProfileObj.phoneNumber.validatePhoneNumber()}" 
    number="#{profileMb.roleOneProfileObj.phoneNumber.localNumber}" 
    groupID="valid-number" 
    validator="#{profileMb.roleOneProfileObj.phoneNumber.validNumber}"/> 

StackTrace:

WARNING: StandardWrapperValve[Faces Servlet]: PWC1406: Servlet.service() for servlet Faces Servlet threw exception 
java.lang.NullPointerException 
    at com.sun.faces.application.view.FaceletViewHandlingStrategy$MethodRetargetHandlerManager$ArbitraryMethodRegargetHandler.retarget(FaceletViewHandlingStrategy.java:1767) 
    at com.sun.faces.application.view.FaceletViewHandlingStrategy.retargetMethodExpressions(FaceletViewHandlingStrategy.java:731) 
    at com.sun.faces.facelets.tag.jsf.CompositeComponentTagHandler.applyNextHandler(CompositeComponentTagHandler.java:201) 
    at com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.apply(ComponentTagHandlerDelegateImpl.java:196) 
    at javax.faces.view.facelets.DelegatingMetaTagHandler.apply(DelegatingMetaTagHandler.java:120) 
    at javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:95) 
    at javax.faces.view.facelets.DelegatingMetaTagHandler.applyNextHandler(DelegatingMetaTagHandler.java:137) 
    at com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.apply(ComponentTagHandlerDelegateImpl.java:196) 
    at javax.faces.view.facelets.DelegatingMetaTagHandler.apply(DelegatingMetaTagHandler.java:120) 
    at javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:95) 
    at javax.faces.view.facelets.DelegatingMetaTagHandler.applyNextHandler(DelegatingMetaTagHandler.java:137) 
    at com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.apply(ComponentTagHandlerDelegateImpl.java:196) 
    at javax.faces.view.facelets.DelegatingMetaTagHandler.apply(DelegatingMetaTagHandler.java:120) 
    at javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:95) 
    at com.sun.faces.facelets.tag.ui.DefineHandler.applyDefinition(DefineHandler.java:106) 
    at com.sun.faces.facelets.tag.ui.CompositionHandler.apply(CompositionHandler.java:178) 
    at com.sun.faces.facelets.impl.DefaultFaceletContext$TemplateManager.apply(DefaultFaceletContext.java:395) 
    at com.sun.faces.facelets.impl.DefaultFaceletContext.includeDefinition(DefaultFaceletContext.java:366) 
    at com.sun.faces.facelets.tag.ui.InsertHandler.apply(InsertHandler.java:111) 
    at javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:95) 
    at javax.faces.view.facelets.DelegatingMetaTagHandler.applyNextHandler(DelegatingMetaTagHandler.java:137) 
    at com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.apply(ComponentTagHandlerDelegateImpl.java:196) 
    at javax.faces.view.facelets.DelegatingMetaTagHandler.apply(DelegatingMetaTagHandler.java:120) 
    at javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:95) 
    at com.sun.faces.facelets.compiler.NamespaceHandler.apply(NamespaceHandler.java:93) 
    at com.sun.faces.facelets.compiler.EncodingHandler.apply(EncodingHandler.java:87) 
    at com.sun.faces.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:320) 
    at com.sun.faces.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:379) 
    at com.sun.faces.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:358) 
    at com.sun.faces.facelets.impl.DefaultFaceletContext.includeFacelet(DefaultFaceletContext.java:199) 
    at com.sun.faces.facelets.tag.ui.CompositionHandler.apply(CompositionHandler.java:155) 
    at com.sun.faces.facelets.compiler.NamespaceHandler.apply(NamespaceHandler.java:93) 
    at com.sun.faces.facelets.compiler.EncodingHandler.apply(EncodingHandler.java:87) 
    at com.sun.faces.facelets.impl.DefaultFacelet.apply(DefaultFacelet.java:164) 
    at com.sun.faces.application.view.FaceletViewHandlingStrategy.buildView(FaceletViewHandlingStrategy.java:870) 
    at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:99) 
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) 
    at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139) 
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:594) 
    at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1550) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:343) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217) 
    at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:79) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217) 
    at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61) 
    at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108) 
    at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137) 
    at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125) 
    at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66) 
    at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108) 
    at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137) 
    at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125) 
    at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66) 
    at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:449) 
    at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:365) 
    at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90) 
    at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83) 
    at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:383) 
    at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:362) 
    at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:279) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175) 
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655) 
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:161) 
    at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:331) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231) 
    at com.sun.enterprise.v3.services.impl.ContainerMapper$AdapterCallable.call(ContainerMapper.java:317) 
    at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195) 
    at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:860) 
    at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:757) 
    at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1056) 
    at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:229) 
    at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137) 
    at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104) 
    at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90) 
    at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79) 
    at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54) 
    at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59) 
    at com.sun.grizzly.ContextTask.run(ContextTask.java:71) 
    at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532) 
    at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513) 
    at java.lang.Thread.run(Thread.java:722) 
+0

Невозможно быстро ответить на вопрос, не видя stacktrace, поскольку в основном содержит ответ. Вы не должны игнорировать исключения, как если бы они были украшением, если вы не можете их интерпретировать. – BalusC

+0

Вам нужно указать подробное описание вашего NPE (например, где это происходит, управляемый компонент и т. Д.) –

+0

Опять же, если вы не можете интерпретировать исключения, не игнорируйте их, как если бы они были украшением. – BalusC

ответ

6
java.lang.NullPointerException 
    at com.sun.faces.application.view.FaceletViewHandlingStrategy$MethodRetargetHandlerManager$ArbitraryMethodRegargetHandler.retarget(FaceletViewHandlingStrategy.java:1767) 

на основе the source code,

1767    methodSignature = methodSignature.trim(); 

это будет выброшено, если <cc:attribute> в вопросе не имеет method-signature.

Основанный на коде, опубликованном до сих пор, требуется <cc:attribute name="listener">. Итак, если вы это добавите, тогда эта проблема должна быть решена.

<cc:attribute required="true" name="listener" method-signature="void listener()" /> 
+0

Спасибо, по иронии судьбы, это было частью окончательного решения, но на самом деле это не вызвало первоначальный NPE. Оказывается, исходный NPE был вызван тем, что имя «валидатор» похоже зарезервировано. Если я изменю его на что-нибудь еще, он отлично работает, но если я назову его «валидатор», он генерирует NPE. – tarka

+0

Большое спасибо, он решил мою проблему – TarikW