Micronaut:如何在Thymeleaf视图层判断运行环境加载跟踪工具
在Micronaut + Thymeleaf中判断运行环境并仅在生产环境加载跟踪工具
我来给你一步步拆解这个需求,其实实现起来很清晰,核心就是把Micronaut的运行环境信息传递到Thymeleaf视图层,再通过条件判断控制跟踪脚本的加载,具体操作如下:
第一步:将环境信息全局传递到视图
为了让所有Thymeleaf模板都能便捷访问环境信息,推荐创建一个全局的Model处理器,不用在每个控制器里重复传递数据:
import io.micronaut.context.Environment; import io.micronaut.http.HttpRequest; import io.micronaut.http.server.ModelProcessor; import io.micronaut.views.ModelAndView; import jakarta.inject.Singleton; import java.util.Map; @Singleton public class EnvironmentModelProcessor implements ModelProcessor<HttpRequest<?>> { private final Environment environment; // 注入Micronaut的环境实例 public EnvironmentModelProcessor(Environment environment) { this.environment = environment; } @Override public void process(HttpRequest<?> request, ModelAndView<?> modelAndView) { if (modelAndView != null && modelAndView.getModel() != null) { Map<String, Object> model = modelAndView.getModel(); // 直接传递"是否为生产环境"的布尔值,简化视图判断逻辑 model.put("isProd", environment.activeNames().contains("prod")); // 也可以把整个Environment对象传入,方便后续扩展其他环境判断 // model.put("environment", environment); } } }
这个处理器会自动把isProd变量注入到所有视图的Model中,不用手动在每个控制器里添加。
第二步:在Thymeleaf模板中做条件加载
拿到isProd变量后,就可以用Thymeleaf的条件表达式控制Google Analytics脚本的加载了:
<!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <!-- 页面其他头部内容 --> <!-- 仅在生产环境加载跟踪脚本 --> <th:block th:if="${isProd}"> <script async src="https://www.googletagmanager.com/gtag/js?id=你的GA_ID"></script> <script> window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', '你的GA_ID'); </script> </th:block> </head> <body> <!-- 页面主体内容 --> </body> </html>
如果之前传递的是完整的environment对象,判断逻辑可以写成:
<th:block th:if="${environment.activeNames().contains('prod')}"> <!-- GA脚本 --> </th:block>
验证你的启动命令
你当前使用的启动命令是完全正确的:
java -Dmicronaut.environments=prod -jar mywebsite.jar
这个参数会激活prod环境,environment.activeNames()列表中会包含prod,从而触发视图层的条件加载逻辑。
内容的提问来源于stack exchange,提问作者user1117605
相关产品推荐
相关产品推荐

