我在共享库中有一个Jersey 1 ContainerResponseFilter,我通过在web.xml中指定此过滤器存在的包,在Jersey 1 Web服务中注册,例如。
<servlet>
<servlet-name>ServletAdaptor</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>
com.xxx.utils.jersey
</param-value>
</init-param>
<init-param>
<param-name>com.sun.jersey.spi.container.ContainerResponseFilters</param-name>
<param-value>com.xxx.utils.jersey.CrossDomainFilter</param-value>
</init-param>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>com.xxx.utils.jersey</param-value>
</init-param>
...
</servlet>
我现在尝试在Jersey 2 Web服务中使用此共享库,而不是使用web.xml来配置Jersey使用带@ApplicationPath
注释的类并扩展Jersey ResourceConfig
。在这个类中,我没有在任何地方指定这个Jersey 1过滤器的包。
我得到的问题是因为这个Jersey 2 Web服务在战争中没有包含任何Jersey 1依赖项我在部署ClassNotFoundException
com.sun.jersey.spi.container.ContainerResponseFilter
以下是我如何创建配置
的示例@ApplicationPath("/")
public class AppConfig extends ResourceConfig
{
private static final String RESOURCE_PACKAGE = "com.xxx.services.rest";
public AppConfig()
{
packages(RESOURCE_PACKAGE);
register(ApiListingResource.class);
register(SwaggerSerializers.class);
BeanConfig beanConfig = new BeanConfig();
beanConfig.setVersion("1.0.0");
beanConfig.setResourcePackage(RESOURCE_PACKAGE);
beanConfig.setSchemes(new String[]{"http"});
beanConfig.setHost("localhost:7001");
beanConfig.setBasePath("/usr/");
beanConfig.setScan(true);
}
}
有没有办法可以确保没有从共享库加载这个Jersey 1类,我可以明确地排除该包吗?
编辑:
更多的调查似乎暗示它与CDI有关,ContainerResponseFilter
注释为@Producer
。如果我从类中删除注释,那么我不再收到异常。
我使用的容器是weblogic 12.2.1,我认为它使用Weld作为其CDI提供程序。所以我创建了一个带有以下内容的beans.xml,如Weld documentation
这一点所示<beans xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:weld="http://jboss.org/schema/weld/beans">
<weld:scan>
<weld:exclude name="com.xxx.utils.jersey.**"/>
</weld:scan>
</beans>
但它似乎没有解决问题。有什么想法吗?