2017-06-08 5 views
0

Ich möchte eine gemeinsame Methode @ModelAttribute in einer abstrakten Klasse aber mit Wert von Unterklassen annotiert haben. Das endgültige Ziel besteht darin, den Wert einer Variablen in JSP abzurufen. Der Wert ist in jedem Unterklassen-Controller unterschiedlich, aber ich möchte die @ModelAttribute-Methode nicht duplizieren.ModelAttribute in abstrakten Klasse mit Wert aus der Unterklasse

Die abstrakte Klasse

public abstract class BaseController { 

    protected String PATH = ""; 

    public void setPATH(String inPath) { 
     PATH = inPath; 
    } 

    @PostConstruct 
    private void init() { 
     setPATH(PATH);  
    } 

    @ModelAttribute("controllerPath") 
    public String getControllerPath() { 
     return PATH; 
    } 
} 

Die sublass, ein Controller

@Controller 
@RequestMapping(OneController.PATH) 
public class OneController extends BaseController { 

    protected static final String PATH = "/one"; 

    public OneController() { 
     setPATH(PATH);  
    } 
} 

JSP

Value for controllerPath: ${controllerPath} 

Der Wert von $ {} controllerPath 4.0.9 mit Frühling Version immer leer ist .RELEASE funktioniert aber mit der Spring-Version 3.1.2.RELEASE (der Wert wird mit dem Wert vom Unterklassen-Controller gesetzt). Wie aktualisiere ich meinen Code, um mit Spring 4 zu arbeiten?

+0

Warum Sie anrufen 'setPath' wieder von' @ PostConstruct' Methode? Sie rufen es vom Konstruktor ... –

+0

Sie richtig. Es ist nicht nötig. – BasicCoder

Antwort

0

Sie müssen abstract die ModelAttribute-Methode in Ihrem abstrakten Controller deklarieren.

public abstract class BaseController { 

    protected String PATH = ""; 

    public void setPATH(String inPath) { 
     PATH = inPath; 
    } 

    @PostConstruct 
    private void init() { 
     setPATH(PATH);  
    } 

    @ModelAttribute("controllerPath") 
    public abstract String getControllerPath(); 
} 

Und auf jedem Controller, die die abstrakte Controller erweitert:

@Controller 
@RequestMapping(OneController.PATH) 
public class OneController extends BaseController { 

    protected static final String PATH = "/one"; 

    @Override 
    public String getControllerPath(){ 
     return PATH; 
    } 
} 

UPDATE:

Wenn Sie nicht die neue Methode in allen Controllern wiederholen möchten:

In Ihr abstrakter Controller

@ModelAttribute("controllerPath") 
public String getControllerPath(){ 
    return ""; 
} 

Wo Sie den Wert überschreiben möchten. In Aufschalten Anmerkung

@Override 
public String getControllerPath(){ 
    return PATH; 
} 
+0

Ok, aber ich möchte nicht die Methode getControllerPath() in jedem Controller wiederholen. Es geht auch anders ? – BasicCoder

+0

@BasicCoder Ich habe meine Antwort aktualisiert, aber behalte deinen Originalcode und setze Override in der Methode – cralfaro

+0

@BasicCoder hast du Zeit es zu verifizieren ?? – cralfaro

Verwandte Themen