2016-05-10 8 views
1

In einer Spring Batch Admin-Umgebung verwende ich eine angepasste Ansicht für "/" und "/ home". Ich brauche keine Übersicht über alle verfügbaren Endpunkte.Wie kann der HomeController im Frühjahr Batch Admin ersetzt werden

Ich möchte einige weitere Elemente zu der model hinzufügen, die für die Ansicht verwendet wird. Der Controller für die Endpunkte ist in Spring Batch Admin als org.springframework.batch.admin.web.util.HomeController (Source code) enthalten. Natürlich kann ich nicht einfach einen eigenen Controller erstellen und die Zuordnungen anfordern, da im Frühjahr keine doppelten Zuordnungen zu denselben Endpunkten erlaubt sind.

Die HomeController ist mit @Controller versehen und wird während der Initialisierung automatisch geladen.

Ich habe eine Lösung, so dass ich eine eigene Klasse im selben Paket habe, die eine höhere Priorität bekommt als die, die in Spring Batch Admin enthalten ist. Dies ist jedoch nicht, was ich bevorzuge, da es schlechtes Design IMHO ist.

Dies beinhaltet eine unerwünschte Abhängigkeit von der Implementierung einer Bibliothek. Außerdem muss ich die zwei Methoden setDefaultResources und setJsonResources implementieren, die irgendwie von Batch Admin aufgerufen werden, die keine Schnittstellenmethoden sind.

Ich weiß auch nicht, ob das Verhalten von zwei Klassen, die die gleichen sind, auch in Java gut definiert ist.

Frage: Gibt es eine einfache Möglichkeit zu vermeiden, dass der ursprüngliche Heimcontroller instanziiert wird oder eine andere Möglichkeit, mein eigenes Modell in den Controller zu injizieren?

Antwort

0

Es ist möglich, das zurückgegebene Modell zu ersetzen, wenn auf den Stamm / über einen Interceptor zugegriffen wird. Zuerst müssen wir einen eigenen Controller erstellen, der das Modell für unsere Zielseite erstellt. Es ist nicht möglich, es auf / oder /home abzubilden, da diese Zuordnungen bereits definiert sind.

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"; 
    } 
} 

Dann können wir abfangen alle / greift und ersetzen Sie das Modell entsprechend ein AsyncHandlerInterceptor mit:

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()); 
    } 
} 

In der Konfiguration der Handler injiziert wird:

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

Dies erfordert xmlns:mvc="http://www.springframework.org/schema/mvc" und http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd in der Schemadefinition.

Bei Bedarf können Sie dann die ursprüngliche Zuordnung /home über die Sicherheitskonfiguration deaktivieren.