我在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,而不是浏览器)?
答案 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源代码。它可以为您提供良好的洞察力。