【问题标题】:scan resteasy resources by package name按包名扫描resteasy资源
【发布时间】:2015-07-24 15:10:46
【问题描述】:

我正在配置我的 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 似乎可以,但不能轻松

【问题讨论】:

    标签: java rest configuration resteasy web.xml


    【解决方案1】:

    文档很清楚:

    要注册的完全限定 JAX-RS 资源类名称的逗号分隔列表

    您可以使用例如reflections 库自行实现此功能。假设以下文本文件:

    com.foo.bar.TestResource
    com.foo.baz.*
    

    我们可以在Application类中读取这个文本文件,搜索所有类并将其添加到getClasses返回的Set中:

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

    注意:我们只在类级别添加带有 @Path 注释的资源。

    【讨论】:

    • 我希望有一些开箱即用的东西,但这确实有效。坦克
    【解决方案2】:

    我不是 jaxrs 方面的专家,但是您检查过以下内容吗?

    resteasy.scan 
    resteasy.scan.resources 
    

    【讨论】:

      猜你喜欢
      • 2016-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-31
      • 1970-01-01
      • 2016-06-06
      相关资源
      最近更新 更多