如果找不到绑定,如何使 JinJava 抛出错误



我需要使用 JinJava 来处理可以包含不同令牌的小模板。例如:

Hello,{{ user }}...

需要绑定user,因为没有它,输出没有任何意义。

我的类不知道模板使用什么令牌,它从远程服务获取绑定列表。

因此,可能存在模板中指定的绑定不存在的情况。JinJava 的默认行为是在输出字符串中使用转换为空字符串的null。它在我的情况下不起作用,如果错过任何绑定,我需要抛出异常。

我目前的解决方案是使用自定义Filter

/**
* A filter for JinJava that verifies that a value is not null and if the value is null, writes a fatal error to interpreter's log
*/
public class RequiredFilter implements Filter {
@Override
public Object filter(Object var, JinjavaInterpreter interpreter, String... args) {
if (var == null) {
interpreter.addError(new TemplateError(TemplateError.ErrorType.FATAL, TemplateError.ErrorReason.MISSING, "Value of a required key is null", "", 1, null));
}
return var;
}
@Override
public String getName() {
return "required";
}
}

并使客户端为模板中的所有令牌显式指定此函数。上面的示例现在如下所示:

Hello, {{ user|required }}...

如果绑定user不存在,我会得到我的例外。但是,自定义函数的要求看起来很奇怪。

有没有办法设置 JinJava 来实现类似的行为,并且每次都要求指定过滤器required而打扰客户端?

你可以做这样的事情,

JinjavaConfig jc = JinjavaConfig.newBuilder().withFailOnUnknownTokens(true).build();
Jinjava jinjava = new Jinjava(jc);
// set context and other processes and then render
RenderResult renderResult = jinjava.renderForResult(template, properties);
if (renderResult.getErrors().isEmpty()) {
return renderResult.getOutput();
} else {
throw new IllegalArgumentException(renderResult.getErrors().stream()
.map(Object::toString)
.collect(Collectors.joining(",")));
}

您可能还想检查许多其他JinjavaConfig

根据您使用令牌过滤器的解决方案,我为此目的注册自定义标签来做到这一点。

public static String fillTemplateTagsWithProperties(
String template, Map<String, String> properties) throws IllegalArgumentException
{
if (template == null) throw new IllegalArgumentException("template is null");
Jinjava jinjava = new Jinjava();
properties.forEach((k, v) -> jinjava.getGlobalContext().registerTag(new Tag() {
@Override
public String interpret(TagNode tagNode, JinjavaInterpreter interpreter) {
if (v == null) {
interpreter.addError(new TemplateError(
TemplateError.ErrorType.FATAL,
TemplateError.ErrorReason.MISSING,
"Value of a required key is null",
k, 1, null));
}
return v;
}
@Override
public String getEndTagName() {
return null;
}
@Override
public String getName() {
return k;
}
}));
RenderResult renderResult = jinjava.renderForResult(template, properties);
if (renderResult.getErrors().size() == 0) {
return renderResult.getOutput();
} else {
throw new IllegalArgumentException(renderResult.getErrors().stream()
.map(Object::toString)
.collect(Collectors.joining(",")));
}
}
@Test
public void jinjavaWithCustomTags(){
String template = "Hallo {% hallo %}n" +
"I am {% unrendered %}";
Map<String, String> props = new HashMap<>();
props.put("hallo", "Welt");
//props.put("unrendered", "[try null here]");
System.out.println(fillTemplateTagsWithProperties(template, props));
}

其中输出:

Hallo Welt
I am [try null here]

或投掷:

### java.lang.IllegalArgumentException: TemplateError{severity=FATAL, reason=SYNTAX_ERROR, message=UnknownTagException: Syntax error in '{% unrendered %}': Unknown tag: unrendered, fieldName=null, lineno=2, item=OTHER}

最新更新