Spring Batch Admin中的HomeController如何替换
How can the HomeController in Spring Batch Admin be replaced
在 Spring 批处理管理环境中,我为“/”和“/home”使用自定义视图。我不需要所有可用端点的概览。
我想向用于视图的 model
添加更多元素。
端点控制器作为 org.springframework.batch.admin.web.util.HomeController
(Source code) 包含在 Spring Batch Admin 中。显然我不能只创建一个自己的控制器并请求映射,因为在 Spring.
中不允许对相同端点的双重映射
HomeController
注解为@Controller
,初始化时自动加载
我有一个解决方案,我在同一个包中有一个自己的 class,它的优先级高于 Spring Batch Admin 中包含的那个。但是,这不是我喜欢的,因为恕我直言,这是糟糕的设计。
这包括对库实现的不良依赖。另外,我必须实现 Batch Admin 以某种方式调用的两个方法 setDefaultResources
和 setJsonResources
,它们不是接口方法。
我也不知道 class 两个相同的行为是否在 Java 中得到了很好的定义。
问题:有没有简单的方法可以避免原来的home controller被实例化,或者有其他方法可以将我自己的模型注入到controller中?
当通过拦截器访问根 /
时,可以替换返回的模型。首先,我们必须创建自己的控制器,为我们的着陆页创建模型。无法将其映射到 /
或 /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
映射。
在 Spring 批处理管理环境中,我为“/”和“/home”使用自定义视图。我不需要所有可用端点的概览。
我想向用于视图的 model
添加更多元素。
端点控制器作为 org.springframework.batch.admin.web.util.HomeController
(Source code) 包含在 Spring Batch Admin 中。显然我不能只创建一个自己的控制器并请求映射,因为在 Spring.
HomeController
注解为@Controller
,初始化时自动加载
我有一个解决方案,我在同一个包中有一个自己的 class,它的优先级高于 Spring Batch Admin 中包含的那个。但是,这不是我喜欢的,因为恕我直言,这是糟糕的设计。
这包括对库实现的不良依赖。另外,我必须实现 Batch Admin 以某种方式调用的两个方法 setDefaultResources
和 setJsonResources
,它们不是接口方法。
我也不知道 class 两个相同的行为是否在 Java 中得到了很好的定义。
问题:有没有简单的方法可以避免原来的home controller被实例化,或者有其他方法可以将我自己的模型注入到controller中?
当通过拦截器访问根 /
时,可以替换返回的模型。首先,我们必须创建自己的控制器,为我们的着陆页创建模型。无法将其映射到 /
或 /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
映射。