带有点符号的Thymeleaf 3地图访问

时间:2018-07-03 20:56:45

标签: java spring thymeleaf spring-el

在春季4.3.x环境中将百里香叶从2.x更新到3.x时,我遇到的问题是删除了 org.thymeleaf.context.VariablesMap 类。 我正在使用以下模型结构

public interface Model extends Map<String, Object>, Serializable {...}
public class BaseModel extends VariablesMap<String, Object> implements Model {...}

VariablesMap实现了OGNL MapPropertyAccessor,无论是否存在键 alternativeLanguages

,该OGNL MapPropertyAccessor都可以使用点符号来访问模型。
${meta.alternativeLanguages}

现在使用百里香3,Spring集成仅使用SpringEL,并且当键 alternativeLanguages 不存在时,SpringEL MapAccessor引发异常

Caused by: org.springframework.expression.spel.SpelEvaluationException: EL1008E:(pos 28): Property or field 'alternativeLanguages' cannot be found on object of type 'd.v.BaseModel' - maybe not public?

有没有一种方法可以避免将所有模板迁移到

${meta['alternativeLanguages']}

2 个答案:

答案 0 :(得分:0)

这只是部分答案,因为我还没有尝试过,但是我猜您将不得不基于org.springframework.expression.PropertyAccessor实现自己的org.springframework.context.expression.MapAccessor,而canRead并没有完全按照自己的意愿做。您可能希望始终为read方法返回true,并处理PropertyAccessor方法以返回在地图没有值的情况下要返回的内容。在里面。

然后,我认为您需要以某种方式了解Thymeleaf如何创建其SpEL上下文以注册该自定义{{1}},我希望这是可能的,但是我没有快速浏览一下。

我希望这能使您指向正确的方向。

答案 1 :(得分:-1)

在这种情况下,您可以使用安全的null导航: ${meta?.alternativeLanguages} https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#expressions-operator-safe-navigation