在我最近的帖子之后:-
Cascading dropdown from HashMap in Thymeleaf Template
我在尝试使级联下拉框在我的SpringBoot Thymeleaf应用程序中工作方面取得了稳步的进展。
但是我目前正在努力将HashMap从我的MVC模型绑定到JavaScript变量,以便可以为生成下拉框选项的JavaScript代码使用。到目前为止,这是我尝试过的:-
-
在我的控制器类中,我创建一个HashMap,其中的键是类别(字符串),值是相关技能的列表,其中Skill类是包含技能名称和ID的Java数据对象: -
Map<String,List<Skill>> skillsMap = new HashMap();
-
在脚本部分的Thymeleaf模板上,我尝试将此HashMap绑定到变量。然后,第二步,我尝试从地图中检索列表之一,并将其分配给第二个变量:-
var skillsMapMap = [[${skillsMap}]];
var adminList = skillsMapMap.get('Admin');
-
当我在开发人员模式下运行代码时,我可以看到正在读取HashMap,并且正在尝试将其绑定到我的变量。这是我看到的调试行:-
var skillsMapMap = {Languages=[Python,SQL,PL/SQL,Java],Databases=[MySQL,Oracle,Mongo],Editors=[Word,TextPad,Notepad]};
乍一看看起来不错,它包含了我所有的数据,但是会引发以下错误:-
Uncaught Syntax Error: invalid shorthand property initializer
我搜索了此错误,发现它通常是由使用'='分配值而不是':'引起的,确实,我可以看到映射中的每个条目都是使用'='分配的
我非常感谢您对此问题的任何建议。也许我的整个方法是错误的,并且我不应该尝试以这种方式将复杂的模型对象绑定到JavaScript变量吗?还是我只需要稍微调整一下语法即可使其正常工作?非常感谢您阅读。
编辑:-
根据user1538301的建议,我现在尝试在添加到模型之前,使用Jackson ObjectMapper将HashMap转换为JSON字符串:-
String objectMapper = null;
try {
// Default constructor,which will construct the default JsonFactory as necessary,use SerializerProvider as its
// SerializerProvider,and BeanSerializerFactory as its SerializerFactory.
objectMapper = new ObjectMapper().writeValueAsString(skillsMap);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
model.addAttribute("skillsMapJson",objectMapper);
当我尝试将其绑定到我的JavaScript变量时,它失败了,因为所有引号均被转义:-
var skillsMapJson = {"Languages_OD":[{"id":66,"name":"SQL"},{"id":67,"name":"PL/SQL"}],etc,etc};
这引发了异常:Uncaught SyntaxError: Unexpected token &
我觉得这还差一点,如果JSON字符串包含引号而不是“,则Map将绑定到我的变量。任何其他建议,不胜感激!