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 以某种方式调用的两个方法 setDefaultResourcessetJsonResources,它们不是接口方法。

我也不知道 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 映射。