【问题标题】:How do I constructor-autowire HttpServletResponse in Spring 3.1?如何在 Spring 3.1 中构造函数自动装配 HttpServletResponse?
【发布时间】:2012-01-17 16:01:39
【问题描述】:

我有一个请求范围的 bean,我需要访问 HttpServletResponse 和 HttpServletRequest 对象。

我需要在构造函数中访问这些对象,所以属性自动装配不是一个选项。

我做了以下事情:

@Component
@Scope("request")
public class MyClass{

    @Autowired(required=true)
    public MyClass(HttpServletRequest request, HttpServletResponse response) {

        // do stuff I need to do in the constructor

    }
}

这给了我以下错误:

未找到默认构造函数;嵌套异常是 java.lang.NoSuchMethodException: com.foo.bar.MyClass.()

根据这个错误信息,它正在寻找一个不存在的无参数默认构造函数。我自动装配了构造函数并将“必需”设置为 true,因此注入器应该选择这个构造函数。由于 bean 是请求范围,这应该可以工作,但它没有。

有什么想法吗?

【问题讨论】:

    标签: spring dependency-injection constructor-injection


    【解决方案1】:

    据我了解,您将无法使用标准方法自动装配 HttpServletResponse 对象。检查 WebApplicationContextUtils 类的 registerWebApplicationScopes 方法。可解析的依赖项只有 HttpSession.class 和 HttpSession.class 。

    检查自定义解决方案here

    【讨论】:

    • 谢谢。自定义解决方案似乎有点 hackish,所以我重写了我的逻辑,将 bean 函数放入 HandlerInterceptor,默认情况下这两个对象可用
    • 如果我正在做一个 portlet,PortletRequest 是否可用于自动装配?
    【解决方案2】:

    正如@Aravind 提到的,HttpServletResponse 不能作为自动装配候选者。但是,您可以使用ServletWebRequest.getResponse() 访问响应,并且ServletWebRequest (a Spring-specific class)可用作自动接线候选者。

    话虽如此,它可能在构造函数中不起作用,但还是试试吧:)

    【讨论】:

    • 刚刚试过这个。当您自动装配ServletWebRequest 时,WebApplicationContextUtils.WebRequestObjectFactory.getObject() 会构造它,但不幸的是没有设置响应对象。
    猜你喜欢
    • 2013-06-23
    • 1970-01-01
    • 1970-01-01
    • 2016-09-04
    • 1970-01-01
    • 2016-10-10
    • 2014-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多