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

时间:2019-07-15 09:38:09

标签: micronaut

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

  • 服务取决于lib1.jar和lib2.jar
  • lib1.jar包含
    • 代码
    • static / lib1 /文件
  • lib2.jar包含
    • 代码
    • static / lib2 /文件

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

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.通过创建一个胖jar并使用转换器合并application.yml文件

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

1 个答案:

答案 0 :(得分:0)

在对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可以以类似的方式注册自己的资源。