2017-06-08 1 views
0

Je souhaite avoir une méthode commune annotée @ModelAttribute dans une classe abstraite mais avec une valeur provenant de sous-classes. L'objectif final est de récupérer la valeur d'une variable dans JSP. La valeur est différente dans chaque contrôleur de sous-classe, mais je ne souhaite pas dupliquer la méthode @ModelAttribute.ModelAttribute dans la classe abstract avec la valeur de la sous-classe

La classe abstraite

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

Le sublass, un contrôleur

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

    protected static final String PATH = "/one"; 

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

JSP

Value for controllerPath: ${controllerPath} 

La valeur de $ {} controllerPath est toujours vide avec la version Spring 4.0.9 .RELEASE mais fonctionne (la valeur est définie avec la valeur du contrôleur de sous-classe) avec Spring version 3.1.2.RELEASE. Comment mettre à jour mon code pour fonctionner avec Spring 4?

+0

Pourquoi vous appelez 'setPath' à nouveau de méthode' @ PostConstruct'? Vous l'appelez du constructeur ... –

+0

Vous avez raison. Ce n'est pas nécessaire. – BasicCoder

Répondre

0

Vous devez déclarer la méthode ModelAttribute abstraite dans votre contrôleur abstrait.

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

Et sur chaque contrôleur qui étend le contrôleur abstrait:

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

    protected static final String PATH = "/one"; 

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

MISE À JOUR:

Si vous ne voulez pas répéter la nouvelle méthode dans tous les contrôleurs:

En votre contrôleur abstrait

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

Où vous souhaitez remplacer la valeur. Ajouter Remplacer annotation

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

Ok, mais je ne veux pas répéter la méthode getControllerPath() dans chaque contrôleur. Il y a un autre moyen? – BasicCoder

+0

@BasicCoder J'ai mis à jour ma réponse, mais garder bassement votre code d'origine et ajouter Override dans la méthode – cralfaro

+0

@BasicCoder avez-vous eu le temps de le vérifier ?? – cralfaro