在默认状况下Thymeleaf对于js块中的对象解析是应用jackson进行序列化,然而特定状况下咱们须要更换成其余类型的序列话工具。
例如:因为springboot默认的序列化应用的jackson,而咱们的脱敏规定也是建设在jackson序列化时对属性进行脱敏。
在thymeleaf模板中注入html块变量时能够间接通过对象设值,不存在序列化的动作,然而对于js块中的对象须要javaScriptSerializer进行序列化
因而会存在列表中是脱敏的数据,进行编辑页面如果属性赋值是通过thymeleaf的js块,则会触发jackson的脱敏规定。
咱们对象中曾经存在很多jackson属性的注解例如日期等,所以为了防止大规模改变,我抉择更改thymeleafjs块的序列化形式。
通过浏览Thymeleaf源码咱们发现javaScriptSerializer默认应用的为Jackson的ObjectMapper进行序列化,然而察看调用方咱们发现如果曾经设置javaScriptSerializer。
则不会应用jackson,除jackson之外还存在一个默认的序列化器,因为其属于外部类,无奈内部调用初始化,因此我抉择通过实现IStandardJavaScriptSerializer来
定义本人的js对象序列化器,其中应用fastjson,至此咱们能够躲避在js中应用对象时,属性被脱敏的状况产生。

咱们首先须要实现能够作为JavaScript序列化的通用接口类来自定义序列化器

package com.common.nmg.utils;import com.alibaba.fastjson.JSONObject;import org.thymeleaf.standard.serializer.IStandardJavaScriptSerializer;import java.io.Writer;public class FastJsonJavaScriptSerializer implements IStandardJavaScriptSerializer {    @Override    public void serializeValue(Object object, Writer writer) {        JSONObject.writeJSONString(writer,object);    }}

再将自定义的序列化器注入到spring的thymeleaf模板解析器中

package com.nmg.framework.config;import com.nmg.common.utils.FastJsonJavaScriptSerializer;import com.nmg.common.utils.spring.SpringUtils;import org.springframework.context.annotation.Configuration;import org.springframework.util.CollectionUtils;import org.thymeleaf.spring5.SpringTemplateEngine;import org.thymeleaf.standard.StandardDialect;import javax.annotation.PostConstruct;/** * * @author zengzp * @date 2022年6月14日 17点38分 * @desc */@Configurationpublic class ThymeleafConfig {    @PostConstruct    public void init() {        SpringTemplateEngine springTemplateEngine = SpringUtils.getBean(SpringTemplateEngine.class);        StandardDialect standardDialect = CollectionUtils.findValueOfType(springTemplateEngine.getDialects(), StandardDialect.class);        standardDialect.setJavaScriptSerializer(new FastJsonJavaScriptSerializer());    }}