从 Spring Boot Runtime application.Properties 动态填充.js属性的最佳方法?



TLDR

如何最好地"放置"运行时应用程序的属性值,来自 Spring 引导应用程序的属性值在 javascript 文件中

[诚然,对于经验丰富的春季开发人员来说,这可能是一个愚蠢的问题......所以请分享如何解决这个问题"春天的方式"]

上下文

我们有一个小应用程序,前端开发人员把它放在一起并"扔墙"。它定义属性文件设置.js:

var SERVERROOT = 'http://solr:8983/solr/operations/select/';

由 HTML 引用:

<script type='text/javascript' src="js/settings.js"></script>

我想在运行时在 application.yml 中定义 solr 路径,如下所示:

app:    
solr:
path: 'http://solr:8983/solr/operations/select/'

问题

.js从 application.properties(或等效的,即命令行参数,例如

-Dapp.solr.path=...

(

可能

我想过将"settings.js"作为百里香叶模板(settings.js.html(,并让弹簧控制器从application.properties填充模型。

我不知道是否存在更"原生的弹簧"方法。

谢谢!

您可以使用 ResourceTransformer:

@Component
public class InjectSolrPathResourceTransformer implements ResourceTransformer {
private final MySetting settings; // inject via constructor
@Override
public Resource transform(HttpServletRequest request, Resource resource, ResourceTransformerChain transformerChain) throws IOException {
if (request.getServletPath().equals("/js/settings.js")) {
byte[] bytes = FileCopyUtils.copyToByteArray(resource.getInputStream());
String content = new String(bytes, StandardCharsets.UTF_8);
content = content.replace("var SERVERROOT = SERVERROOT_VALUE",
"var SERVERROOT = '" + settings.getSolrPath() + "'");
return new TransformedResource(resource, content.getBytes(StandardCharsets.UTF_8));
} else {
return resource;
}
}
}

这假定您将settings.js更改为:

var SERVERROOT = SERVERROOT_VALUE

要使用ResourceTransformer,请在您的WebMvcConfigurer中注册:

@Configuration
public class WebConfig implements WebMvcConfigurer {
// inject this via constructor
private final InjectSolrPathResourceTransformer resourceTransformer;
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/js/**")
.addResourceLocations("classpath:/public/js/")
.addTransformer(resourceTransformer);
}
}

上面@Wim的答案是正确的,但在新的 Spring 启动版本中,请使用以下代码注册您的转换器;

@Configuration
public class WebConfig implements WebMvcConfigurer {
// inject this via constructor
private final InjectSolrPathResourceTransformer resourceTransformer;
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/js/**")
.addResourceLocations("classpath:/public/js/")
.resourceChain(false)
.addTransformer(resourceTransformer);
}
}

相关内容

最新更新