【问题标题】:RESTEasy annotation scan unable to find resources (under Tomcat)RESTEasy注解扫描找不到资源(Tomcat下)
【发布时间】:2017-10-06 15:13:16
【问题描述】:

我正在尝试使用旧的 RESTEasy 3.0.5 将 WAR 更新为更新的东西。 3.0.6 工作正常,但在更新到 3.0.7(或更高版本,如 3.0.24)后,所有资源 (@Path) 都会丢失 — 任何资源都会丢失 404。 WAR 在 Apache Tomcat 服务器下运行。

我认为原因与注释扫描仪的更改有关: https://issues.jboss.org/browse/RESTEASY-1010

我尝试创建扩展 javax.ws.rs.core.Application 而不是 web.xml 配置的类。根据答案https://stackoverflow.com/a/29957040/2528366,空集应该触发扫描@Path,但没有找到任何资源。如果我覆盖返回非空集的getClasses(),则该资源将按预期工作。

web.xml:https://pastebin.com/uRD2w6Z6

新建Application继承类:

@ApplicationPath("/rest")
public class WebApi extends Application
{
    @Override
    public Set<Class<?>> getClasses()
    {
        Set<Class<?>> s = new HashSet<>();
        // if line below is uncommented SomeResource works fine
        // s.add(SomeResourceImpl.class);
        return s;
    }
}

资源是接口,实现在派生类中。将注释移动到类本身不会改变任何事情。

注解或配置有什么问题?或者是否需要其他东西来触发对注释的扫描?

【问题讨论】:

  • 如果在ApplicationPath 中删除rest 之前的斜线会怎样?
  • @Dimitri 我看不出有什么区别,工作方式相同,如果设置为空,则没有任何工作,如果不是 - 添加资源工作。

标签: java tomcat resteasy


【解决方案1】:

如果您使用的是与 Servlet 3.0 规范兼容的Tomcat version,则需要添加resteasy-servlet-initializer 依赖项:

    <dependency>
       <groupId>org.jboss.resteasy</groupId>
       <artifactId>resteasy-servlet-initializer</artifactId>
       <version>${resteasy.version}</version>
   </dependency>

如文档中所述:

Resteasy 使用 Servlet 3.0 容器中的 ServletContainerInitializer 集成接口来初始化应用程序,自动扫描资源和提供者。要启用自动扫描,您还必须在 WAR 文件中包含 resteasy-servlet-initializer 工件

【讨论】:

  • 您有beans.xml 文件吗?您能否更深入地了解您的应用程序的配置?
  • 不,我不知道。好的,我将制作一些没有私有代码和不必要依赖项的最小应用程序。
猜你喜欢
  • 1970-01-01
  • 2013-12-31
  • 2016-10-02
  • 2015-12-10
  • 1970-01-01
  • 2018-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多