我如何动态注入静态资源而不是在中央声明 application.yml

How do I inject static resources dynamically rather than declaring in central application.yml

我有一个从单独的库构建的 micronaut Web 服务。其中 2 个库有静态资源,我希望每个库都声明它自己的静态资源。

我想要以下静态声明,但如果使用库,我希望每个声明都动态添加,因此理想情况下库添加自己的静态资源

micronaut:
  router:
    static-resources:
      lib1:
        mapping: /lib1/**
        paths:
          - classpath:static/lib1
      lib2:
        mapping: /lib2/**
        paths:
          - classpath:static/lib2

我尝试在每个库中放置一个 application.yml 文件,但 micronaut 似乎并没有查找所有此类文件,而是在找到第一个文件时停止。

到目前为止,我通过两种方式实现了它: 1.在服务的application.yml或者声明上面的静态资源 2. 通过创建一个 fat jar 并使用转换器合并 application.yml 文件

对我来说,理想的解决方案是找到一些方法来声明每个库中的静态资源,并在库位于类路径时自动拥有静态资源。

通过 micronaut 代码挖掘和追踪日志后,这就是我想出的:

定义一个注释,例如:

package test;

@Singleton
@ConfigurationReader(prefix = "static")
public @interface StaticResource {}

在 lib1 的工厂中注册您的静态资源:

package lib1;

import test.StatiCResource;
import io.micronaut.context.annotation.Bean;
import io.micronaut.context.annotation.Factory;
import io.micronaut.core.io.ResourceResolver;
import io.micronaut.web.router.resource.StaticResourceConfiguration;
import javax.inject.Singleton;

@Factory
public class Lib1Config {

    @Bean
    @StaticResource
    public StaticResourceConfiguration lib1StaticResources(final ResourceResolver resourceResolver) {
        final StaticResourceConfiguration conf = new StaticResourceConfiguration(resourceResolver);
        conf.setPaths(Collections.singletonList("classpath:static/lib1"));
        conf.setMapping("/lib1/**");
        return conf;
    }

}

lib2可以类似的方式注册自己的资源

您可以只定义一个控制器路由并为其提供服务:

    @Get("/swagger")
    public StreamedFile getOpenApiSpec() {
        return new StreamedFile(
                MyApi.class.getClassLoader().getResourceAsStream("swagger.yaml"),
                MediaType.APPLICATION_YAML_TYPE);
    }