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