9

我已经搜索和搜索,没有发现任何说这是不可能的,也没有找到任何解释如何做到这一点的东西。

如果您有一个扩展的基本控制器,我知道请求映射方法也是继承的。

所以与....

public abstract class BaseController
{

    @RequestMapping(value="hello", method=RequestMethod.GET)
    public String hello(Model model) {
        return "hello-view;
}

...像这样的控制器...

@Controller
@RequestMapping("/admin/")
public abstract class AdminController
{
 ....
}

...将继承一个在 /admin/hello 上侦听的方法,该方法返回 hello-view。

这一切都很好。

但是如果我有一个重定向的 BaseController 方法:

public abstract class BaseController
{

    @RequestMapping(value="hello", method=RequestMethod.POST)
    public String hello(Model model) {
        return "redirect:/success/;
}

据我了解,重定向需要相对或绝对 URL 而不是视图名称?

那么我的 AdminController 如何确保重定向到 /admin/success/?

BaseController 方法如何在我的 AdminController 上获得类级别 @requestMapping 的句柄?

这可能吗?

4

4 回答 4

9

一种选择:

public abstract class BaseController
{
    /** get the context for the implementation controller **/
    protected abstract String getControllerContext();

    @RequestMapping(value="hello", method=RequestMethod.GET)
    public String hello(Model model) {
        return "redirect:"+getControllerContext()+"success/";
    }
}

这是管理控制器。

@Controller
@RequestMapping(AdminController.context)
public abstract class AdminController
{
    static final String context = "/admin/";
    @Override
    protected String getControllerContext() {
        return context;
    }
 ....
}

另一个涉及反射的选项可能会起作用......:

public abstract class BaseController
{
    String context = null;

    @RequestMapping(value="hello", method=RequestMethod.GET)
    public String hello(Model model) {
        return "redirect:"+getControllerContext()+"success/";
    }

    // untested code, but should get you started.
    private String getControllerContext() {
        if ( context == null ) {
            Class klass = this.getClass();
            Annotation annotation = klass.getAnnotation(RequestMapping.class);
            if ( annotation != null ) {
                context = annotation.value();
            }
        }
        return context;
    }
}
于 2013-03-19T17:17:44.453 回答
3

根据http://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/mvc.html#mvc-redirecting-redirect-prefix redirect:/myapp/some/resource将重定向相对于当前 Servlet 上下文。

我的检查:应用程序上下文是topjava,Servlet 上下文是meals,请求http://localhost:8080/topjava/meals/update?...

重定向redirect:mealshttp://localhost:8080/topjava/meals/meals

重定向redirect:/mealshttp://localhost:8080/topjava/meals

于 2015-10-21T19:18:06.537 回答
1

在 Spring 中无需提供相对 url

"redirect:/admin/success/";

而不是上面的代码,直接你可以像这样给出

"redirect:/success/";

默认情况下,它将采用上下文路径。

于 2013-03-20T12:54:57.953 回答
-1

只要您不需要任何动态的东西,我就会重定向到字符串中的请求映射。尚未使用重定向自己,但您的管理成功的映射将是:

return "redirect:/admin/success/"

这应该使用相应的请求映射创建一个浏览器重定向到您的控制器。

另一种可能性是使用反射并获取父级的请求映射注释。

于 2013-03-19T17:21:34.540 回答