在 weblogic 中部署时,Grails 无法呈现 GSP
Grails not able to render GSP when deployed in weblogic
我在将 grails (2.4.0) 项目 war 部署到 weblogic 12.1.2 时遇到问题。 war 在部署到 tomcat 时工作得很好。问题是,当 war 部署在 weblogic 中时。用户登录后,使用 LDAP 的身份验证过程也可以正常工作。接下来主页应该呈现 GSP 页面,但似乎 weblogic 无法呈现 GSP 页面。它在浏览器上抛出 404。
一旦我登录到应用程序,如果我直接在浏览器中使用任何URL,流程会转到控制器并在控制器中执行所有需要的代码但无法返回查看并呈现 "render" 块中提到的 GSP 页面。
我的控制器动作代码如下:
def index(){
log.debug("**********Reached MyHomeController**********")
MyHome myHome = new MyHome()
myHome.setMessageId(1)
myHome.setMessageText("***TEST MESSAGE***")
render (view: 'myhome')
}
我尝试使用相同的控制器操作在浏览器上呈现纯文本并且效果很好。即使在 weblogic 部署中,我也能够毫无问题地看到在浏览器上呈现的消息。
def index(){
log.debug("**********Reached MyHomeController.testCall**********")
render ("*@***Reached MyHomeController.testCall**********")
}
我已经验证了 grails 站点([此处][1])中的 weblogic 问题,并已完成那里提到的补救措施。但我认为,问题是请求正在提交给正确的控制器,但是当返回到 UI 时,weblogic 无法找到 GSP(tomcat 没有问题)。
请帮助解决部署在 weblogic 中时如何使 GSP 得到渲染。
下面是 weblogic 在浏览器上抛出 404 时日志中的异常:
不确定为什么要查找 *.jsp 文件。
:MyHomeController - **********已到达 MyHomeController************
:::: [2c5cb87d-29ad-4006-8294-4a1f355e124e] [Lokajit_Tikayatray] : OptimizedAutowireCapableBeanFactory - 返回单例 bean 的缓存实例 'groovyPagesUriService'
:::: [2c5cb87d-29ad-4006-8294-4a1f355e124e] [Lokajit_Tikayatray] : AbstractGrailsControllerHelper - 执行动作 [testCall1],结果 [null] 和视图名称 [/myHome/index]
:::: [2c5cb87d-29ad-4006-8294-4a1f355e124e] [Lokajit_Tikayatray] : AbstractGrailsControllerHelper - 操作 [testCall1] 处理,创建 Spring 模型和视图 [ModelAndView: 引用视图名称 '/myHome/myhome';模型是 {}]
:::: [2c5cb87d-29ad-4006-8294-4a1f355e124e] [Lokajit_Tikayatray] : SimpleGrailsController - [SimpleGrailsController] Forwarding model and view [ModelAndView: reference to view with name '/myHome/myhome';模型是 {}] class [/myHome/myhome]
:::: [2c5cb87d-29ad-4006-8294-4a1f355e124e] [Lokajit_Tikayatray] : CompositeInterceptor - postHandle SecurityContextHolderAwareRequestWrapper[ org.springframework.security.web.context.HttpSessionSecurityContextRepository$Servlet3SaveToSessionRequestWrapper@320c8103], org.springframework.security.web.context.HttpSessionSecurityContextRepository$ SaveToSessionResponseWrapper@52ea05a0,org.codehaus.groovy.grails.web.servlet.mvc.SimpleGrailsController@4720353f,ModelAndView:引用名称为“/myHome/myhome”的视图;模型是 {}
:::: [2c5cb87d-29ad-4006-8294-4a1f355e124e] [Lokajit_Tikayatray]:GrailsDispatcherServlet - 渲染视图[org.codehaus.groovy.grails.web.sitemesh.SitemeshLayoutView:未命名; URL [null]] 在名称为 'grails' 的 DispatcherServlet 中
::: [2c5cb87d-29ad-4006-8294-4a1f355e124e] [Lokajit_Tikayatray] : JstlView - Forwarding to resource [/WEB-INF/grails-app/views/myHome/myhome.jsp] 在 InternalResourceView 'null'
:::: [2c5cb87d-29ad-4006-8294-4a1f355e124e] [Lokajit_Tikayatray]:GrailsDispatcherServlet - 呈现视图时出错[org.codehaus.groovy.grails.web.sitemesh.SitemeshLayoutView:未命名; URL [null]] 在名称为 'grails' 的 DispatcherServlet 中
java.lang.NullPointerException
在 weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:280)
在 weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:254)
在 weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:136)
在 weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:341)
在 weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:25)
在 weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:79)
在 weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:79)
在 weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:79)
在 weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:79)
在 weblogic.servlet.internal.RequestDispatcherImpl.invokeServlet(RequestDispatcherImpl.java:574)
在 weblogic.servlet.internal.RequestDispatcherImpl.forward(RequestDispatcherImpl.java:272)
在 weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:79)
在 grails.plugin.springsecurity.web.filter.GrailsAnonymousAuthenticationFilter.doFilter(GrailsAnonymousAuthenticationFilter.java:53)
在 grails.plugin.springsecurity.web.authentication.RequestHolderAuthenticationFilter.doFilter(RequestHolderAuthenticationFilter.java:49)
在 grails.plugin.springsecurity.web.authentication.logout.MutableLogoutFilter.doFilter(MutableLogoutFilter.java:82)
在 weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:79)
在 weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:79)
在 weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:79)
在 weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:79)
在 weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.wrapRun(WebAppServletContext.java:3367)
在 weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3333)
在 weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
在 weblogic.security.service.SecurityManager.runAs(SecurityManager.java:120)
在 weblogic.servlet.provider.WlsSubjectHandle.run(WlsSubjectHandle.java:57)
在 weblogic.servlet.internal.WebAppServletContext.doSecuredExecute(WebAppServletContext.java:2220)
在 weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2146)
在 weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2124)
在 weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1564)
在 weblogic.servlet.provider.ContainerSupportProviderImpl$WlsRequestExecutor.run(ContainerSupportProviderImpl.java:254)
在 weblogic.work.ExecuteThread.execute(ExecuteThread.java:295)
在 weblogic.work.ExecuteThread.run(ExecuteThread.java:254)
最后,部署与 weblogic 一起工作,可以从一个页面正确导航到另一个页面。问题在于视图文件夹的命名约定。似乎 weblogic 需要与框架生成的 URL 完全相同(区分大小写)的视图文件夹名称。
打印日志:
转发到资源 [/WEB-INF/grails-app/views/myHome/myhome.jsp]
因此,weblogic 试图在 "myHome" 文件夹(H 大写)中找到 'myhome' GSP 文件,但我所有的视图文件夹名称都是小写的。因此,weblogic 无法在 URL 中找到 GSP。即使我将类似的 JSP 复制到所需的路径,它仍然找不到它。从日志中获取线索,我将我的视图文件夹名称更改为与 URL 完全相同的大小写并且它工作正常。 :)
Tomcat 情况不同。 Tomcat 不使用 URL 区分大小写。它在任何情况下都能找到 URL 路径。这就是为什么即使 URL 是 /myHome/** 但我的视图文件夹名称是 'myhome' 我的应用程序在 tomcat 下也能正常工作.由于 tomcat 能够正确识别 URL 路径,因此我没有想到 weblogic 将对 URL 路径进行区分大小写的搜索(直到我 运行在解决问题的所有可能选项中 :)).
我在将 grails (2.4.0) 项目 war 部署到 weblogic 12.1.2 时遇到问题。 war 在部署到 tomcat 时工作得很好。问题是,当 war 部署在 weblogic 中时。用户登录后,使用 LDAP 的身份验证过程也可以正常工作。接下来主页应该呈现 GSP 页面,但似乎 weblogic 无法呈现 GSP 页面。它在浏览器上抛出 404。
一旦我登录到应用程序,如果我直接在浏览器中使用任何URL,流程会转到控制器并在控制器中执行所有需要的代码但无法返回查看并呈现 "render" 块中提到的 GSP 页面。
我的控制器动作代码如下:
def index(){
log.debug("**********Reached MyHomeController**********")
MyHome myHome = new MyHome()
myHome.setMessageId(1)
myHome.setMessageText("***TEST MESSAGE***")
render (view: 'myhome')
}
我尝试使用相同的控制器操作在浏览器上呈现纯文本并且效果很好。即使在 weblogic 部署中,我也能够毫无问题地看到在浏览器上呈现的消息。
def index(){
log.debug("**********Reached MyHomeController.testCall**********")
render ("*@***Reached MyHomeController.testCall**********")
}
我已经验证了 grails 站点([此处][1])中的 weblogic 问题,并已完成那里提到的补救措施。但我认为,问题是请求正在提交给正确的控制器,但是当返回到 UI 时,weblogic 无法找到 GSP(tomcat 没有问题)。
请帮助解决部署在 weblogic 中时如何使 GSP 得到渲染。 下面是 weblogic 在浏览器上抛出 404 时日志中的异常: 不确定为什么要查找 *.jsp 文件。
:MyHomeController - **********已到达 MyHomeController************ :::: [2c5cb87d-29ad-4006-8294-4a1f355e124e] [Lokajit_Tikayatray] : OptimizedAutowireCapableBeanFactory - 返回单例 bean 的缓存实例 'groovyPagesUriService' :::: [2c5cb87d-29ad-4006-8294-4a1f355e124e] [Lokajit_Tikayatray] : AbstractGrailsControllerHelper - 执行动作 [testCall1],结果 [null] 和视图名称 [/myHome/index] :::: [2c5cb87d-29ad-4006-8294-4a1f355e124e] [Lokajit_Tikayatray] : AbstractGrailsControllerHelper - 操作 [testCall1] 处理,创建 Spring 模型和视图 [ModelAndView: 引用视图名称 '/myHome/myhome';模型是 {}] :::: [2c5cb87d-29ad-4006-8294-4a1f355e124e] [Lokajit_Tikayatray] : SimpleGrailsController - [SimpleGrailsController] Forwarding model and view [ModelAndView: reference to view with name '/myHome/myhome';模型是 {}] class [/myHome/myhome] :::: [2c5cb87d-29ad-4006-8294-4a1f355e124e] [Lokajit_Tikayatray] : CompositeInterceptor - postHandle SecurityContextHolderAwareRequestWrapper[ org.springframework.security.web.context.HttpSessionSecurityContextRepository$Servlet3SaveToSessionRequestWrapper@320c8103], org.springframework.security.web.context.HttpSessionSecurityContextRepository$ SaveToSessionResponseWrapper@52ea05a0,org.codehaus.groovy.grails.web.servlet.mvc.SimpleGrailsController@4720353f,ModelAndView:引用名称为“/myHome/myhome”的视图;模型是 {} :::: [2c5cb87d-29ad-4006-8294-4a1f355e124e] [Lokajit_Tikayatray]:GrailsDispatcherServlet - 渲染视图[org.codehaus.groovy.grails.web.sitemesh.SitemeshLayoutView:未命名; URL [null]] 在名称为 'grails' 的 DispatcherServlet 中 ::: [2c5cb87d-29ad-4006-8294-4a1f355e124e] [Lokajit_Tikayatray] : JstlView - Forwarding to resource [/WEB-INF/grails-app/views/myHome/myhome.jsp] 在 InternalResourceView 'null' :::: [2c5cb87d-29ad-4006-8294-4a1f355e124e] [Lokajit_Tikayatray]:GrailsDispatcherServlet - 呈现视图时出错[org.codehaus.groovy.grails.web.sitemesh.SitemeshLayoutView:未命名; URL [null]] 在名称为 'grails' 的 DispatcherServlet 中 java.lang.NullPointerException 在 weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:280) 在 weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:254) 在 weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:136) 在 weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:341) 在 weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:25) 在 weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:79) 在 weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:79) 在 weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:79) 在 weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:79) 在 weblogic.servlet.internal.RequestDispatcherImpl.invokeServlet(RequestDispatcherImpl.java:574) 在 weblogic.servlet.internal.RequestDispatcherImpl.forward(RequestDispatcherImpl.java:272) 在 weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:79) 在 grails.plugin.springsecurity.web.filter.GrailsAnonymousAuthenticationFilter.doFilter(GrailsAnonymousAuthenticationFilter.java:53) 在 grails.plugin.springsecurity.web.authentication.RequestHolderAuthenticationFilter.doFilter(RequestHolderAuthenticationFilter.java:49) 在 grails.plugin.springsecurity.web.authentication.logout.MutableLogoutFilter.doFilter(MutableLogoutFilter.java:82) 在 weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:79) 在 weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:79) 在 weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:79) 在 weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:79) 在 weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.wrapRun(WebAppServletContext.java:3367) 在 weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3333) 在 weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321) 在 weblogic.security.service.SecurityManager.runAs(SecurityManager.java:120) 在 weblogic.servlet.provider.WlsSubjectHandle.run(WlsSubjectHandle.java:57) 在 weblogic.servlet.internal.WebAppServletContext.doSecuredExecute(WebAppServletContext.java:2220) 在 weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2146) 在 weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2124) 在 weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1564) 在 weblogic.servlet.provider.ContainerSupportProviderImpl$WlsRequestExecutor.run(ContainerSupportProviderImpl.java:254) 在 weblogic.work.ExecuteThread.execute(ExecuteThread.java:295) 在 weblogic.work.ExecuteThread.run(ExecuteThread.java:254)
最后,部署与 weblogic 一起工作,可以从一个页面正确导航到另一个页面。问题在于视图文件夹的命名约定。似乎 weblogic 需要与框架生成的 URL 完全相同(区分大小写)的视图文件夹名称。
打印日志:
转发到资源 [/WEB-INF/grails-app/views/myHome/myhome.jsp]
因此,weblogic 试图在 "myHome" 文件夹(H 大写)中找到 'myhome' GSP 文件,但我所有的视图文件夹名称都是小写的。因此,weblogic 无法在 URL 中找到 GSP。即使我将类似的 JSP 复制到所需的路径,它仍然找不到它。从日志中获取线索,我将我的视图文件夹名称更改为与 URL 完全相同的大小写并且它工作正常。 :)
Tomcat 情况不同。 Tomcat 不使用 URL 区分大小写。它在任何情况下都能找到 URL 路径。这就是为什么即使 URL 是 /myHome/** 但我的视图文件夹名称是 'myhome' 我的应用程序在 tomcat 下也能正常工作.由于 tomcat 能够正确识别 URL 路径,因此我没有想到 weblogic 将对 URL 路径进行区分大小写的搜索(直到我 运行在解决问题的所有可能选项中 :)).