具有子类值的抽象类中的ModelAttribute

时间:2017-06-08 12:11:32

标签: java jsp spring-mvc spring-annotations

我希望在抽象类中使用一个公共方法注释@ModelAttribute但是从子类中获取值。最终目标是在JSP中检索变量的值。每个子类控制器的值都不同,但我不想复制@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;
    }   
}

子类,控制器

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

    protected static final String PATH = "/one";

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

JSP

Value for controllerPath: ${controllerPath}

使用Spring版本4.0.9.RELEASE,$ {controllerPath}的值始终为空,但使用Spring版本3.1.2.RELEASE工作(该值使用子类控制器中的值设置)。 如何更新我的代码以使用Spring 4?

1 个答案:

答案 0 :(得分:1)

您需要在抽象控制器中声明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;
    }
}

<强>更新

如果您不想在所有控制器中重复新方法:

在你的抽象控制器中

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

您要覆盖该值的位置。添加覆盖注释

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