当前位置: 首页 > Web前端 > JavaScript

Springboot改变了Thymeleaf中js块的对象序列化方式

时间:2023-03-27 00:39:25 JavaScript

Thymeleaf默认使用jackson对js块中的对象解析进行序列化,但在某些情况下我们需要更换为其他类型的序列化工具。例如:由于springboot默认使用jackson进行序列化,所以我们的脱敏规则也建立在jackson序列化时对属性进行脱敏。在thymeleaf模板中注入html块变量时,可以直接通过对象设置值,没有序列化动作,但是对于js块中的对象,需要javaScriptSerializer进行序列化,所以会出现脱敏数据list,如果你编辑页面的属性赋值是通过thymeleaf的js块,会触发jackson的脱敏规则。我们的对象中已经有很多日期等jackson属性注解,所以为了避免大规模改动,我选择更改thymeleafjs块的序列化方式。通过阅读Thymeleaf源码,我们发现javaScriptSerializer默认使用Jackson的ObjectMapper进行序列化,但是观察调用者,发现如果设置了javaScriptSerializer。不会使用杰克逊。除了jackson,还有一个默认的序列化器。由于属于内部类,无法在外部进行初始化。因此,我选择通过实现IStandardJavaScriptSerializer来定义自己的js对象序列化器,它使用fastjson。至此,我们就可以避免在js中使用对象时出现属性脱敏的情况了。我们首先需要实现一个可以序列化为JavaScript的通用接口类来自定义序列化包.io.作家;公共类FastJsonJavaScriptSerializer实现IStandardJavaScriptSerializer{@OverridepublicvoidserializeValue(Objectobject,Writerwriter){JSONObject.writeJSONString(writer,object);然后将自定义序列化器注入spring的thymeleaf模板解析器中间包.context.annotation.Configuration;导入org.springframework。util.CollectionUtils;importorg.thymeleaf.spring5.SpringTemplateEngine;importorg.thymeleaf.standard.StandardDialect;importjavax.annotation.PostConstruct;/****@authorzengzp*@date2022年6月14日17:38*@desc*/@Configurationpublic类ThymeleafConfig{@PostConstructpublicvoidinit(){SpringTemplateEnginespringTemplateEngine=SpringUtils.getBean(SpringTemplateEngine.class);StandardDialectstandardDialect=CollectionUtils.findValueOfType(springTemplateEngine.getDialects(),StandardDialect.class);standardDialect.setJavaScriptSerializer(newFastJsonJavaScriptSerializer());}}