-1

В настоящее время я пытаюсь расширить Spring Batch Admin для корпоративного проекта. У меня есть базовая настройка SBA, встроенная в мой проект, но я хотел добавить некоторые новые функции. Функция, которую я пытаюсь добавить, это тот, который я нашел онлайн here. Одна вещь, с которой я столкнулся до сих пор, заключается в том, что при попытке добавить новый шаблон контроллера и ftl у модели возникают проблемы, связанные с представлением контроллера/модели.Проблемы с настройкой Spring Batch Admin с использованием Freemarker, не подбирающего атрибуты модели

Что я надеялся, что вы можете мне помочь, - это то, что дополнительные расширения необходимы для расширения SBA (относительно шаг за шагом). Я не новичок в Spring или Spring Batch, но я очень новичок в Freemarker. Кажется, есть некоторая путаница в том, как Freemarker получает атрибуты от моего контроллера при передаче модели.

Пока у меня есть шаблон ftl, который я хочу использовать (который выбирает из стандартного шаблона для SBA). Это в основном модифицированная версия одного из файлов FTL по умолчанию, найденного в весенне-периодического админ-manager.jar:

<#import "/spring.ftl" as spring /> 
<@spring.bind "model"/> 
<div id="job-triggers"> 

<h2>${MODEL_ATTRIBUTE_SEARCH_RESULT_MESSAGE}</h2> 

<p/> 

<#if fireTimes??> 
    <table title="Future Job Executions" 
      class="bordered-table"> 
     <tr> 
      <th>Job Name</th> 
      <th>Date</th> 
     </tr> 
     <#list fireTimes as execution> 
      <#if execution_index % 2 == 0> 
       <#assign rowClass="name-sublevel1-even" /> 
      <#else> 
       <#assign rowClass="name-sublevel1-odd" /> 
      </#if> 
      <tr class="${rowClass}"> 
       <#assign execution_url><@spring.url relativeUrl="${servletPath}/jobs/${execution.jobName?c}"/></#assign> 
       <td>${execution.jobName}</td> 
       <td>${execution.date}</td> 
      </tr> 
     </#list> 
    </table> 
    <#if startJobExecution??> 
     <ul class="controlLinks"> 
      <#assign executions_url><@spring.url relativeUrl="${servletPath}/jobs/executions"/></#assign> 
      <li>Rows: ${startJobExecution}-${endJobExecution} of ${totalJobExecutions}</li> 
      <#if nextJobExecution??><li><a href="${executions_url}?startJobExecution=${nextJobExecution?c}&pageSize=${pageSize!30}">Next</a></li></#if> 
      <#if previousJobExecution??><li><a href="${executions_url}?startJobExecution=${previousJobExecution?c}&pageSize=${pageSize!30}">Previous</a></li></#if> 
      <!-- TODO: enable pageSize editing --> 
      <li>Page Size: ${pageSize!30}</li> 
     </ul> 
    </#if> 
</#if> 

Тогда у меня есть контроллер, который имеет параметр ModelMap на запрос GET к которому я помещал различные атрибуты с model.addAttribute («SomeName», SomeObject):

@RequestMapping(value = "/", method = RequestMethod.GET) 
public String index(@ModelAttribute("model") ModelMap model) throws SchedulerException, ParseException { 

    Scheduler scheduler = appCtx.getBean(SchedulerFactoryBean.class).getObject(); 
    Calendar cal = Calendar.getInstance(); 
    Date from = cal.getTime(); 
    cal.add(Calendar.DATE, 1); 
    Date to = cal.getTime(); 

    List<FireTime> fireTimes = getFiretimesForTriggers(scheduler, from, to); 
    Collections.sort(fireTimes); 
    model.addAttribute("fireTimes", fireTimes); 

    if(fireTimes.isEmpty()) { 
     model.addAttribute(MODEL_ATTRIBUTE_SEARCH_RESULT_MESSAGE,"No firetimes found between " + DATE_FORMAT.format(from) + " and " + DATE_FORMAT.format(to)); 
    } else { 
     model.addAttribute(MODEL_ATTRIBUTE_SEARCH_RESULT_MESSAGE, fireTimes.size() + " firetimes found between" + DATE_FORMAT.format(from) + " and " + DATE_FORMAT.format(to)); 
    } 
    return INDEX_VIEW; 
} 

кроме этих двух файлов, я на самом деле не имеют никакой дополнительной настройки для определения нового вида в за исключением my servlet-config.xml:

<import resource="classpath:/applicationContext.xml"/> 
<import resource="classpath*:/META-INF/spring/batch/servlet/resources/*.xml" /> 
<import resource="classpath*:/META-INF/spring/batch/servlet/manager/*.xml" /> 

<context:component-scan base-package="com.basepackage.where.my.controller.components.are" /> 

<bean name="firetimesView" parent="standard"> 
    <property name="attributes"> 
     <props merge="true"> 
      <prop key="body">/firetimesView.ftl</prop> 
      <prop key="titleCode">fire.times.title</prop> 
      <prop key="titleText">Fire Times</prop> 
     </props> 
    </property> 
</bean> 

Проблема, которую я имею что Freemarker дает ошибку, что упомянутые компоненты модели являются недействительными ссылками:

freemarker.core.InvalidReferenceException: Expression MODEL_ATTRIBUTE_SEARCH_RESULT_MESSAGE is undefined on line 5, column 11 in firetimesView.ftl. 
freemarker.core.TemplateObject.assertNonNull(TemplateObject.java:124) 
freemarker.core.Expression.getStringValue(Expression.java:118) 
freemarker.core.Expression.getStringValue(Expression.java:93) 
freemarker.core.DollarVariable.accept(DollarVariable.java:76) 
freemarker.core.Environment.visit(Environment.java:209) 
freemarker.core.MixedContent.accept(MixedContent.java:92) 
freemarker.core.Environment.visit(Environment.java:209) 
freemarker.core.Environment.include(Environment.java:1482) 
freemarker.core.Include.accept(Include.java:169) 
freemarker.core.Environment.visit(Environment.java:209) 
freemarker.core.MixedContent.accept(MixedContent.java:92) 
freemarker.core.Environment.visit(Environment.java:209) 
freemarker.core.Environment.process(Environment.java:189) 
freemarker.template.Template.process(Template.java:237) 
org.springframework.web.servlet.view.freemarker.FreeMarkerView.processTemplate(FreeMarkerView.java:366) 
org.springframework.web.servlet.view.freemarker.FreeMarkerView.doRender(FreeMarkerView.java:283) 
org.springframework.web.servlet.view.freemarker.FreeMarkerView.renderMergedTemplateModel(FreeMarkerView.java:233) 
org.springframework.batch.admin.web.freemarker.AjaxFreeMarkerView.renderMergedTemplateModel(AjaxFreeMarkerView.java:107) 
org.springframework.web.servlet.view.AbstractTemplateView.renderMergedOutputModel(AbstractTemplateView.java:167) 
org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:263) 
org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1208) 
org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:992) 
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:939) 
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856) 
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936) 
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:827) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:734) 
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:847) 
org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77) 
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
org.springframework.web.filter.ShallowEtagHeaderFilter.doFilterInternal(ShallowEtagHeaderFilter.java:73) 
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 

У меня также есть необходимые геттеры/сеттера, необходимых для инкубационной инъекции и доступ к переменным из Посмотреть. Любые идеи относительно того, почему Freemarker не может подобрать атрибуты, которые я добавляю к карте? Любая помощь будет оценена!

ответ

0

Поскольку вы используете ModelMap, вы можете использовать put вместо addAttribute. И, наконец, ваш код должен выглядеть следующим образом:

if(fireTimes.isEmpty()) { 
     model.put(MODEL_ATTRIBUTE_SEARCH_RESULT_MESSAGE,"No firetimes found between " + DATE_FORMAT.format(from) + " and " + DATE_FORMAT.format(to)); 
    } else { 
     model.put(MODEL_ATTRIBUTE_SEARCH_RESULT_MESSAGE, fireTimes.size() + " firetimes found between" + DATE_FORMAT.format(from) + " and " + DATE_FORMAT.format(to)); 
    } 

Если это не сработает, попробуйте сделать это Model вместо ModelMap.