JAX-RS:如何将Application类扩展到扫描包



目前,我做一些类似的事情

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);
    }
}

不,如果我在ApplicationPath上添加十个新的Resource,我需要进行

    classes.add(<ClassName>.class);

十次,它是乏味的,有时也健忘。

JAX-RSRESTEasy是否提供了一种方式,以便我可以提及包名称并在其下扫描类?

我知道Jersey

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等效物?

"是否有特定的Java等价物"

只需将类留空,这意味着不要覆盖getClasses()getSingletons()。根据规范2.3.2:

[…]

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

所以你可以简单地做

@ApplicationPath("oauth")
public class OAuthApplication extends Application {}

并且您的类路径将被扫描@Path@Provider类。重写任一方法(返回一个非空集),并且只添加那些类。

还应该注意的是,public Map<String, Object> getProperties()可以被安全地覆盖。您可以使用它来添加任意属性(甚至注册类/功能),如图所示,或者如果您需要配置提供程序,您可以在FeatureDynamicFeature中这样做,如图

所示

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

与文档和ResourceConfig类一致,通过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");
    }
}

我希望这能帮助你

这很简单:

import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;
@ApplicationPath("/webapi")
public class MyApp extends Application {
}

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

最新更新