JBoss RESTEasy 无法扫描 WEB-INF 以获取 JAX-RS 注释
Posted
技术标签:
【中文标题】JBoss RESTEasy 无法扫描 WEB-INF 以获取 JAX-RS 注释【英文标题】:JBoss RESTEasy Unable to scan WEB-INF for JAX-RS annotations 【发布时间】:2011-08-18 01:57:51 【问题描述】:我刚刚在 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>
【问题讨论】:
您的 web.xml 中的配置是否正确? 我很确定 web.xml 没问题,但这里只是以防万一您发现它有问题。 我也有同样的问题,你解决了吗? 那是很久以前的事了。我真的不记得了。但是,我确实记得只是说 f*** 所有这些 xml 垃圾,然后使用类型安全的惯用 java 再次启动该项目……只需获取所有这些配置……尽可能多地使用它并以编程方式进行。它为我省去了很多麻烦。 【参考方案1】:这意味着 RESTEasy 在尝试扫描 WEB-INF 目录时收到了IOException
。我要检查的第一件事是您的文件系统权限 - 运行 JBoss 进程的用户可以读取 WEB-INF 和其中的所有文件吗?
编辑:
回应您的评论:您的类路径包含 Scannotation 无法理解的条目。它看起来像jndi://
。你能检查类路径并找出这个条目是什么吗?
【讨论】:
我确实收到了 IOException。这是我在堆栈跟踪中看到的: 原因:java.io.IOException:无法扫描协议目录:jndi jboss 用户确实对部署目录中的所有内容具有读/写访问权限。战争权限很好。【参考方案2】: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
【讨论】:
【参考方案3】:当我将我的 maven 项目从 java 6 移动到 java 8 时,我遇到了同样的问题。原因是我的项目中的一些依赖项坚持使用 javassit 3.12,它与 java 8 不兼容。在我将 javassist 升级到 3.20 之后它开始工作正常。 因此,如果您遇到此问题,请检查使用的 javassist jar 并在需要时进行升级。
【讨论】:
【参考方案4】:我最近遇到了这个问题。 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>
【讨论】:
以上是关于JBoss RESTEasy 无法扫描 WEB-INF 以获取 JAX-RS 注释的主要内容,如果未能解决你的问题,请参考以下文章
Springboot 与 RestEasy 集成并部署到 Jboss 服务器
使用 RESTeasy 和 JBoss 的外部 @EJB 注入返回 null
org.jboss.resteasy.core.NoMessageBodyWriterFoundFailure:找不到响应对象类型的 MessageBodyWriter
RestEASY + Jboss 7.x - 当 Accepts 与 @Produces 值不匹配时,您可以默认使用第一个 @Path 吗?