JBoss RESTEasy无法扫描WEB-INF以获取JAX-RS注释

时间:2011-05-03 21:47:37

标签: java rest jboss jax-rs resteasy

我刚刚在MyEclipse中为我的项目添加了JAX-RS Web服务,并将我的导出/部署到jboss 6 / jdk 1.6,但我一直收到这个错误,我不知道它为什么会出现。以下是此堆栈跟踪的前几行:

2011-05-03 21:33:46,716 INFO  [org.jboss.resteasy.integration.deployers.ResteasyIntegrationDeployer] (HDScanner) *** Adding JAX-RS resource classes: com.mycompany.CategoriesResource
2011-05-03 21:33:47,180 INFO  [org.jboss.web.tomcat.service.deployers.TomcatDeployment] (HDScanner) deploy, ctxPath=/mypath
2011-05-03 21:33:47,330 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[localhost].[/mypath]] (HDScanner) Exception sending context initialized event to listener instance of class org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap: java.lang.RuntimeException: Unable to scan WEB-INF for JAX-RS annotations, you must manually register your classes/resources

之前有没有人遇到过这个问题?该项目是在MyEclipse中使用Struts和Web服务功能创建的,如果有帮助的话。老实说,我不知道还有什么可以尝试,因为我最近刚刚部署了类似的配置而没有任何问题。

谢谢!

这是我的web.xml

http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd“>                   行动         org.apache.struts.action.ActionServlet                      配置             /WEB-INF/struts-config.xml                               调试             3                               详情             3                  0     

<listener>
    <listener-class>org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap</listener-class>
</listener>
<servlet>
    <display-name>API</display-name>
    <servlet-name>API</servlet-name>
    <servlet-class>org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>API</servlet-name>
    <url-pattern>/api/*</url-pattern>
</servlet-mapping>
<context-param>
    <param-name>resteasy.scan</param-name>
    <param-value>true</param-value>
</context-param>
<context-param>
    <param-name>resteasy.servlet.mapping.prefix</param-name>
    <param-value>/api</param-value>
</context-param>
<servlet-mapping>
    <servlet-name>action</servlet-name>
    <url-pattern>*.do</url-pattern>
</servlet-mapping>
<welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
</welcome-file-list>

<jsp-config>
    <taglib>
        <taglib-uri>http://struts.apache.org/tags-bean</taglib-uri>
        <taglib-location>/WEB-INF/struts-bean.tld</taglib-location>
    </taglib>
    <taglib>
        <taglib-uri>http://struts.apache.org/tags-html</taglib-uri>
        <taglib-location>/WEB-INF/struts-html.tld</taglib-location>
    </taglib>
    <taglib>
        <taglib-uri>http://struts.apache.org/tags-logic</taglib-uri>
        <taglib-location>/WEB-INF/struts-logic.tld</taglib-location>
    </taglib>
    <taglib>
        <taglib-uri>http://struts.apache.org/tags-tiles</taglib-uri>
        <taglib-location>/WEB-INF/struts-tiles.tld</taglib-location>
    </taglib>
    <taglib>
        <taglib-uri>http://struts.apache.org/tags-nested</taglib-uri>
        <taglib-location>/WEB-INF/struts-nested.tld</taglib-location>
    </taglib>
</jsp-config>

4 个答案:

答案 0 :(得分:1)

这意味着RESTEasy在尝试扫描WEB-INF目录时收到IOException。我要检查的第一件事是你的文件系统权限 - 运行JBoss进程的用户可以读取WEB-INF及其中的所有文件吗?

编辑:

回复您的评论:您的类路径包含Scannotation无法理解的条目。它看起来像jndi://。你能检查一下类路径并找出这个条目是什么吗?

答案 1 :(得分:1)

Resteasy也应该成为受害者。问题出在scannotation-1.0.3.jar。

DirectoryIteratorFactory factory = registry.get(url.getProtocol());
if (factory == null) throw new IOException("Unable to scan directory of protocol: " + url.getProtocol());
return factory.create(url, filter);

似乎当url.getProtocol()返回“jdni”时,会出现此问题。我还在调查url会将协议作为jndi返回。

我从lib文件夹中删除了scannotation-1.0.3.jar,并下载了源代码,打印了坏URL。原来是:jndi:/localhost/Enoch2/WEB-INF/lib/.svn /

然后我尝试从部署中删除所有.svn文件夹。有用。 find . -name .svn | xargs rm -Rf

答案 2 :(得分:0)

当我将我的maven项目从java 6移动到java 8时,我遇到了同样的问题。原因是我的项目有些依赖于javassit 3.12并且它与java 8不兼容。我将javassist升级到3.20后它开始工作正常。 因此,如果您遇到此问题,请检查所使用的javassist jar并根据需要进行升级。

答案 3 :(得分:0)

我最近遇到了这个问题。
Java 8更改不支持 javassist 版本。因此,我已将该jar从该依赖项中排除,并在外部添加了javassist依赖项(具有更高版本)。

LOG:
SEVERE: Exception sending context initialized event to listener instance of class [org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap]

java.lang.RuntimeException: Unable to scan WEB-INF for JAX-RS annotations, you must manually register your classes/resources

    at org.jboss.resteasy.plugins.server.servlet.ConfigurationBootstrap.createDeployment(ConfigurationBootstrap.java:177)

    at org.jboss.resteasy.plugins.server.servlet.ListenerBootstrap.createDeployment(ListenerBootstrap.java:32)

    at org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap.contextInitialized(ResteasyBootstrap.java:27)

我的解决方案:

更新了我的pom.xml文件

<dependency>
    <groupId>com.xyz</groupId>
    <artifactId>abc</artifactId>
    <version>${abc.version}</version>
    <exclusions>
        <exclusion>
            <groupId>javassist</groupId>
            <artifactId>javassist</artifactId>
        </exclusion>
    </exclusions>
</dependency>

并增加了依赖性

<dependency>
    <groupId>org.javassist</groupId>
    <artifactId>javassist</artifactId>
    <version>3.18.2-GA</version>
</dependency>