JavaEE CDI注入 - 无法注入HttpServletRequest / Response

时间:2016-07-18 14:19:28

标签: java servlets java-ee cdi

我有一个读取查询参数的Web应用程序。它使用该参数从外部应用程序源获取一些数据。 Web应用程序是一个简单的Servlet:

@WebServlet(name = "SomethingServlet", urlPatterns = {"/"}, loadOnStartup = 0)
public class SomethingServlet extends HttpServlet {

    @Inject
    InterfaceOfDesire objectOfDesire;

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        objectOfDesire.doSomething();
    }
}

InterfaceOfDesire是一个(atm)实现的接口。所以不应该有歧义。

public interface InterfaceOfDesire {
    void doSomething();
}


public class ClassOfDesire implements InterfaceOfDesire {
    @Override
    public void doSomething() {
        // do something very cool
    }
}

最后,但并非最不重要的是,有一个解析器解决了实现类的类型(atm只有1)

public class SomethingResolver {
    @Inject
    private HttpServletRequest request;
    @Inject
    private HttpServletResponse response;

    @Inject
    public SomethingResolver(ServletContext servletContext) {
        // do something with the servlet context
    }

    @Produces
    public InterfaceOfDesire getInstance() {
        // do something with request and response
        // afterwards return object
        return new ClassOfDesire();
    }
}

现在我收到了错误

WELD-001408: Unsatisfied dependencies for type HttpServletResponse with qualifiers @Default

我做错了什么?

1 个答案:

答案 0 :(得分:0)

我想说bean(SomethingResolver)需要以某种方式绑定到HTTP请求或其会话。只有这样,它才能访问HttpServletRequest(或响应)。

尝试使用@RequestScoped进行注释。 @SessionScoped也可能有用。

这背后的原因是你现在的方式,bean生命周期没有绑定到请求 - 它甚至可能比请求更长。 CDI无法告知应该将哪个servlet请求注入其中。