接口报错-JSON parse error: Cannot deserialize value of type java.lang.Integer
from Boolean value
入参是Boolean,接收是Integer,导致报错。
自定义反序列化器,将boolean转integer。
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import java.io.IOException;
public class CustomDeserializer extends JsonDeserializer<Integer> {
@Override
public Integer deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
// 在这里处理类型转换逻辑,例如将布尔值转换为整数
boolean value = p.getBooleanValue();
return value ? 1 : 0;
}
}
使用这个反序列化器有几种方式。
一、在类上使用注解@JsonDeserialize
二、全局使用,加进配置里。
补充:
对于「Post」报文体来说,实际上我只需要改变的是「Jackson ObjectMapper」,不需要自定义整个MappingJackson2HttpMessageConverter ,只需要自定义Jackson ObjectMapper。
代码如下:
反序列化器:将入参的空字符串转Null
public class EmptyString2NullDescrializer extends JsonDeserializer<String> {
@Override
public String deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
String value = jsonParser.getValueAsString();
if (value == null || "".equals(value.trim())) {
return null;
}
return value;
}
}
全局配置
将反序列化器加入到容器的配置里,实现对所有的入参都能处理。
新方法:自定义Jackson ObjectMapper
@Bean
public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
return new Jackson2ObjectMapperBuilderCustomizer() {
@Override
public void customize(Jackson2ObjectMapperBuilder jacksonObjectMapperBuilder) {
jacksonObjectMapperBuilder
.deserializerByType(String.class, new StdScalarDeserializer<String>(String.class) {
@Override
public String deserialize(JsonParser jsonParser, DeserializationContext ctx)
throws IOException {
// 重点在这儿:如果为空白则返回null
String value = jsonParser.getValueAsString();
if (value == null || "".equals(value.trim())) {
return null;
}
return value;
}
});
}
};
}
老方法:自定义整个MappingJackson2HttpMessageConverter
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import org.springframework.context.annotation.Bean;
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.WebMvcConfigurer;
import java.text.SimpleDateFormat;
import java.util.List;
/**
* 前端参数过器配置(空串和空格反序列化)
**/
@Configuration
public class WebMvcSerializationConfig implements WebMvcConfigurer {
@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(mappingJackson2HttpMessageConverter());
}
@Bean
public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
ObjectMapper mapper = new ObjectMapper();
//格式化前端日期为 yyyy-MM-dd HH:mm:ss 可选
mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
SimpleModule module = new SimpleModule();
module.addDeserializer(String.class, new EmptyString2NullDescrializer(String.class));
mapper.registerModule(module);
converter.setObjectMapper(mapper);
return converter;
}
}
SpringBoot2.x 将前端空字符请求参数转为null_spring boot 请求json字符串空串转换成null-CSDN博客
SpringBoot项目,如何优雅的把接口参数中的空白值替换为null值?
MappingJackson2HttpMessageConverter使用及jackson配置原理和避坑说明-CSDN博客