@JsonSerialize(using= JsonDateSerializer.class)private Date taskEndTime;@ApiModelProperty(value = "检查日期")@JsonFormat(pattern = "yyyy-MM-dd")private LocalDate checkDate;


//在反序列化时忽略在 json 中存在但 Java 对象不存在的属性mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,false);//在序列化时日期格式默认为 yyyy-MM-dd'T'HH:mm:ss.SSSZ ,比如如果一个类中有private Date date;这种日期属性,序列化后为:{"date" : 1413800730456},若不为true,则为{"date" : "2014-10-20T10:26:06.604+0000"}mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,false);//在序列化时忽略值为 null 的属性mapper.setSerializationInclusion(Include.NON_NULL);//忽略值为默认值的属性mapper.setDefaultPropertyInclusion(Include.NON_DEFAULT);// 美化输出mapper.enable(SerializationFeature.INDENT_OUTPUT);// 允许序列化空的POJO类// (否则会抛出异常)mapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);// 把java.util.Date, Calendar输出为数字(时间戳)mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);// 在遇到未知属性的时候不抛出异常mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);// 强制JSON 空字符串("")转换为null对象值:mapper.enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);// 在JSON中允许C/C++ 样式的注释(非标准,默认禁用)mapper.configure(JsonParser.Feature.ALLOW_COMMENTS, true);// 允许没有引号的字段名(非标准)mapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);// 允许单引号(非标准)mapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);// 强制转义非ASCII字符mapper.configure(JsonGenerator.Feature.ESCAPE_NON_ASCII, true);// 将内容包裹为一个JSON属性,属性名由@JsonRootName注解指定mapper.configure(SerializationFeature.WRAP_ROOT_VALUE, true);//序列化枚举是以toString()来输出,默认false,即默认以name()来输出mapper.configure(SerializationFeature.WRITE_ENUMS_USING_TO_STRING,true);//序列化Map时对key进行排序操作,默认falsemapper.configure(SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS,true);//序列化char[]时以json数组输出,默认falsemapper.configure(SerializationFeature.WRITE_CHAR_ARRAYS_AS_JSON_ARRAYS,true);//序列化BigDecimal时之间输出原始数字还是科学计数,默认false,即是否以toPlainString()科学计数方式来输出mapper.configure(SerializationFeature.WRITE_CHAR_ARRAYS_AS_JSON_ARRAYS,true);
/** * java 8 LocalDateTime转换器 * * @author wangling */public class LocalDateTimeFormatter implements Formatter<LocalDateTime> { private final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); @Override public LocalDateTime parse(String text, Locale locale) throws ParseException { return LocalDateTime.parse(text, formatter); } @Override public String print(LocalDateTime object, Locale locale) { return formatter.format(object); }}
/** * java 8 localDate转换器 * * @author wangling */public class LocalDateFormatter implements Formatter<LocalDate> { private final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); @Override public LocalDate parse(String text, Locale locale) throws ParseException { return LocalDate.parse(text, formatter); } @Override public String print(LocalDate object, Locale locale) { return formatter.format(object); }}
/** * 项目全局配置类 * * @author wangling * @date 2022/06/10 */@Configuration@RequiredArgsConstructorpublic class WebConfig implements WebMvcConfigurer { @Override public void addFormatters(FormatterRegistry registry) { registry.addFormatterForFieldType(LocalDate.class, new LocalDateFormatter()); registry.addFormatterForFieldType(LocalDateTime.class, new LocalDateTimeFormatter()); } @Bean @Primary public ObjectMapper ObjectMapper() { String dateTimeFormat = "yyyy-MM-dd HH:mm:ss"; String dateFormat = "yyyy-MM-dd"; String timeFormat = "HH:mm:ss"; ObjectMapper objectMapper = new ObjectMapper(); objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); JavaTimeModule javaTimeModule = new JavaTimeModule(); // 序列化 javaTimeModule.addSerializer( LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(dateTimeFormat))); javaTimeModule.addSerializer( LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern(dateFormat))); javaTimeModule.addSerializer( LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern(timeFormat))); javaTimeModule.addSerializer( Date.class, new DateSerializer(false, new SimpleDateFormat(dateTimeFormat))); // 反序列化 javaTimeModule.addDeserializer( LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(dateTimeFormat))); javaTimeModule.addDeserializer( LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern(dateFormat))); javaTimeModule.addDeserializer( LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern(timeFormat))); javaTimeModule.addDeserializer(Date.class, new DateDeserializers.DateDeserializer() { @SneakyThrows @Override public Date deserialize(JsonParser jsonParser, DeserializationContext dc) { String text = jsonParser.getText().trim(); SimpleDateFormat sdf = new SimpleDateFormat(dateTimeFormat); return sdf.parse(text); } }); javaTimeModule.addSerializer(Long.class, ToStringSerializer.instance); javaTimeModule.addSerializer(BigInteger.class, ToStringSerializer.instance); objectMapper.registerModule(javaTimeModule); return objectMapper; }}


/** * 项目全局配置类 * * @author wangling * @date 2022/06/10 */@Configurationpublic class MvcInterceptorConfig extends WebMvcConfigurationSupport { @Override protected void addFormatters(FormatterRegistry registry) { // 用于get 全局格式化日期转换 registry.addFormatterForFieldType(LocalDate.class, new LocalDateFormatter()); registry.addFormatterForFieldType(LocalDateTime.class, new LocalDateTimeFormatter()); } @Override protected void extendMessageConverters(List<HttpMessageConverter<?>> converters) { // 代替框架默认的JackSon配置 用于post 全局格式化日期转换,long转字符串 MappingJackson2HttpMessageConverter jackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter(); jackson2HttpMessageConverter.setObjectMapper(ObjectMapper()); // 基于顺序,先执行自定义的 converters.add(0, jackson2HttpMessageConverter); } private ObjectMapper ObjectMapper() { String dateTimeFormat = "yyyy-MM-dd HH:mm:ss"; String dateFormat = "yyyy-MM-dd"; String timeFormat = "HH:mm:ss"; ObjectMapper objectMapper = new ObjectMapper(); //忽略空Bean转json的错误 objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); //忽略 在json字符串中存在,但是在对象中不存在对应属性的情况,防止错误。 // 例如json数据中多出字段,而对象中没有此字段。如果设置true,抛出异常,因为字段不对应;false则忽略多出的字段,默认值为null,将其他字段反序列化成功 objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); JavaTimeModule javaTimeModule = new JavaTimeModule(); // 序列化 javaTimeModule.addSerializer( LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(dateTimeFormat))); javaTimeModule.addSerializer( LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern(dateFormat))); javaTimeModule.addSerializer( LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern(timeFormat))); javaTimeModule.addSerializer( Date.class, new DateSerializer(false, new SimpleDateFormat(dateTimeFormat))); // 反序列化 javaTimeModule.addDeserializer( LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(dateTimeFormat))); javaTimeModule.addDeserializer( LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern(dateFormat))); javaTimeModule.addDeserializer( LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern(timeFormat))); javaTimeModule.addDeserializer(Date.class, new DateDeserializers.DateDeserializer() { @SneakyThrows @Override public Date deserialize(JsonParser jsonParser, DeserializationContext dc) { String text = jsonParser.getText().trim(); SimpleDateFormat sdf = new SimpleDateFormat(dateTimeFormat); return sdf.parse(text); } }); javaTimeModule.addSerializer(Long.class, ToStringSerializer.instance); javaTimeModule.addSerializer(BigInteger.class, ToStringSerializer.instance); objectMapper.registerModule(javaTimeModule); return objectMapper; }}
WebMvcConfigurer 接口提供了很多方法让开发者来定制SpringMVC的配置。
微信赞赏
支付宝赞赏