【问题标题】:batch admin console - DispatcherServlet using InternalResourceViewResolver instead of FreeMarkerViewResolver批处理管理控制台 - DispatcherServlet 使用 InternalResourceViewResolver 而不是 FreeMarkerViewResolver
【发布时间】:2014-07-15 20:00:27
【问题描述】:

我在将 Spring Batch 管理控制台集成到我的应用程序时遇到了问题。

好消息是,当我转到 http://mymachine.com:8080/ReportingManager/batch/configuration 时,我可以进入管理控制台。

但是当我转到 http://mymachine.com:8080/ReportingManager/batch/job-configuration 时,我得到一个 404 和一个错误,说 /batch/jobs 找不到。

我刚刚完成了比较我的应用程序日志和我知道正在运行的 spring-batch-admin-sample 应用程序之间的 org.springframework.web 日志输出差异的练习。

查看日志后,似乎可以找到 Spring Batch 管理控制台的 URL 映射,但 DispatcherServlet 正在尝试使用 InternalResourceViewResolver 而不是 FreeMarkerViewResolver

下面我的应用程序日志显示错误的 ViewResolver 正在用于 /ReportingManager/batch/jobs...

    2014-05-27 20:16:22,770 DEBUG [DispatcherServlet] - DispatcherServlet with name 'Batch Servlet' processing GET request for [/ReportingManager/batch/jobs]
    2014-05-27 20:16:22,770 DEBUG [RequestMappingHandlerMapping] - Looking up handler method for path /jobs
    2014-05-27 20:16:22,770 DEBUG [RequestMappingHandlerMapping] - Returning handler method [public void org.springframework.batch.admin.web.JobController.jobs(org.springframework.ui.ModelMap,int,int)]
    2014-05-27 20:16:22,770 DEBUG [DispatcherServlet] - Last-Modified value for [/ReportingManager/batch/jobs] is: -1
    2014-05-27 20:16:23,598 DEBUG [DispatcherServlet] - Rendering view [org.springframework.web.servlet.view.JstlView: name 'jobs'; URL [/WEB-INF/pages/jobs.jsp]] in DispatcherServlet with name 'Batch Servlet'
    2014-05-27 20:16:23,598 DEBUG [JstlView] - Added model object 'endJob' of type [java.lang.Integer] to request in view with name 'jobs'
    2014-05-27 20:16:23,598 DEBUG [JstlView] - Added model object 'jobs' of type [java.util.ArrayList] to request in view with name 'jobs'
    2014-05-27 20:16:23,598 DEBUG [JstlView] - Added model object 'startJob' of type [java.lang.Integer] to request in view with name 'jobs'
    2014-05-27 20:16:23,598 DEBUG [JstlView] - Added model object 'totalJobs' of type [java.lang.Integer] to request in view with name 'jobs'
    2014-05-27 20:16:23,598 DEBUG [JstlView] - Added model object 'jobName' of type [java.lang.String] to request in view with name 'jobs'
    2014-05-27 20:16:23,598 DEBUG [JstlView] - Forwarding to resource [/WEB-INF/pages/jobs.jsp] in InternalResourceView 'jobs'
    2014-05-27 20:16:23,598 DEBUG [DispatcherServlet] - Successfully completed request

而当我查看 spring-batch-admin-sample 的 long 时,我可以看到 /spring_admin_console/jobs 正在使用 AjaxFreeMarkerView...

[5/27/14 19:57:13:962 EST] 00000023 SystemOut     O 19:57:13,950 DEBUG WebContainer : 0 servlet.DispatcherServlet:693 - DispatcherServlet with name 'Batch Servlet' processing GET request for [/s
pring_admin_console/jobs]
[5/27/14 19:57:13:978 EST] 00000023 SystemOut     O 19:57:13,965 DEBUG WebContainer : 0 annotation.DefaultAnnotationHandlerMapping:221 - Mapping [/jobs] to HandlerExecutionChain with handler [or
g.springframework.batch.admin.web.JobController@52e052e0] and 3 interceptors
[5/27/14 19:57:14:000 EST] 00000023 SystemOut     O 19:57:13,988 DEBUG WebContainer : 0 servlet.DispatcherServlet:769 - Last-Modified value for [/spring_admin_console/jobs] is: -1
[5/27/14 19:57:14:045 EST] 00000023 SystemOut     O 19:57:14,031 DEBUG WebContainer : 0 support.HandlerMethodInvoker:155 - Invoking model attribute method: public java.lang.String org.spring
framework.batch.admin.web.JobController.getJobName(javax.servlet.http.HttpServletRequest)
[5/27/14 19:57:14:091 EST] 00000023 SystemOut     O 19:57:14,078 DEBUG WebContainer : 0 support.HandlerMethodInvoker:173 - Invoking request handler method: public void org.springframework.batch.admin.web.JobController.jobs(org.springframework.ui.ModelMap,int,int)
[5/27/14 19:57:14:125 EST] 00000023 SystemOut     O 19:57:14,113 DEBUG WebContainer : 0 servlet.DispatcherServlet:1045 - Rendering view org.springframework.batch.admin.web.freemarker.AjaxFreeMarkerView: name 'jobs'; URL [/layouts/html/standard.ftl]] in DispatcherServlet with name 'Batch Servlet'
[5/27/14 19:57:14:144 EST] 00000023 SystemOut     O 19:57:14,130 DEBUG WebContainer : 0 freemarker.AjaxFreeMarkerView:328 - Added model object 'springMacroRequestContext' of type [org.springframework.web.servlet.support.RequestContext] to request in view with name 'jobs'
[5/27/14 19:57:14:158 EST] 00000023 SystemOut     O 19:57:14,144 DEBUG WebContainer : 0 freemarker.AjaxFreeMarkerView:328 - Added model object 'startJob' of type [java.lang.Integer] to request i
n view with name 'jobs'
[5/27/14 19:57:14:172 EST] 00000023 SystemOut     O 19:57:14,159 DEBUG WebContainer : 0 freemarker.AjaxFreeMarkerView:328 - Added model object 'totalJobs' of type [java.lang.Integer] to request
in view with name 'jobs'
[5/27/14 19:57:14:186 EST] 00000023 SystemOut     O 19:57:14,172 DEBUG WebContainer : 0 freemarker.AjaxFreeMarkerView:328 - Added model object 'servletPath' of type [java.lang.String] to request
 in view with name 'jobs'
[5/27/14 19:57:14:200 EST] 00000023 SystemOut     O 19:57:14,186 DEBUG WebContainer : 0 freemarker.AjaxFreeMarkerView:328 - Added model object 'jobName' of type [java.lang.String] to request in
view with name 'jobs'
[5/27/14 19:57:14:214 EST] 00000023 SystemOut     O 19:57:14,200 DEBUG WebContainer : 0 freemarker.AjaxFreeMarkerView:328 - Added model object 'jobs' of type [java.util.ArrayList] to request in
view with name 'jobs'
[5/27/14 19:57:14:228 EST] 00000023 SystemOut     O 19:57:14,214 DEBUG WebContainer : 0 freemarker.AjaxFreeMarkerView:328 - Added model object 'titleText' of type [java.lang.String] to request i
n view with name 'jobs'
[5/27/14 19:57:14:242 EST] 00000023 SystemOut     O 19:57:14,228 DEBUG WebContainer : 0 freemarker.AjaxFreeMarkerView:328 - Added model object 'titleCode' of type [java.lang.String] to request i
n view with name 'jobs'
[5/27/14 19:57:14:255 EST] 00000023 SystemOut     O 19:57:14,242 DEBUG WebContainer : 0 freemarker.AjaxFreeMarkerView:328 - Added model object 'endJob' of type [java.lang.Integer] to request in
view with name 'jobs'
[5/27/14 19:57:14:269 EST] 00000023 SystemOut     O 19:57:14,256 DEBUG WebContainer : 0 freemarker.AjaxFreeMarkerView:328 - Added model object 'body' of type [java.lang.String] to request in vie
w with name 'jobs'
[5/27/14 19:57:14:287 EST] 00000023 SystemOut     O 19:57:14,274 DEBUG WebContainer : 0 freemarker.AjaxFreeMarkerView:279 - Rendering FreeMarker template [/layouts/html/standard.ftl] in FreeMark
erView 'jobs'
[5/27/14 19:57:14:909 EST] 00000023 SystemOut     O 19:57:14,895 DEBUG WebContainer : 0 servlet.DispatcherServlet:674 - Successfully completed request

我花了一段时间试图找出正在发生的事情,但不确定。我怀疑我的 web.xml 可能做错了什么。可能与 servlet 的顺序有关。

我将发布我的 web.xml 的摘录,希望有人能看到我做错了什么。

提前感谢您帮我看看这个。

我已经把我的 web.xml 放在这里了。

http://pastebin.com/eBkHMe8g

【问题讨论】:

    标签: spring spring-mvc spring-batch spring-batch-admin


    【解决方案1】:

    确保在您的 Web 项目中具有以下文件夹结构:WEB-INF\classes\META-INF\spring\batch\override。并在此文件夹下创建一个新的 .xml 文件。将其命名为您想要的任何名称。文件的内容应该是这样的:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    
        <bean id="resourceService" class="org.springframework.batch.admin.web.resources.DefaultResourceService">
            <property name="servletPath" value="/batch" />
        </bean>
    </beans>
    

    servletPath 的值需要与web.xml 中的servlet-mapping 匹配。我使用了/batch,因为这是你的。

    更多关于这个here。此外,查看Spring Batch Admin source code 确实有帮助。在那个resources-context.xml 中,您可以看到某个SPeL 表达式用于各种servletPath 资源:&lt;prop key="servletPath"&gt;#{resourceService.servletPath}&lt;/prop&gt;。您需要搜索名为 resourceService 的 bean,查看 its source code,然后您可以在自定义 .xml 文件中为 DefaultResourceService 确定要更改的属性。

    稍后编辑:作为一般建议,您的mvc-dispatcher DispatcherServlet 会自动拾取,默认情况下位于/WEB-INF/mvc-dispatcher-servlet.xml 的文件。您将在两个不同的应用程序上下文中拾取并加载 mvc-dispatcher-servlet.xml 下的 bean 两次,因为您将此文件指定为 contextConfigLocation 值之一。那里有一个上下文层次结构,根(由contextConfigLocation 定义)是父级。这个想法是将非 Web(或将由 Web 使用)的 bean 放置在根上下文中,并且 Web 能够“使用”这些 bean。其他方式不太有意义,因为 DAO 或服务类不需要访问网络。

    【讨论】:

    • 您好,感谢您的帮助。真的很纠结这个。我已经将您建议的内容准确地落实到位,并且得到了上面收到的结果。我刚刚比较了示例批处理管理项目和我自己的调试输出。它们不一样。我会在上面发布,因为它可能会有所帮助。
    • 另外,我尝试采纳您的建议并在 DefaultResourceService 上设置一个断点,以尝试查看发生了什么,但不幸的是,调试器由于某种原因并未停止该类。
    • 对于我的测试,我使用了本地构建的 Spring Batch Admin 1.2.1。在我的 web 应用程序中,我放置在 WEB-INF/libspring-batch-admin-manager-1.2.1.RELEASE.jarspring-batch-admin-resources-1.2.1.RELEASE.jar 和所有依赖的 jars 下(Spring Batch、Integration、commons 等等)。在web.xml 中,我还添加了shallowEtagHeaderFilterhiddenHttpMethodFilter 及其对相同/batch/* 的映射。在WEB-INF\classes 下,我还拥有来自示例管理员的初始化属性文件(batch-default.propertiesbatch-hsql.propertiesbusiness-schema-hsqldb.sqllog4j 配置)。
    • 请问你为batch.remote.base.url设置了什么?
    • 没碰过:batch.remote.base.url=http://localhost:8080/spring-batch-admin-sample
    猜你喜欢
    • 2011-12-30
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多