如果未设置模板变量,我可以在Thymeleaf中引发可捕获的异常吗?

时间:2019-02-13 15:15:26

标签: java spring-boot thymeleaf

我已经在spring-boot中实现了一个模板解析器,它使用thymeleafs TemplateEngine。这个想法是用户将模板名称,语言环境和模板中使用的任何变量发送给控制器。变量存储在名为ReplaceToken的对象中,该对象由键和值组成。然后将它们添加到上下文中,其中键作为变量名,值作为值。

有没有办法在未设置变量的情况下抛出/捕获错误?

当前,如果在处理模板时缺少变量,则Thymeleaf将仅使用占位符文本。例如

<span th:text="${thisVariableDoesntExist}>
Placeholder Text //This will be displayed
</span>

我已经考虑过对整个模板的后处理进行解析,以获取我可以预先设置的值,这些值指示仍在使用占位符值,但是我更希望使用一种无​​需解析已处理的模板的解决方案。我还研究了使用null值的方式,但是由于不知道应该设置哪些变量,因此我无法找出合适的实现方式。

1 个答案:

答案 0 :(得分:0)

我肯定会在Controller上执行此操作,也许是通过为每个模板维护所需变量的静态映射,然后在未满足要求的情况下重定向失败。类似于:

public class RedirectController {

    private static final Map<String, List<String>> REQUIRED_VARIABLES;
    static {
        REQUIRED_VARIABLES = new HashMap<>();
        REQUIRED_VARIABLES.put("template1", new ArrayList<>());
        REQUIRED_VARIABLES.get("template1").add("name");
        REQUIRED_VARIABLES.get("template1").add("surname");
        // ...
    }

    // ...
    public void redirect(String template, List<ReplaceToken> tokens) {
       for (String requiredVariable : REQUIRED_VARIABLES.get(template)) {
         // maybe overriding ReplaceToken.equals() or something
         if (!tokens.contains(requiredVariable)) { 
           throw new WhateverException("!");
         }
       }

       // ...
    }
}

您将必须维护REQUIRED_VARIABLES映射,但是至少您可以在Controller上执行验证,并避免解析会导致错误的模板。