Micronaut - 在视图中获取 运行 环境名称

Micronaut - Get Running environment name in the view

我有一个带有视图层 (thymeleaf) 的小型 Micronaut 应用程序。现在我想集成 Google Analytics 或其他一些跟踪工具。当然这应该只是在生产模式下加载但是我如何在视图层中检查环境?

我通过以下方式启动应用程序:

java -Dmicronaut.environments=prod -jar mywebsite.jar

您可以注入 io.micronaut.context.env.Environment 并将 getActiveNames() 的结果作为视图模型的一部分传递

编辑:

如果你想在不触及每个控制器方法的情况下将此数据添加到每个模型,你可以添加一个发生在视图过滤器之前的服务器过滤器来操纵响应,或者创建一个可以操纵 return控制器的值。

解决此问题的另一种方法是利用@Replaces 注释覆盖 ThymeleafViewsRenderer class 并在 class.

中添加公共数据
import io.micronaut.context.annotation.Replaces
import io.micronaut.context.env.Environment
import io.micronaut.core.beans.BeanMap
import io.micronaut.core.io.Writable
import io.micronaut.core.io.scan.ClassPathResourceLoader
import io.micronaut.core.util.ArgumentUtils
import io.micronaut.http.HttpRequest
import io.micronaut.views.exceptions.ViewRenderingException
import io.micronaut.views.thymeleaf.ThymeleafViewsRenderer
import io.micronaut.views.thymeleaf.WebContext
import org.thymeleaf.TemplateEngine
import org.thymeleaf.context.Context
import org.thymeleaf.context.IContext
import org.thymeleaf.exceptions.TemplateEngineException
import org.thymeleaf.templateresolver.AbstractConfigurableTemplateResolver

import javax.annotation.Nonnull
import javax.annotation.Nullable
import javax.inject.Inject
import javax.inject.Singleton

@Singleton
@Replaces(bean = ThymeleafViewsRenderer.class)
class CustomThymeleafFilter extends ThymeleafViewsRenderer {

    CustomThymeleafFilter(AbstractConfigurableTemplateResolver templateResolver, TemplateEngine templateEngine, ClassPathResourceLoader resourceLoader) {
        super(templateResolver, templateEngine, resourceLoader)
    }

    @Inject
    Environment environment

    @Override
    @Nonnull
    public Writable render(@Nonnull String viewName, @Nullable Object data) {
        ArgumentUtils.requireNonNull("viewName", viewName);
        return (writer) -> {
            
            //following block adds environments variable to model
            Map dataMap = variables(data)
            dataMap.put("environment", environment.activeNames)
            
            IContext context = new Context(Locale.US, dataMap);
            processView(viewName, writer, context);
        };
    }

    @Override
    @Nonnull
    public Writable render(@Nonnull String viewName, @Nullable Object data,
                           @Nonnull HttpRequest<?> request) {
        ArgumentUtils.requireNonNull("viewName", viewName);
        ArgumentUtils.requireNonNull("request", request);
        return (writer) -> {

            //following block adds environments variable to model
            Map dataMap = variables(data)
            dataMap.put("environment", environment.activeNames)
            
            IContext context = new WebContext(request, Locale.US, dataMap);
            processView(viewName, writer, context);
        };
    }

    private static Map<String, Object> variables(@Nullable Object data) {
        if (data == null) {
            return new HashMap<>();
        }
        if (data instanceof Map) {
            return (Map<String, Object>) data;
        } else {
            return BeanMap.of(data);
        }
    }

    private void processView(String viewName, Writer writer, IContext context) {
        try {
            engine.process(viewName, context, writer);
        } catch (TemplateEngineException e) {
            throw new ViewRenderingException("Error rendering Thymeleaf view [" + viewName + "]: " + e.getMessage(), e);
        }
    }
}