如何在弹簧控制器中注入特殊的RedirectView?

时间:2013-10-30 19:58:38

标签: spring spring-mvc

我想在我的控制器中获得一个专门准备的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实例,而不是我配置的实例。

3 个答案:

答案 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;
    }
}