Java JAX-RS:如何扩展应用程序类来扫描包?

Java JAX-RS:如何扩展应用程序类来扫描包?,java,rest,jersey,jax-rs,resteasy,Java,Rest,Jersey,Jax Rs,Resteasy,目前,我做了一些类似于 import javax.annotation.Nonnull; import javax.ws.rs.ApplicationPath; import javax.ws.rs.core.Application; import java.util.Collections; import java.util.HashSet; import java.util.Set; @ApplicationPath("oauth") public class OAuthApplicati

目前,我做了一些类似于

import javax.annotation.Nonnull;
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;

@ApplicationPath("oauth")
public class OAuthApplication extends Application {
    final Set<Class<?>> classes = new HashSet<>();

    @Nonnull
    @Override
    public Set<Class<?>> getClasses() {
        classes.add(RegisterResource.class);
        return Collections.unmodifiableSet(classes);
    }
}
十次,它是乏味的,有时也是健忘的

JAX-RS
RESTEasy
是否提供了一种方法,以便我可以提及包名并在其下扫描类

我知道《泽西》有这样的东西

public class MyApplication extends ResourceConfig {
    public MyApplication() {
        packages("org.foo.rest;org.bar.rest");
    }
}

有什么想法/想法吗

更新

似乎我们可以在
web.xml

   <context-param>
      <param-name>resteasy.scan</param-name>
      <param-value>true</param-value>
   </context-param>

轻松扫描
真的

是否有特定的
Java
等价物?

是所有应用程序类、ResourceClass和@ApplicationPath的组合

与一致,并且类通过jersey实现,其实现方式是:

@ApplicationPath(value = "/resource")
public class ApplicationREST extends ResourceConfig {

    public ApplicationREST() {
        //add single resources
        register(SimpleResource1.class);
        register(SimpleResource2.class);
        ...

        //enable multipar feature
        register(MultiPartFeature.class);
        ...            

        //enable scan package and recursive
        packages(true, "com.example.rest");
    }
}
我希望这对你有帮助

“是否有特定的Java等价物?”

只需将类保留为空,这意味着不要覆盖
getClasses()
getSingletons()

[……]

在后两种情况下,如果
Application.getClasses
Application.getSingletons
都返回空列表,则web应用程序中打包的所有根资源类和提供程序都必须包含在已发布的JAX-RS应用程序中。如果
getClasses
getsingleton
返回非空列表,则发布的JAX-RS应用程序中必须只包含返回的那些类或单例

所以你可以简单的做

@ApplicationPath("oauth")
public class OAuthApplication extends Application {}
您的类路径将被扫描为
@Path
@Provider
类。重写任一方法(返回一个非空集),并且只添加那些类

还应该注意的是,
publicmap getProperties()
可以被安全覆盖。您可以使用它添加任意属性(甚至注册类/功能),或者如果您需要配置提供程序,您可以在
功能
动态功能
中这样做,因为它非常简单:

import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;

@ApplicationPath("/webapi")
public class MyApp extends Application {

}

这将扫描带有@Provider和@Path注释的所有类

也许这应该是一个单独的问题,但我发现,使用这里建议的解决方案,我的JAX-RS应用程序不会自动获取一些注册的ExceptionMapper提供程序,这些提供程序驻留在EAR中一个单独的EJB包中,该包也包含WAR。我不希望像OP所指出的那样显式地添加每个类,但确实需要Jersey提供的那种“添加包”快捷方式,而且仍然找不到使用RESTEasy实现这一点的方法。有什么想法吗?似乎我需要一个不同的问题,因为在重写的getClasses()方法中显式添加所有类实际上也不起作用。也没有将它们注册为功能。这些ExceptionMapper提供者一定有一些特别之处。嗯…有点进步。。。Wildfly日志表明,似乎未正确处理的异常之一是EJBException:ERROR[io.undertow.request](默认任务-121)UT005023:Exception handling request to/rest/authenticate:org.jboss.resteasy.spi.UnhandledException:javax.ejb.EJBException:io.jsonwebtoken.ExpiredJwtException。为EJBException添加ExceptionMapper确实允许我处理此异常,但我不完全理解为什么会发生这种情况,因为在我的EJB包(而不是WAR)中抛出的过期JWTException没有显示此问题。最后,我的问题是由于如何取消选中(系统)异常由EJBException中的容器包装(请参阅)。在我的例子中,解决方案是在ejb-jar.xml中表示io.jsonwebtoken.ExpiredJwtException,使其成为应用程序(已检查)异常。我使用了它,但最初,它给了我500,表示没有注册MultiPartFeature,注册后,它给了404,表示我所有的API。有什么想法吗?
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;

@ApplicationPath("/webapi")
public class MyApp extends Application {

}