0

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

4

3 回答 3

0

为重定向创建一个 @RequestMapping 并将其添加到带有 @ControllerAdvice 注释的控制器中,该控制器将被整个应用程序使用。

于 2013-10-30T23:05:18.817 回答
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;
}

@Controller在此更改之后,您可以像往常一样简单地将 bean 注入您的设备中。假设您有一个RedirectView简单的配置@Autowired用于注入作用域代理。(否则@Resource与名称一起使用或添加@Qualifier注释)。

@Controller
public class MyController {

    @Autowired
    private RedirectView rv;

    @RequestMapping(value = "/", method = GET)
    public RedirectView myFkt() {
       return rv;
    }
}
于 2013-10-31T13:47:43.707 回答
0

AFAIK 无法HandlerMethodArgumentResolver解析@Named处理程序方法中的参数。您可以自己编写和注册,但这很麻烦。

为什么不直接将其作为成员变量注入?

@Controller
public class MyController {

    @Resource("myName")
    private RedirectView rv;

    @RequestMapping(value = "/", method = GET)
    public RedirectView myFkt() {
        return rv;
    }
}
于 2013-10-30T21:36:36.917 回答