2016-05-10 13 views
1

Spring Batch Admin環境では、 "/"と "/ home"のカスタマイズビューを使用します。すべての利用可能なエンドポイントの概要は必要ありません。Spring Batch AdminのHomeControllerの置き換え方法

ビューに使用されるmodelにいくつかの要素を追加したいと思います。

エンドポイントのコントローラは、Spring Batch Adminにorg.springframework.batch.admin.web.util.HomeControllerSource code)として含まれています。もちろん、私は独自のコントローラを作成してマッピングを要求することはできません。なぜなら、同じエンドポイントへの二重マッピングがSpringでは許可されていないからです。

HomeControllerには@Controllerが付いており、初期化中に自動的に読み込まれます。

私は、同じパッケージにSpring Batch Adminに含まれているものよりも高い優先度を持つ独自のクラスを持っているようなソリューションを持っています。しかし、これは私がそれが悪いデザインIMHOであるので好むものではありません。

これには、ライブラリの実装に望ましくない依存が含まれます。また、私はsetDefaultResourcessetJsonResourcesの2つのメソッドを実装する必要があります。これらのメソッドは、何らかの方法でBatch Adminによって呼び出されますが、これはインターフェイスメソッドではありません。

同じ2つのクラスを持つ動作がJavaでもうまく定義されているかどうかはわかりません。

質問:元のホームコントローラがインスタンス化されないように、または自分のモデルをコントローラに注入する簡単な方法はありますか?

答えて

0

ルート/がインターセプタ経由でアクセスされたときに返されるモデルを置き換えることは可能です。まず、ランディングページのモデルを作成する独自のコントローラを作成する必要があります。これらのマッピングが既に定義されているため、/または/homeにマップすることはできません。

ハンドラが注入された構成で
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"を必要

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を使用してそれに応じたモデルを置き換える傍受することができますスキーマ定義ではhttp://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsdです。

セキュリティコンフィグレーションによって、元の/homeマッピングを無効にすることができます。

関連する問題