2013-10-30 64 views
0

我想在我的控制得到專門準備RedirectView的實例:如何在彈簧控制器中注入特殊的RedirectView?

@Controller 
public class MyController { 
    @RequestMapping(value = "/", method = GET) 
    public RedirectView myFkt(@Named("myName") RedirectView rv) { 
    return rv; 
    } 

我的配置:

@Configuration 
@EnableWebMvc 
@ComponentScan({"com.example"}) 
public class SpringServletConfig extends WebMvcConfigurerAdapter { 
    private static final Logger LOG = LoggerFactory.getLogger(WebMvcConfigurerAdapter.class); 

    @Bean(name = "myName") @Scope("request") 
    public RedirectView myName() { 
     RedirectView rv = new RedirectView("/"); 
     rv.setContextRelative(true); 
     return rv; 
    } 

} 

在控制器功能我總是得到一個未配置的RedirectView的實例,而不是一個我已配置。

+0

爲什麼不讓自定義視圖解析器處理您的特殊視圖? – Bart

回答

0

AFAIK沒有HandlerMethodArgumentResolver來解決處理程序方法中的參數@Named。你可以寫和註冊你自己的,但這是一個麻煩。

爲什麼不直接注入它作爲成員變量?

@Controller 
public class MyController { 

    @Resource("myName") 
    private RedirectView rv; 

    @RequestMapping(value = "/", method = GET) 
    public RedirectView myFkt() { 
     return rv; 
    } 
} 
0

創建重定向一個@RequestMapping並將其添加到與@ControllerAdvice註釋的控制器,將整個應用程序中使用。

0

首先更改您的bean配置,以在@Scope註釋中包含proxyMode屬性。這將使它成爲一個範圍代理,你想保留這個類型,因此需要基於類的代理(這需要cglib)。

@Bean(name = "myName") 
@Scope(value="request", proxyMode=ScopedProxyMode.TARGET_CLASS) 
public RedirectView myName() { 
    RedirectView rv = new RedirectView("/"); 
    rv.setContextRelative(true); 
    return rv; 
} 

這種變化之後,你可以在bean簡單地注入到你的@Controller,你通常會怎麼做。假設您有一個簡單的RedirectView配置使用@Autowired注入作用域代理。 (否則使用@Resource作爲名稱或添加@Qualifier註釋)。

@Controller 
public class MyController { 

    @Autowired 
    private RedirectView rv; 

    @RequestMapping(value = "/", method = GET) 
    public RedirectView myFkt() { 
     return rv; 
    } 
}