可以将普通servlet配置为接缝组件吗?

时间:2010-06-09 17:59:23

标签: java servlets dependency-injection seam

我在seam-gen(2.1.2)应用程序中创建了一个普通的servlet,现在我想使用注入。因此,我用@Name注释它,它被识别为组件:

     INFO  [Component] Component: ConfigReport, 
scope: EVENT, type: JAVA_BEAN, class: com.mycompany.servlet.ConfigReport

不幸的是,NullPointerException

中注入记录器不起作用init()
import org.jboss.seam.annotations.Logger;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.log.Log;

@Name("ConfigReport")
public class ConfigReport extends HttpServlet {

    @Logger
    private Log log;

    public void init(ServletConfig config) throws ServletException {
        log.info( "BOOM" );
    }

}

我的做法是否滥用?
什么是替代方案(客户端向servlet发送请求是curl,而不是浏览器)?

2 个答案:

答案 0 :(得分:6)

记录:

除了亚瑟 - 罗纳德 - 法德加西亚给出的重要提示。

注入组件仍然不起作用,至少我可以手动查找组件,因此需要上下文ContextualHttpServletRequest

的components.xml

<web:context-filter regex-url-pattern="/config/*"/>

servlet.java

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        final HttpServletRequest req = request;
        final HttpServletResponse res = response;
         new ContextualHttpServletRequest(req) {
                public void process() throws Exception {
                    wrappedGet( req, res );
                }
              }.run();
    }

在包装的servlet代码中

entityManager = (EntityManager) Component.getInstance( "entityManager" );

链接:

答案 1 :(得分:3)

Stacker,如果您想要Seam @ In-ject任何已启用的组件,它必须拦截您的请求。例如,@ In-jection在使用EJB时​​起作用,因为Seam使用EJB拦截器。它解释了为什么在使用EJB时​​应该声明Seam EJB拦截器。

另一方面,

Java Server Faces,Seam使用表达式语言解析器,可以访问任何Seam组件,当Seam核心jar放在类路径上时,该组件默认安装

使Seam与任何Web技术集成的关键是ContextFilter - 请注意,必须启用Seam Filter才能使用ContextFilter - 根据Seam in Action手册中的描述如下

  

为非JSF请求启用Seam容器和上下文 。不应该应用于JSF请求,因为它会导致执行重复逻辑,从而导致未定义的结果。

...

  

ContextFilter打开对Seam容器及其上下文变量的访问,以访问非JSF   servlet,如Struts,Spring MVC和Direct Web Remoting(DWR)。虽然Seam的大部分工作是在JSF servlet中完成的,但这些额外的过滤器允许Seam   扩展其生命周期的边界超出JSF servlet的范围

要启用ContextFilter,请在components.xml中声明它

<component name="org.jboss.seam.web.contextFilter">
    <property name="disabled">false</property>
</component>

因为没有空余时间,我不知道如何使用这种功能。看一下ContextFilter源代码。它可以为您提供良好的洞察力。

相关问题