JAX-RS:如何扩展Application类来扫描包?

day*_*mer 10 java rest jax-rs jersey 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 OAuthApplication extends Application {
    final Set<Class<?>> classes = new HashSet<>();

    @Nonnull
    @Override
    public Set<Class<?>> getClasses() {
        classes.add(RegisterResource.class);
        return Collections.unmodifiableSet(classes);
    }
}
Run Code Online (Sandbox Code Playgroud)

不,如果我添加十个新ResourceApplicationPath,我需要做

    classes.add(<ClassName>.class);
Run Code Online (Sandbox Code Playgroud)

十次,这是乏味的,有时也是健忘的.

请问JAX-RSRESTEasy提供,这样我可以提包名和类是在它扫描的方式吗?

我知道Jersey有一些东西

public class MyApplication extends ResourceConfig {
    public MyApplication() {
        packages("org.foo.rest;org.bar.rest");
    }
}
Run Code Online (Sandbox Code Playgroud)

参考

有什么想法/想法吗?

UPDATE

似乎我们可以做到以下 web.xml

   <context-param>
      <param-name>resteasy.scan</param-name>
      <param-value>true</param-value>
   </context-param>
Run Code Online (Sandbox Code Playgroud)

有具体的Java等价物吗?

Pau*_*tha 10

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

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

[...]

在任何一种情况后两种情况下,如果同时Application.getClassesApplication.getSingletons返回一个空列表,然后打包在Web应用程序根目录的所有资源类和供应商必须被包含在发布的JAX-RS应用程序.如果两个getClassesgetSingletons返回一个非空列表那么只有那些类或单身返回必须包括在公布的JAX-RS应用程序.

所以你可以做到

@ApplicationPath("oauth")
public class OAuthApplication extends Application {}
Run Code Online (Sandbox Code Playgroud)

并且您的类路径将被扫描@Path并进行@Provider分类.覆盖任一方法(返回非空集),只添加那些类.

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


小智 2

是所有Application类、ResourceClass和@ApplicationPath的组合

与文档和由 jersey 实现的类ResourceConfig一致,做法是:

@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");
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望这可以帮助你