2016-05-10 2 views
1

В среде Spring Batch Admin я использую индивидуальное представление для «/» и «/ home». Мне не нужен обзор всех доступных конечных точек.Как заменить HomeController в Spring Batch Admin

Я хотел бы добавить еще несколько элементов к model, который используется для представления.

Контроллер для конечных точек включен в Spring Batch Admin как org.springframework.batch.admin.web.util.HomeController (Source code). Очевидно, я не могу просто создать собственный контроллер и запросить сопоставления, потому что двойные сопоставления с одними и теми же конечными точками не допускаются весной.

HomeController аннотируется @Controller и загружается автоматически во время инициализации.

У меня есть такое решение, что у меня есть собственный класс в том же пакете, который получает более высокий приоритет, чем тот, который содержится в Spring Batch Admin. Однако это не то, что я предпочитаю, так как это плохой дизайн IMHO.

Это включает в себя нежелательную зависимость от реализации библиотеки. Кроме того, я должен реализовать два метода: setDefaultResources и setJsonResources, которые так или иначе вызываются Batch Admin, которые не являются методами интерфейса.

Я также не знаю, хорошо ли определено поведение двух одинаковых классов в Java.

Вопрос: Есть ли простой способ избежать того, чтобы исходный контроллер дома не был создан или каким-либо другим способом вставить мою собственную модель в контроллер?

ответ

0

Можно заменить возвращенную модель, когда к корню / можно получить доступ через перехватчик. Сначала мы должны создать собственный контроллер, создающий модель для нашей целевой страницы. Невозможно сопоставить его с / или /home, поскольку эти сопоставления уже определены.

public class CustomHomeController { 

    @RequestMapping(value = { "/customHome" }, method = RequestMethod.GET) 
    public String landingPage(ModelMap model) { 
     fill(model); 

     // Here "home" refers to a view name e.g. as Freemarker template 
     return "home"; 
    } 
} 

Затем мы можем перехватить все обращения к / и заменить модель соответствующим образом с использованием AsyncHandlerInterceptor:

public class HomeInterceptor extends HandlerInterceptorAdapter { 

    /** The controller instance returning the view for the landing page. */ 
    private final CustomHomeController customHomeController; 

    @Autowired 
    public HomeInterceptor(CustomHomeController customHomeController) { 
     this.customHomeController = customHomeController; 
    } 

    /** 
    * Swaps the {@link ModelAndView} to the one returned by 
    * {@link CustomHomeController#landingPage(ModelMap) }. 
    * The controller performs no checking if the model and view is 
    * actually one for the landing page. The correct setup 
    * has to be ensured by the configuration. 
    */ 
    @Override 
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { 
     // Manually call the Controller custom home 
     // If necessary, also request can be forwarded 
     customHomeController.landingPage(modelAndView.getModelMap()); 
    } 
} 

В конфигурации обработчик впрыскивается:

<mvc:interceptors> 
    <mvc:interceptor> 
     <mvc:mapping path="/"/> 
     <bean class="com.example.HomeInterceptor"/> 
    </mvc:interceptor> 
</mvc:interceptors> 

Это требует xmlns:mvc="http://www.springframework.org/schema/mvc" и http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd в определении схемы.

При необходимости вы можете отключить исходное сопоставление /home через конфигурацию безопасности.