SpringBoot中Jackson的使用:注册全局的序列化和反序列化器
什么情况下会用到?
当我们需要对在接口中,对接收参数做一些复杂格式校验的时候。例如有个需求,需要对BigDecimal类型的入参做格式校验,并且校验不通过时,返回对应的错误信息。
创建序列化器和反序列化器
BigDecimalSerializer.java
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import java.io.IOException;
import java.math.BigDecimal;
import java.math.RoundingMode;
public class BigDecimalSerializer extends JsonSerializer<BigDecimal> {
@Override
public void serialize(BigDecimal bigDecimal, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
if (bigDecimal == null) {
jsonGenerator.writeString("0.00");
}else {
// 保留两位小数
bigDecimal = bigDecimal.setScale(2, RoundingMode.UP);
// 不使用科学计数法
jsonGenerator.writeString(bigDecimal.toPlainString());
}
}
}
BigDecimalDeserializer.java
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fy.chars.StringUtils;
import com.fy.exception.BizException;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.function.Predicate;
import java.util.regex.Pattern;
public class BigDecimalDeserializer extends JsonDeserializer<BigDecimal> {
public static final String PATTERN = "^[0-9]*\\.?[0-9]{0,2}$";
public static final Predicate<String> PATTERN_BIG_DECIMAL = Pattern.compile(PATTERN).asPredicate();
@Override
public BigDecimal deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {
String s = jsonParser.readValueAs(String.class);
if (StringUtils.isBlank(s)) return null;
if (PATTERN_BIG_DECIMAL.test(s)) {
return new BigDecimal(s);
}
throw new BizException("BigDecimal格式错误");
}
}
注册到全局
GlobalJacksonConfiguration.java
import com.fasterxml.jackson.databind.module.SimpleModule;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
import java.math.BigDecimal;
import java.util.List;
@Configuration
public class GlobalJacksonConfiguration extends WebMvcConfigurationSupport {
@Override
protected void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
SimpleModule module = new SimpleModule();
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
module.addDeserializer(BigDecimal.class, new BigDecimalDeserializer());
module.addSerializer(new BigDecimalSerializer());
converter.getobjectMapper().registerModule(module);
converters.add(converter);
super.configureMessageConverters(converters);
}
}
完毕
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。