2017-06-08 8 views
0

抽象クラスで@ModelAttributeという名前の共通メソッドを持ちたいが、サブクラスから値を取得したい。最終的な目標は、JSPで変数の値を取得することです。値は各サブクラスコントローラで異なりますが、@ModelAttributeメソッドを複製したくありません。サブクラスの値を持つ抽象クラスのModelAttribute

抽象クラス

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

sublass、コントローラ

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

    protected static final String PATH = "/one"; 

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

JSP

Value for controllerPath: ${controllerPath} 

$ {controllerPath}の値は、常にスプリングバージョン4.0.9と空であります.RELEASEしかし、Springバージョン3.1.2.RELEASEで動作します(値はサブクラスコントローラからの値で設定されます)。 Spring 4で動作するようにコードを更新するにはどうすればよいですか?

+0

なぜあなたが呼び出している 'setPath'再び' @ PostConstruct'方法から?あなたはコンストラクタからそれを呼び出しています... –

+0

そうです。それは必要はありません。 – BasicCoder

答えて

0

抽象的なModelAttributeメソッドを抽象コントローラで宣言する必要があります。

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

と抽象コントローラを拡張し、各コントローラ上の

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

    protected static final String PATH = "/one"; 

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

UPDATE:

あなたはすべてのコントローラに新しいメソッドを繰り返したいいけない場合:

であなたの抽象的なコントローラ

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

値を上書きする場所。 オーバーライド注釈の追加

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

しかし、各コントローラでgetControllerPath()メソッドを繰り返す必要はありません。別の方法がありますか? – BasicCoder

+0

@BasicCoder私は自分のレスポンスを更新しましたが、元のコードをそのまま保存し、メソッドにオーバーライドを追加しました。 – cralfaro

+0

@BasicCoderあなたはそれを確認する時間がありましたか? – cralfaro

関連する問題