按包名扫描resteasy资源
scan resteasy resources by package name
我正在配置我的 resteasy 应用程序,需要关闭自动扫描(类路径中有两个 jaxrs 应用程序,它在加载时中断)
出于这个原因,我将 web.xml 配置如下:
<context-param>
<param-name>resteasy.scan</param-name>
<param-value>false</param-value>
</context-param>
<context-param>
<param-name>resteasy.resources</param-name>
<param-value>
io.swagger.jaxrs.listing.ApiListingResource,
com.mycompany.resource.ClientResource,
com.mycompany.resource.AccountResource,
... etc
</param-value>
</context-param>
resteasy 中有什么方法可以按包 (com.mycompany.resource.*
) 名称扫描而不是必须添加每个资源吗?看来 jaxrs 是可行的,但 resteasy
不行
我不是 jaxrs 方面的专家,但您检查过以下内容了吗?
resteasy.scan
resteasy.scan.resources
文档写的很清楚:
A comma delimited list of fully qualified JAX-RS resource class names you want to register
您可以使用 reflections 库等自行实现。假设以下文本文件:
com.foo.bar.TestResource
com.foo.baz.*
我们可以在应用程序 class 中读取此文本文件,搜索所有 classes 并将其添加到 getClasses
:
返回的集合中
@ApplicationPath("/")
public class RestApplication extends Application {
Set<Class<?>> classes;
public RestApplication(@Context ServletContext servletContext) {
classes = new HashSet<>();
try {
URI resourcesConfig = servletContext.getResource("/WEB-INF/resources.txt").toURI();
List<String> resources = Files.readAllLines(Paths.get(resourcesConfig), Charset.forName("UTF-8"));
for (String resource : resources) {
parseResources(resource);
}
} catch (IOException | URISyntaxException | ClassNotFoundException ex) {
throw new IllegalArgumentException("Could not add resource classes", ex);
}
}
private void parseResources(String resource) throws ClassNotFoundException, IOException {
if (!resource.endsWith(".*")) {
classes.add(Class.forName(resource));
return;
}
String pkg = resource.substring(0, resource.length() - 2);
Reflections reflections = new Reflections(pkg);
for (Class<?> scannedResource : reflections.getTypesAnnotatedWith(Path.class)) {
classes.add(scannedResource);
}
}
@Override
public Set<Class<?>> getClasses() {
return classes;
}
}
注意:我们仅在 class 级别添加带有 @Path
注释的资源。
我正在配置我的 resteasy 应用程序,需要关闭自动扫描(类路径中有两个 jaxrs 应用程序,它在加载时中断)
出于这个原因,我将 web.xml 配置如下:
<context-param>
<param-name>resteasy.scan</param-name>
<param-value>false</param-value>
</context-param>
<context-param>
<param-name>resteasy.resources</param-name>
<param-value>
io.swagger.jaxrs.listing.ApiListingResource,
com.mycompany.resource.ClientResource,
com.mycompany.resource.AccountResource,
... etc
</param-value>
</context-param>
resteasy 中有什么方法可以按包 (com.mycompany.resource.*
) 名称扫描而不是必须添加每个资源吗?看来 jaxrs 是可行的,但 resteasy
我不是 jaxrs 方面的专家,但您检查过以下内容了吗?
resteasy.scan
resteasy.scan.resources
文档写的很清楚:
A comma delimited list of fully qualified JAX-RS resource class names you want to register
您可以使用 reflections 库等自行实现。假设以下文本文件:
com.foo.bar.TestResource
com.foo.baz.*
我们可以在应用程序 class 中读取此文本文件,搜索所有 classes 并将其添加到 getClasses
:
@ApplicationPath("/")
public class RestApplication extends Application {
Set<Class<?>> classes;
public RestApplication(@Context ServletContext servletContext) {
classes = new HashSet<>();
try {
URI resourcesConfig = servletContext.getResource("/WEB-INF/resources.txt").toURI();
List<String> resources = Files.readAllLines(Paths.get(resourcesConfig), Charset.forName("UTF-8"));
for (String resource : resources) {
parseResources(resource);
}
} catch (IOException | URISyntaxException | ClassNotFoundException ex) {
throw new IllegalArgumentException("Could not add resource classes", ex);
}
}
private void parseResources(String resource) throws ClassNotFoundException, IOException {
if (!resource.endsWith(".*")) {
classes.add(Class.forName(resource));
return;
}
String pkg = resource.substring(0, resource.length() - 2);
Reflections reflections = new Reflections(pkg);
for (Class<?> scannedResource : reflections.getTypesAnnotatedWith(Path.class)) {
classes.add(scannedResource);
}
}
@Override
public Set<Class<?>> getClasses() {
return classes;
}
}
注意:我们仅在 class 级别添加带有 @Path
注释的资源。