我在seam-gen(2.1.2)应用程序中创建了一个普通的servlet,现在我想使用注入。因此,我用@Name对其进行了注释,并将其识别为组件:
INFO [Component] Component: ConfigReport,
scope: EVENT, type: JAVA_BEAN, class: com.mycompany.servlet.ConfigReport
不幸的是,记录器的注入在
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,而不是浏览器)?
最佳答案
堆栈器,如果您希望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的描述如下
为非JSF请求启用Seam容器和上下文。不应将其应用于JSF请求,因为它会导致执行重复的逻辑,从而导致不确定的结果。
...
ContextFilter向非JSF打开对Seam容器及其上下文变量的访问
Servlet,例如Struts,Spring MVC和直接Web远程处理(DWR)。尽管Seam的大部分工作都是在JSF servlet中完成的,但是这些额外的过滤器使Seam可以
扩展其生命周期的界限,超出JSF servlet的范围。
要启用ContextFilter,请在components.xml中声明它
<component name="org.jboss.seam.web.contextFilter">
<property name="disabled">false</property>
</component>
因为没有空闲时间,所以我不知道如何使用这种功能。看一下ContextFilter源代码。它可以给您很好的见识。
关于java - 可以将普通的servlet配置为接缝组件吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3008490/