如何在spring控制器中注入特殊的重定向视图?
我想在控制器中获得一个特别准备的RedirectView实例:如何在spring控制器中注入特殊的重定向视图?,spring,spring-mvc,Spring,Spring Mvc,我想在控制器中获得一个特别准备的RedirectView实例: @Controller public class MyController { @RequestMapping(value = "/", method = GET) public RedirectView myFkt(@Named("myName") RedirectView rv) { return rv; } 我的配置: @Configuration @EnableWebMvc @ComponentScan
@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实例,而不是我配置的实例。AFAIK没有
HandlerMethodArgumentResolver
来解析处理程序方法中的@命名
参数。你可以自己写和注册,但这很麻烦
为什么不把它作为成员变量注入呢
@Controller
public class MyController {
@Resource("myName")
private RedirectView rv;
@RequestMapping(value = "/", method = GET)
public RedirectView myFkt() {
return rv;
}
}
为重定向创建@RequestMapping,并将其添加到带有@ControllerAdvice注释的控制器,该控制器将由整个应用程序使用。首先更改bean的配置,以便在
@Scope
注释中包含proxyMode
属性。这将使其成为作用域代理,您希望保留该类型,因此需要基于类的代理(这需要cglib)
在这一更改之后,您可以像通常那样简单地将bean注入@Controller
。假设您配置了一个重定向视图
,只需使用@Autowired
插入作用域代理即可。(否则请使用带有名称的@Resource
,或添加@限定符
注释)
为什么不让自定义视图解析器处理您的特殊视图?
@Bean(name = "myName")
@Scope(value="request", proxyMode=ScopedProxyMode.TARGET_CLASS)
public RedirectView myName() {
RedirectView rv = new RedirectView("/");
rv.setContextRelative(true);
return rv;
}
@Controller
public class MyController {
@Autowired
private RedirectView rv;
@RequestMapping(value = "/", method = GET)
public RedirectView myFkt() {
return rv;
}
}