[英]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请求启用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源代码。 它可以给你一个很好的洞察力。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.