【问题标题】:Can a plain servlet be configured as a seam component?可以将普通 servlet 配置为接缝组件吗?
【发布时间】:2010-06-09 17:59:23
【问题描述】:

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

【问题讨论】:

    标签: java servlets dependency-injection seam


    【解决方案1】:

    记录:

    除了 arthur-ronald-f-d-garcia 给出的重要提示。

    组件的注入仍然不起作用,至少我可以手动查找组件,因此需要上下文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)。我假装将 ContextFilter 与其他 Web 框架一起使用。
    【解决方案2】:

    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 向非 JSF 开放对 Seam 容器及其上下文变量的访问 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 源代码。它可以给你一个很好的洞察力。

    【讨论】:

    • + 谢谢,前几天刚买了这本书,还给我指点
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-11
    • 1970-01-01
    • 2011-11-25
    • 2011-11-06
    • 1970-01-01
    • 2014-01-13
    • 1970-01-01
    相关资源
    最近更新 更多