在春季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']}
答案 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