我在RESTful Web应用程序中添加了一个过滤器。此应用程序使用JavaEE 6并部署在Apache TomEE服务器1.7.3中。
我添加的过滤器类如下所示:
package com.company.filter;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.core.Response;
public class LoggingFilter implements Filter {
private static final Logger LOG = LoggerFactory.getLogger("std");
@Override
public void init(final FilterConfig filterConfig) throws ServletException {
LOG.info("Initializing filter");
}
public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain filterChain)
throws IOException, ServletException {
LOG.info("Processing a request...");
// filter logic
}
public void destroy() {
LOG.info("Destroying filter");
}
}
web.xml(特定于应用程序,并在应用程序内部部署),如下所示:
<filter>
<filter-name>LoggingFilter</filter-name>
<filter-class>com.company.filter.LoggingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>LoggingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
我没有修改conf文件夹中的主web.xml。
当我部署应用程序并启动TomEE服务器时,我在catalina.log中看到以下错误:
SEVERE: Unable to deploy collapsed ear in war StandardEngine[Catalina].StandardHost[localhost].StandardContext[/vw-ws-rest]
org.apache.openejb.OpenEJBException: Unable to load servlet filter class: com.company.filter.LoggingFilter: com.company.filter.LoggingFilter
at org.apache.openejb.config.AnnotationDeployer$ProcessAnnotatedBeans.deploy(AnnotationDeployer.java:2141)
at org.apache.openejb.config.AnnotationDeployer$ProcessAnnotatedBeans.deploy(AnnotationDeployer.java:1843)
at org.apache.openejb.config.AnnotationDeployer.deploy(AnnotationDeployer.java:360)
注意:包和类名是正确的。
如果我将过滤器类打包在一个单独的jar中,并将该jar放在libs目录中,那么应用程序会加载过滤器类,并且它可以正常工作。
但我不想生成另一个工件,并部署该工件,因为它会使部署过程更加复杂。
我的问题是:无法让TomEE加载应用程序大战中包含的过滤器?如果可以,那么我做错了什么? (看起来TomEE在初始化时无法看到过滤器类)