繁体   English   中英

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

[英]Can a plain servlet be configured as a seam component?

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

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

不幸的是,注入器的注入在init()不起作用NullPointerException

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,而不是浏览器)?

对于记录:

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

注入组件仍然不起作用,至少我可以手动查找组件,因此需要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" );

链接:

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

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

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

为非JSF请求启用S​​eam容器和上下文。 不应该应用于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源代码。 它可以给你一个很好的洞察力。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM