Thymeleaf无法引用多层嵌套内部枚举类的问题咨询
问题描述
我有如下多层嵌套的类结构:
public class L1 { public static class L2 { public static class L3 { public enum MyEnum { E1, E2, E3 } } } }
我希望在Thymeleaf模板中引用MyEnum,按照常规语法尝试使用:
${T(com.my.packages.L1.L2.L3.MyEnum).E1}
但该写法无法生效,报错信息为:
EL1005E: Type cannot be found (com.my.packages.L1.L2.L3.MyEnum)
为排查问题,我逐步测试引用各类:首先尝试引用L1,使用${T(com.my.packages.L1).E1},报错提示L1无E1字段,说明成功引用了L1;同理引用L2也能成功,但引用L3时再次出现类型找不到的问题。
请问Thymeleaf对嵌套类是否存在深度限制?或是需要使用替代语法?网上相关资料均仅展示常规语法,未涉及多层嵌套场景。我因其他原因无法修改类结构,故不考虑将类拆分为非嵌套形式。
解决方案
Thymeleaf底层依赖的Spring EL(SpEL)在识别多层嵌套静态类时,不能直接用.分隔嵌套层级,而需要用$符号替代——这是因为Java编译器会把嵌套静态类编译成L1$L2$L3$MyEnum这样的字节码文件名,SpEL查找类时需要匹配这个实际的类名格式。
你需要把引用语法改成:
${T(com.my.packages.L1$L2$L3$MyEnum).E1}
这样就能正确识别到MyEnum类型并访问其枚举值了。
该写法不存在嵌套深度限制,只要按照「外部类$嵌套类1$嵌套类2$...$目标类」的格式拼接类路径即可。
内容的提问来源于stack exchange,提问作者Benjamin Basmaci
相关产品推荐
相关产品推荐

