javastruts2weblogicstrutsfreemarker

Struts 2 to Struts 6 Migration


Struts 2.5.34 to Struts 6.3 Migration

We've our application currently in struts 2.5.3 version. As Apache announced EOL for this, we are upgrading to Struts 6 (6.3 to be exact) using official migration guide https://cwiki.apache.org/confluence/display/WW/Struts+2.5+to+6.0.0+migration.

By doing so, we're facing below issue. Is there anybody who faced the same issue and can help maybe?

Additional note: I believe its struts tag not being identified by the new servlet. Meaning to say that whenever we use a struts tag in our .jsp, the below exception is throw. If we use normal form, the jsp is rendered well.

enter image description here

[23:05:57,539] DEBUG (com.opensymphony.xwork2.security.DefaultAcceptedPatternsChecker:104) [[ACTIVE] ExecuteThread: '24' for queue: 'weblogic.kernel.Default (self-tuning)'] - Sets accepted patterns to [[\w+((\.\w+)|(\[\d+])|(\(\d+\))|(\['(\w-?|[\u4e00-\u9fa5]-?)+'])|(\('(\w-?|[\u4e00-\u9fa5]-?)+'\)))*]], note this impacts the safety of your application!
[23:05:57,540] DEBUG (org.apache.struts2.url.StrutsUrlEncoder:38) [[ACTIVE] ExecuteThread: '24' for queue: 'weblogic.kernel.Default (self-tuning)'] - Using default encoding: UTF-8
[23:05:57,540] DEBUG (org.apache.struts2.dispatcher.DefaultStaticContentLoader:98) [[ACTIVE] ExecuteThread: '24' for queue: 'weblogic.kernel.Default (self-tuning)'] - "struts.ui.staticContentPath" has been set to "/static"
[23:05:57,545] DEBUG (org.apache.struts2.url.StrutsUrlDecoder:39) [[ACTIVE] ExecuteThread: '24' for queue: 'weblogic.kernel.Default (self-tuning)'] - Using default encoding: UTF-8
[23:05:57,548] DEBUG (com.opensymphony.xwork2.conversion.impl.InstantiatingNullHandler:98) [[ACTIVE] ExecuteThread: '24' for queue: 'weblogic.kernel.Default (self-tuning)'] - Entering nullPropertyValue [target={}, property=theme]
[23:05:57,550] DEBUG (com.opensymphony.xwork2.conversion.impl.XWorkConverter:406) [[ACTIVE] ExecuteThread: '24' for queue: 'weblogic.kernel.Default (self-tuning)'] - Retrieving convert for class [class com.opensymphony.xwork2.util.CompoundRoot] and property [null]
[23:05:57,550] DEBUG (com.opensymphony.xwork2.conversion.impl.XWorkConverter:286) [[ACTIVE] ExecuteThread: '24' for queue: 'weblogic.kernel.Default (self-tuning)'] - field-level type converter for property [null] = none found
[23:05:57,551] DEBUG (com.opensymphony.xwork2.conversion.impl.XWorkConverter:309) [[ACTIVE] ExecuteThread: '24' for queue: 'weblogic.kernel.Default (self-tuning)'] - global-level type converter for property [null] = none found
[23:05:57,551] DEBUG (com.opensymphony.xwork2.conversion.impl.XWorkConverter:326) [[ACTIVE] ExecuteThread: '24' for queue: 'weblogic.kernel.Default (self-tuning)'] - Falling back to default type converter [com.opensymphony.xwork2.conversion.impl.XWorkBasicConverter@7f6670f8]
[23:05:57,551] DEBUG (com.opensymphony.xwork2.conversion.impl.XWorkConverter:309) [[ACTIVE] ExecuteThread: '24' for queue: 'weblogic.kernel.Default (self-tuning)'] - global-level type converter for property [null] = none found
[23:05:57,551] DEBUG (com.opensymphony.xwork2.conversion.impl.XWorkConverter:326) [[ACTIVE] ExecuteThread: '24' for queue: 'weblogic.kernel.Default (self-tuning)'] - Falling back to default type converter [com.opensymphony.xwork2.conversion.impl.XWorkBasicConverter@7f6670f8]
[23:05:57,553] DEBUG (com.opensymphony.xwork2.conversion.impl.InstantiatingNullHandler:98) [[ACTIVE] ExecuteThread: '24' for queue: 'weblogic.kernel.Default (self-tuning)'] - Entering nullPropertyValue [target={}, property=templateDir]
[23:05:57,553] DEBUG (com.opensymphony.xwork2.conversion.impl.XWorkConverter:406) [[ACTIVE] ExecuteThread: '24' for queue: 'weblogic.kernel.Default (self-tuning)'] - Retrieving convert for class [class com.opensymphony.xwork2.util.CompoundRoot] and property [null]
[23:05:57,553] DEBUG (com.opensymphony.xwork2.conversion.impl.XWorkConverter:286) [[ACTIVE] ExecuteThread: '24' for queue: 'weblogic.kernel.Default (self-tuning)'] - field-level type converter for property [null] = none found
[23:05:57,553] DEBUG (com.opensymphony.xwork2.conversion.impl.XWorkConverter:309) [[ACTIVE] ExecuteThread: '24' for queue: 'weblogic.kernel.Default (self-tuning)'] - global-level type converter for property [null] = none found
[23:05:57,554] DEBUG (com.opensymphony.xwork2.conversion.impl.XWorkConverter:326) [[ACTIVE] ExecuteThread: '24' for queue: 'weblogic.kernel.Default (self-tuning)'] - Falling back to default type converter [com.opensymphony.xwork2.conversion.impl.XWorkBasicConverter@7f6670f8]
[23:05:57,554] DEBUG (com.opensymphony.xwork2.conversion.impl.XWorkConverter:309) [[ACTIVE] ExecuteThread: '24' for queue: 'weblogic.kernel.Default (self-tuning)'] - global-level type converter for property [null] = none found
[23:05:57,554] DEBUG (com.opensymphony.xwork2.conversion.impl.XWorkConverter:326) [[ACTIVE] ExecuteThread: '24' for queue: 'weblogic.kernel.Default (self-tuning)'] - Falling back to default type converter [com.opensymphony.xwork2.conversion.impl.XWorkBasicConverter@7f6670f8]
[23:05:57,556] ERROR (org.apache.struts2.components.ClosingUIBean:57) [[ACTIVE] ExecuteThread: '24' for queue: 'weblogic.kernel.Default (self-tuning)'] - Could not open template
java.lang.NullPointerException: null
        at org.apache.struts2.components.Component.getNamespace(Component.java:448) ~[struts2-core-6.3.0.2.jar:6.3.0.2]
        at org.apache.struts2.components.Component.determineNamespace(Component.java:433) ~[struts2-core-6.3.0.2.jar:6.3.0.2]
        at org.apache.struts2.components.ServletUrlRenderer.renderFormUrl(ServletUrlRenderer.java:140) ~[struts2-core-6.3.0.2.jar:6.3.0.2]
        at org.apache.struts2.components.Form.populateComponentHtmlId(Form.java:232) ~[struts2-core-6.3.0.2.jar:6.3.0.2]
        at org.apache.struts2.components.UIBean.evaluateParams(UIBean.java:808) ~[struts2-core-6.3.0.2.jar:6.3.0.2]
        at org.apache.struts2.components.ClosingUIBean.start(ClosingUIBean.java:53) ~[struts2-core-6.3.0.2.jar:6.3.0.2]
        at org.apache.struts2.views.jsp.ComponentTagSupport.doStartTag(ComponentTagSupport.java:54) ~[struts2-core-6.3.0.2.jar:6.3.0.2]
        at jsp_servlet._portal._jsp._login.__login._jspService(__login.java:300) ~[il1xnc/:?]
        at weblogic.servlet.jsp.JspBase.service(JspBase.java:35) ~[com.oracle.weblogic.servlet.jar:12.2.1.3]
        at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:286) ~[com.oracle.weblogic.servlet.jar:12.2.1.3]
        at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:260) ~[com.oracle.weblogic.servlet.jar:12.2.1.3]
        at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:137) ~[com.oracle.weblogic.servlet.jar:12.2.1.3]
        at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:350) ~[com.oracle.weblogic.servlet.jar:12.2.1.3]
        at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:25) ~[com.oracle.weblogic.servlet.jar:12.2.1.3]
        at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:78) ~[com.oracle.weblogic.servlet.jar:12.2.1.3]
        at org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter.handleRequest(StrutsPrepareAndExecuteFilter.java:154) ~[struts2-core-6.3.0.2.jar:6.3.0.2]
        at org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter.tryHandleRequest(StrutsPrepareAndExecuteFilter.java:140) ~[struts2-core-6.3.0.2.jar:6.3.0.2]
        at org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:128) ~[struts2-core-6.3.0.2.jar:6.3.0.2]
        at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:78) ~[com.oracle.weblogic.servlet.jar:12.2.1.3]
        at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.wrapRun(WebAppServletContext.java:3701) ~[com.oracle.weblogic.servlet.jar:12.2.1.3]
        at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3667) ~[com.oracle.weblogic.servlet.jar:12.2.1.3]
        at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:326) ~[com.oracle.weblogic.security.subject.jar:12.2.1.3]
        at weblogic.security.service.SecurityManager.runAsForUserCode(SecurityManager.java:197) ~[com.oracle.weblogic.security.subject.jar:12.2.1.3]
        at weblogic.servlet.provider.WlsSecurityProvider.runAsForUserCode(WlsSecurityProvider.java:203) ~[com.oracle.weblogic.servlet.jar:12.2.1.3]
        at weblogic.servlet.provider.WlsSubjectHandle.run(WlsSubjectHandle.java:71) ~[com.oracle.weblogic.servlet.jar:12.2.1.3]
        at weblogic.servlet.internal.WebAppServletContext.doSecuredExecute(WebAppServletContext.java:2443) ~[com.oracle.weblogic.servlet.jar:12.2.1.3]
        at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2291) ~[com.oracle.weblogic.servlet.jar:12.2.1.3]
        at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2269) ~[com.oracle.weblogic.servlet.jar:12.2.1.3]
        at weblogic.servlet.internal.ServletRequestImpl.runInternal(ServletRequestImpl.java:1703) ~[com.oracle.weblogic.servlet.jar:12.2.1.3]
        at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1663) ~[com.oracle.weblogic.servlet.jar:12.2.1.3]
        at weblogic.servlet.provider.ContainerSupportProviderImpl$WlsRequestExecutor.run(ContainerSupportProviderImpl.java:272) ~[com.oracle.weblogic.servlet.jar:12.2.1.3]
        at weblogic.invocation.ComponentInvocationContextManager._runAs(ComponentInvocationContextManager.java:352) ~[com.bea.core.utils.full.jar:12.2.1.3]
        at weblogic.invocation.ComponentInvocationContextManager.runAs(ComponentInvocationContextManager.java:337) ~[com.bea.core.utils.full.jar:12.2.1.3]
        at weblogic.work.LivePartitionUtility.doRunWorkUnderContext(LivePartitionUtility.java:57) ~[com.oracle.weblogic.work.jar:12.2.1.3]
        at weblogic.work.PartitionUtility.runWorkUnderContext(PartitionUtility.java:41) ~[com.bea.core.weblogic.workmanager.jar:12.2.1.3]
        at weblogic.work.SelfTuningWorkManagerImpl.runWorkUnderContext(SelfTuningWorkManagerImpl.java:644) ~[com.bea.core.weblogic.workmanager.jar:12.2.1.3]
        at weblogic.work.ExecuteThread.execute(ExecuteThread.java:415) ~[com.bea.core.weblogic.workmanager.jar:12.2.1.3]
        at weblogic.work.ExecuteThread.run(ExecuteThread.java:355) ~[com.bea.core.weblogic.workmanager.jar:12.2.1.3]
[23:05:57,568] DEBUG (org.apache.struts2.dispatcher.DefaultStaticContentLoader:98) [[ACTIVE] ExecuteThread: '24' for queue: 'weblogic.kernel.Default (self-tuning)'] - "struts.ui.staticContentPath" has been set to "/static"
[23:05:57,570] DEBUG (com.opensymphony.xwork2.conversion.impl.InstantiatingNullHandler:98) [[ACTIVE] ExecuteThread: '24' for queue: 'weblogic.kernel.Default (self-tuning)'] - Entering nullPropertyValue [target={}, property=theme]
[23:05:57,571] DEBUG (com.opensymphony.xwork2.conversion.impl.XWorkConverter:406) [[ACTIVE] ExecuteThread: '24' for queue: 'weblogic.kernel.Default (self-tuning)'] - Retrieving convert for class [class com.opensymphony.xwork2.util.CompoundRoot] and property [null]
[23:05:57,571] DEBUG (com.opensymphony.xwork2.conversion.impl.XWorkConverter:286) [[ACTIVE] ExecuteThread: '24' for queue: 'weblogic.kernel.Default (self-tuning)'] - field-level type converter for property [null] = none found
[23:05:57,571] DEBUG (com.opensymphony.xwork2.conversion.impl.XWorkConverter:309) [[ACTIVE] ExecuteThread: '24' for queue: 'weblogic.kernel.Default (self-tuning)'] - global-level type converter for property [null] = none found
[23:05:57,571] DEBUG (com.opensymphony.xwork2.conversion.impl.XWorkConverter:326) [[ACTIVE] ExecuteThread: '24' for queue: 'weblogic.kernel.Default (self-tuning)'] - Falling back to default type converter [com.opensymphony.xwork2.conversion.impl.XWorkBasicConverter@7f6670f8]
[23:05:57,572] DEBUG (com.opensymphony.xwork2.conversion.impl.XWorkConverter:309) [[ACTIVE] ExecuteThread: '24' for queue: 'weblogic.kernel.Default (self-tuning)'] - global-level type converter for property [null] = none found
[23:05:57,572] DEBUG (com.opensymphony.xwork2.conversion.impl.XWorkConverter:326) [[ACTIVE] ExecuteThread: '24' for queue: 'weblogic.kernel.Default (self-tuning)'] - Falling back to default type converter [com.opensymphony.xwork2.conversion.impl.XWorkBasicConverter@7f6670f8]
[23:05:57,572] DEBUG (com.opensymphony.xwork2.conversion.impl.InstantiatingNullHandler:98) [[ACTIVE] ExecuteThread: '24' for queue: 'weblogic.kernel.Default (self-tuning)'] - Entering nullPropertyValue [target={}, property=templateDir]
[23:05:57,572] DEBUG (com.opensymphony.xwork2.conversion.impl.XWorkConverter:406) [[ACTIVE] ExecuteThread: '24' for queue: 'weblogic.kernel.Default (self-tuning)'] - Retrieving convert for class [class com.opensymphony.xwork2.util.CompoundRoot] and property [null]
[23:05:57,572] DEBUG (com.opensymphony.xwork2.conversion.impl.XWorkConverter:286) [[ACTIVE] ExecuteThread: '24' for queue: 'weblogic.kernel.Default (self-tuning)'] - field-level type converter for property [null] = none found
[23:05:57,573] DEBUG (com.opensymphony.xwork2.conversion.impl.XWorkConverter:309) [[ACTIVE] ExecuteThread: '24' for queue: 'weblogic.kernel.Default (self-tuning)'] - global-level type converter for property [null] = none found
[23:05:57,573] DEBUG (com.opensymphony.xwork2.conversion.impl.XWorkConverter:326) [[ACTIVE] ExecuteThread: '24' for queue: 'weblogic.kernel.Default (self-tuning)'] - Falling back to default type converter [com.opensymphony.xwork2.conversion.impl.XWorkBasicConverter@7f6670f8]
[23:05:57,573] DEBUG (com.opensymphony.xwork2.conversion.impl.XWorkConverter:309) [[ACTIVE] ExecuteThread: '24' for queue: 'weblogic.kernel.Default (self-tuning)'] - global-level type converter for property [null] = none found
[23:05:57,573] DEBUG (com.opensymphony.xwork2.conversion.impl.XWorkConverter:326) [[ACTIVE] ExecuteThread: '24' for queue: 'weblogic.kernel.Default (self-tuning)'] - Falling back to default type converter [com.opensymphony.xwork2.conversion.impl.XWorkBasicConverter@7f6670f8]
<4 Mar, 2024 11:05:57,580 PM SGT> <Error> <HTTP> <BEA-101020> <[ServletContext@1397832529[app:osci module:/osc path:null spec-version:3.1]] Servlet failed with an Exception
java.lang.NullPointerException
        at org.apache.struts2.components.UIBean.evaluateParams(UIBean.java:816)
        at org.apache.struts2.components.UIBean.end(UIBean.java:550)
        at org.apache.struts2.views.jsp.ComponentTagSupport.doEndTag(ComponentTagSupport.java:40)
        at jsp_servlet._portal._jsp._login.__login._jsp__tag2(__login.java:435)
        at jsp_servlet._portal._jsp._login.__login._jspService(__login.java:357)
        Truncated. see log file for complete stacktrace
>

P.S Following libs are being used

enter image description here


Solution

  • The reported issue got resolved when I provided namespace in my s:form tag. I've defined the namespace in my struts.xml but it wasn't able to pick up namespace from there hence throwing nullPointerException. The reason I'm putting namespace="" (i.e., empty) here is I do not want my interceptor to append anything with my action as this namespace will be appended in final action URL.

    enter image description here