我如何动态注入静态资源而不是在中央声明 application.yml
How do I inject static resources dynamically rather than declaring in central application.yml
我有一个从单独的库构建的 micronaut Web 服务。其中 2 个库有静态资源,我希望每个库都声明它自己的静态资源。
- 服务依赖于lib1.jar和lib2.jar
- lib1.jar 包含
- 代码
- static/lib1/files
- lib2.jar 包含
- 代码
- static/lib2/files
我想要以下静态声明,但如果使用库,我希望每个声明都动态添加,因此理想情况下库添加自己的静态资源
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);
}
我有一个从单独的库构建的 micronaut Web 服务。其中 2 个库有静态资源,我希望每个库都声明它自己的静态资源。
- 服务依赖于lib1.jar和lib2.jar
- lib1.jar 包含
- 代码
- static/lib1/files
- lib2.jar 包含
- 代码
- static/lib2/files
我想要以下静态声明,但如果使用库,我希望每个声明都动态添加,因此理想情况下库添加自己的静态资源
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);
}