[ 
https://issues.apache.org/jira/browse/MYFACES-4379?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17272248#comment-17272248
 ] 

Milan Siebenbürger commented on MYFACES-4379:
---------------------------------------------

I tried to create simple project for issue 2, it fails with same reason, just 
somewhere else, but I think that doesn't matter, problem is still same  - null 
value
{noformat}
java.lang.NullPointerException
        at 
org.apache.myfaces.util.NavigationUtils._isExpression(NavigationUtils.java:147)
        at 
org.apache.myfaces.util.NavigationUtils.getEvaluatedNavigationParameters(NavigationUtils.java:96)
        at 
org.apache.myfaces.renderkit.html.util.OutcomeTargetUtils.getOutcomeTargetHref(OutcomeTargetUtils.java:148)
        at 
org.apache.myfaces.renderkit.html.util.HtmlRendererUtils.getOutcomeTargetHref(HtmlRendererUtils.java:1250)
        at 
org.apache.myfaces.renderkit.html.base.HtmlLinkRendererBase.renderOutcomeLinkStart(HtmlLinkRendererBase.java:915)
        at 
org.apache.myfaces.renderkit.html.base.HtmlLinkRendererBase.encodeBegin(HtmlLinkRendererBase.java:149)
        at 
javax.faces.component.UIComponentBase.encodeBegin(UIComponentBase.java:571)
        at 
javax.faces.component.UIComponentBase.encodeAll(UIComponentBase.java:502)
        at 
javax.faces.component.UIComponentBase.encodeAll(UIComponentBase.java:526)
        at 
javax.faces.component.UIComponentBase.encodeAll(UIComponentBase.java:526)
        at 
org.apache.myfaces.view.facelets.FaceletViewDeclarationLanguage.renderView(FaceletViewDeclarationLanguage.java:1782)
        at 
org.apache.myfaces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:316)
        at 
org.apache.myfaces.lifecycle.RenderResponseExecutor.execute(RenderResponseExecutor.java:122)
        at 
org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:241)
        at javax.faces.webapp.FacesServlet.service(FacesServlet.java:209)
        at 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
        at 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at 
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
        at 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at 
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)
        at 
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
        at 
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)
        at 
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143)
        at 
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
        at 
org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:690)
        at 
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
        at 
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
        at 
org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374)
        at 
org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
        at 
org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)
        at 
org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590)
        at 
org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
        at 
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at 
org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
        at java.lang.Thread.run(Thread.java:748){noformat}
 navigationCase ->

!image-2021-01-26-18-02-38-773.png|width=342,height=135!

If I change it to empty string value, it works as expected:

!image-2021-01-26-18-01-58-622.png!

 

The problem is in FacesConfigUnmarshallerImpl.getTextContent
{code:java}
return StringUtils.isBlank(textContent) ? null : textContent;{code}
There is no chance, how to pass empty String as view-param/redirect-param value

 

> FacesConfigUnmarshallerImpl - navigation-rules, view-param parsing
> ------------------------------------------------------------------
>
>                 Key: MYFACES-4379
>                 URL: https://issues.apache.org/jira/browse/MYFACES-4379
>             Project: MyFaces Core
>          Issue Type: Bug
>          Components: General
>    Affects Versions: 2.3-next-M3, 2.3-next-M4, 4.0.0-RC1
>            Reporter: Milan Siebenbürger
>            Assignee: Thomas Andraschko
>            Priority: Major
>             Fix For: 2.3-next-M5, 4.0.0-RC1
>
>         Attachments: image-2021-01-26-18-01-58-622.png, 
> image-2021-01-26-18-02-38-773.png
>
>
> Hello,
> could you please check FacesConfigUnmarshallerImpl, we discovered some issues 
> in navigation rules parsing, especially view-param / redirect-param. Is there 
> is something wrong on our side?
> The specific configuration of navigation rules xml looks like this
> {code:java}
> <redirect>
>    <view-param>
>       <name>cid</name>
>       <value></value>
>    </view-param>
> </redirect>
> {code}
> Issue 1. - viewParams are not handled correctly:
> {code:java}
>           onChild("view-param", n, (cn) -> {
>                 ViewParamImpl vp = new ViewParamImpl();
>                 r.addViewParam(vp);
>                 onChild("name", cn, (ccn) -> { 
> vp.setName(ccn.getTextContent()); });
>                 onChild("value", cn, (ccn) -> { 
> vp.setValue(ccn.getTextContent()); });
>             });
> {code}
> If I understand it correctly, empty ViewParamImpl si created, added to r 
> (RedirectImpl), and after that it is filled with xml values.
> In RedirectImpl, method addViewParam, is ViewParam attribute transformed to 
> key/value combination and added to local HashMap. Because it is empty (yet), 
> empty key is created in local HashMap, and no values are filled.
> {code:java}
> public void addViewParam(ViewParamImpl viewParam)
> {
>     if (viewParams == null)
>     {
>         viewParams = new HashMap<>(3, 1f);
>     }
>     List<String> params = viewParams.computeIfAbsent(viewParam.getName(), k 
> -> new ArrayList<>(3));
>     params.add(viewParam.getValue());
> }{code}
> Rest of implementation is irrelevant.
> What do you think about changing order of command like that ->
> {code:java}
>      onChild("view-param", n, (cn) -> {
>                 ViewParamImpl vp = new ViewParamImpl();
>                
>                 onChild("name", cn, (ccn) -> { 
> vp.setName(ccn.getTextContent()); });
>                 onChild("value", cn, (ccn) -> { 
> vp.setValue(ccn.getTextContent()); });
>                  r.addViewParam(vp); // moved down
>             });
> {code}
> same, with redirect-param .. and maybe others ..
>  
> Issue 2. - empty value in view-param parameter
> As is seen in example above, we need to pass empty value to view-param. But 
> method getTextContent returns null as a value.
> After that, NPE is throwed:
> {noformat}
> java.lang.NullPointerException: null
>       at java.net.URLEncoder.encode(URLEncoder.java:204)
>       at 
> org.apache.myfaces.context.servlet.ServletExternalContextImpl.encodeURL(ServletExternalContextImpl.java:990)
>       at 
> org.apache.myfaces.context.servlet.ServletExternalContextImpl.encodeRedirectURL(ServletExternalContextImpl.java:455)
>       at 
> javax.faces.context.ExternalContextWrapper.encodeRedirectURL(ExternalContextWrapper.java:101)
>       at 
> javax.faces.context.ExternalContextWrapper.encodeRedirectURL(ExternalContextWrapper.java:101)
>       at 
> org.apache.myfaces.application.ViewHandlerImpl.getRedirectURL(ViewHandlerImpl.java:175)
>       at 
> javax.faces.application.ViewHandlerWrapper.getRedirectURL(ViewHandlerWrapper.java:142)
>       at 
> org.apache.webbeans.jsf.ConversationAwareViewHandler.getRedirectURL(ConversationAwareViewHandler.java:89)
>       at 
> javax.faces.application.ViewHandlerWrapper.getRedirectURL(ViewHandlerWrapper.java:142){noformat}
>  Is it possible to pass empty value somehow?
> Thanks
> Milan Siebenbürger 
>  
>  
>  



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to