2013-03-19 33 views
5

我已經搜索和搜索,並沒有發現任何說這是不可能的,也沒有任何解釋如何做到這一點。Spring MVC:從基本控制器重定向 - 如何獲取重定向到的路徑?

如果您有一個擴展的基礎控制器,我明白請求映射的方法也是繼承的。

因此,與....

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 
{ 
.... 
} 

...將繼承的方法在/管理員收聽/你好,返回你好視圖。

這很好。

但是,如果我有一個重定向方法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上獲取句柄?

這可能嗎?

回答

7

一個選項:

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

哇 - 「註解註解=克拉斯。 getAnnotation(RequestMapping.class);」有魔力 - 在任何地方都看不到!歡呼,太棒了!哦,是和@RequestMapping(AdminController.context)。歡呼的教訓! – n99 2013-03-20 09:18:25

+0

很高興爲你工作:) – digitaljoel 2013-03-20 15:19:22

-1

只要你什麼都不需要動我只想重定向到字符串中的requestmapping。還沒有使用重定向自己還沒有,但你的管理成功的映射將是:

return "redirect:/admin/success/"

這應該創建一個瀏覽器重定向到您的控制器與相應requestmapping。

另一種可能性是使用反射並將請求映射註釋添加到父項中。

+1

重定向發生在父類中,但它需要將子類中的上下文注入到重定向字符串中。如果抽象基類有多個實現,那麼對重定向字符串進行硬編碼是不合理的。在一種情況下,他們想要轉到/ admin/success,並且在另一個實現中他們想要轉到/ user/success。 – digitaljoel 2013-03-19 17:38:26

+0

是的。不知道爲什麼我錯過了!你的答案是一個很好的可能性。 – 2013-03-19 19:25:38

1

在春天沒有必要給相對URL像

"redirect:/admin/success/"; 

,而不是上面的代碼,直接可以給這樣的

"redirect:/success/"; 

默認情況下,將採取上下文路徑。

+0

上下文路徑和控制器請求映射雖然是不同的東西。我有興趣獲取控制器請求映射.... – n99 2013-03-21 10:27:56

1

根據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:meals重定向到http://localhost:8080/topjava/meals/meals

通過redirect:/meals重定向到http://localhost:8080/topjava/meals