从前端接收数据反序列化成类,如果时间格式不一致可能会反序列化失败
public class StorageDTO implements Serializable { private static final long serialVersionUID = 1L ; . . . . . . @JsonFormat ( pattern = "yyyy-MM-dd" ) @JsonDeserialize ( using = CustomLocalDateTimeDeserializer . class ) @ApiModelProperty ( "产生时间" ) private LocalDateTime generateTime; }
package com. . . . . . config; import com. fasterxml. jackson. core. JsonParser ;
import com. fasterxml. jackson. core. JsonProcessingException ;
import com. fasterxml. jackson. databind. DeserializationContext ;
import com. fasterxml. jackson. datatype. jsr310. deser. LocalDateDeserializer ;
import com. fasterxml. jackson. datatype. jsr310. deser. LocalDateTimeDeserializer ; import java. io. IOException ;
import java. time. LocalDate ;
import java. time. LocalDateTime ;
import java. time. format. DateTimeFormatter ; public class CustomLocalDateTimeDeserializer extends LocalDateTimeDeserializer { private static final long serialVersionUID = 1L ; private static final DateTimeFormatter DEFAULT_FORMATTER = DateTimeFormatter . ISO_LOCAL_DATE_TIME ; private CustomLocalDateTimeDeserializer ( ) { super ( DEFAULT_FORMATTER ) ; } public CustomLocalDateTimeDeserializer ( DateTimeFormatter formatter) { super ( formatter) ; } @Override protected LocalDateTimeDeserializer withDateFormat ( DateTimeFormatter formatter) { return new CustomLocalDateTimeDeserializer ( formatter) ; } @Override public LocalDateTime deserialize ( JsonParser p, DeserializationContext ctxt) throws IOException , JsonProcessingException { LocalDate localDate = new LocalDateDeserializer ( _formatter) . deserialize ( p, ctxt) ; LocalDateTime localDateTime = localDate. atStartOfDay ( ) ; return localDateTime; }
}
后端统一返回格式化后的日期
package com. . . . . . . config; import com. fasterxml. jackson. annotation. JsonInclude ;
import com. fasterxml. jackson. databind. DeserializationFeature ;
import com. fasterxml. jackson. databind. ObjectMapper ;
import com. fasterxml. jackson. databind. SerializationFeature ;
import com. fasterxml. jackson. datatype. jsr310. JavaTimeModule ;
import com. fasterxml. jackson. datatype. jsr310. deser. LocalDateDeserializer ;
import com. fasterxml. jackson. datatype. jsr310. deser. LocalDateTimeDeserializer ;
import com. fasterxml. jackson. datatype. jsr310. deser. LocalTimeDeserializer ;
import com. fasterxml. jackson. datatype. jsr310. ser. LocalDateSerializer ;
import com. fasterxml. jackson. datatype. jsr310. ser. LocalDateTimeSerializer ;
import com. fasterxml. jackson. datatype. jsr310. ser. LocalTimeSerializer ;
import com. . . . . . . filters. ReHttpServletRequestFilter;
import com. . . . . . . interceptor. DeviceHandlerInterceptor;
import org. springframework. beans. factory. annotation. Autowired ;
import org. springframework. boot. web. servlet. FilterRegistrationBean ;
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. cors. CorsConfiguration ;
import org. springframework. web. cors. UrlBasedCorsConfigurationSource ;
import org. springframework. web. filter. CorsFilter ;
import org. springframework. web. servlet. config. annotation. InterceptorRegistry ;
import org. springframework. web. servlet. config. annotation. WebMvcConfigurer ; import java. text. SimpleDateFormat ;
import java. time. LocalDate ;
import java. time. LocalDateTime ;
import java. time. LocalTime ;
import java. time. format. DateTimeFormatter ;
import java. util. List ;
import java. util. TimeZone ;
@Configuration
public class WebMvcConfig implements WebMvcConfigurer { public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss" ; public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd" ; public static final String DEFAULT_TIME_FORMAT = "HH:mm:ss" ; @Autowired private DeviceHandlerInterceptor deviceHandlerInterceptor; @Override public void addInterceptors ( InterceptorRegistry registry) { registry. addInterceptor ( deviceHandlerInterceptor) . addPathPatterns ( "/test/**" ) . excludePathPatterns ( "/testPage/**" ) ; } @Bean public FilterRegistrationBean httpServletRequestReplacedRegistration ( ) { FilterRegistrationBean registration = new FilterRegistrationBean ( ) ; registration. setFilter ( new ReHttpServletRequestFilter ( ) ) ; registration. addUrlPatterns ( "/*" ) ; registration. addInitParameter ( "paramName" , "paramValue" ) ; registration. setName ( "reHttpServletRequestFilter" ) ; registration. setOrder ( 1 ) ; return registration; } @Bean public CorsFilter corsFilter ( ) { CorsConfiguration config = new CorsConfiguration ( ) ; config. setAllowCredentials ( true ) ; config. addAllowedOriginPattern ( "*" ) ; config. addAllowedHeader ( "*" ) ; config. addAllowedMethod ( "*" ) ; config. setMaxAge ( 1800L ) ; UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource ( ) ; source. registerCorsConfiguration ( "/**" , config) ; return new CorsFilter ( source) ; } @Bean public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter ( ) { MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter ( ) ; ObjectMapper objectMapper = new ObjectMapper ( ) ; objectMapper. setDateFormat ( new SimpleDateFormat ( "yyyy-MM-dd HH:mm:ss" ) ) ; objectMapper. configure ( DeserializationFeature . FAIL_ON_UNKNOWN_PROPERTIES , false ) ; objectMapper. configure ( SerializationFeature . FAIL_ON_EMPTY_BEANS , false ) ; objectMapper. configure ( SerializationFeature . INDENT_OUTPUT , true ) ; objectMapper. setSerializationInclusion ( JsonInclude. Include . NON_NULL ) ; objectMapper. setTimeZone ( TimeZone . getTimeZone ( "GMT+8:00" ) ) ; objectMapper. setDateFormat ( new SimpleDateFormat ( DEFAULT_DATE_TIME_FORMAT ) ) ; JavaTimeModule javaTimeModule = new JavaTimeModule ( ) ; javaTimeModule. addSerializer ( LocalDateTime . class , new LocalDateTimeSerializer ( DateTimeFormatter . ofPattern ( DEFAULT_DATE_TIME_FORMAT ) ) ) ; javaTimeModule. addSerializer ( LocalDate . class , new LocalDateSerializer ( DateTimeFormatter . ofPattern ( DEFAULT_DATE_FORMAT ) ) ) ; javaTimeModule. addSerializer ( LocalTime . class , new LocalTimeSerializer ( DateTimeFormatter . ofPattern ( DEFAULT_TIME_FORMAT ) ) ) ; javaTimeModule. addDeserializer ( LocalDateTime . class , new LocalDateTimeDeserializer ( DateTimeFormatter . ofPattern ( DEFAULT_DATE_TIME_FORMAT ) ) ) ; javaTimeModule. addDeserializer ( LocalDate . class , new LocalDateDeserializer ( DateTimeFormatter . ofPattern ( DEFAULT_DATE_FORMAT ) ) ) ; javaTimeModule. addDeserializer ( LocalTime . class , new LocalTimeDeserializer ( DateTimeFormatter . ofPattern ( DEFAULT_TIME_FORMAT ) ) ) ; objectMapper. registerModule ( javaTimeModule) ; mappingJackson2HttpMessageConverter. setObjectMapper ( objectMapper) ; return mappingJackson2HttpMessageConverter; } @Override public void extendMessageConverters ( List < HttpMessageConverter < ? > > converters) { converters. add ( mappingJackson2HttpMessageConverter ( ) ) ; } }