我想在我的控制器中获得一个专门准备的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 :(得分:0)
AFAIK没有HandlerMethodArgumentResolver
来解析处理程序方法中的@Named
参数。你可以自己编写和注册,但这很麻烦。
为什么不将它作为成员变量注入?
@Controller
public class MyController {
@Resource("myName")
private RedirectView rv;
@RequestMapping(value = "/", method = GET)
public RedirectView myFkt() {
return rv;
}
}
答案 1 :(得分:0)
为重定向创建一个@RequestMapping,并将其添加到使用@ControllerAdvice注释的Controller中,该控件将由整个应用程序使用。
答案 2 :(得分:0)
首先更改bean的配置,以在proxyMode
注释中包含@Scope
属性。这将使它成为范围代理,您希望保留类型,因此需要基于类的代理(这需要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;
}
}