关于Springboot日期时间格式化处理方式总结

2020-03-04 12:03:52于丽
//继续跟进,看到了把
ConversionService conversionService = this.propertyEditorRegistry.getConversionService();
if (editor == null && conversionService != null && newValue != null && typeDescriptor != null) {
 TypeDescriptor sourceTypeDesc = TypeDescriptor.forObject(newValue);
 if (conversionService.canConvert(sourceTypeDesc, typeDescriptor)) {
  try {
   return (T) conversionService.convert(newValue, sourceTypeDesc, typeDescriptor);
  }
  catch (ConversionFailedException ex) {
   // fallback to default conversion logic below
   conversionAttemptEx = ex;
  }
 }
}

然后看下RequestResponseBodyMethodProcessor发现使用的转换器是HttpMessageConverter类型的:

//resolveArgument方法内部调用下面进行参数解析
Object arg = readWithMessageConverters(webRequest, parameter, parameter.getNestedGenericParameterType());

//step into readWithMessageConverters(),我们看到这里的Converter是HttpMessageConverter
for (HttpMessageConverter<?> converter : this.messageConverters) {
 Class<HttpMessageConverter<?>> converterType = (Class<HttpMessageConverter<?>>) converter.getClass();
 GenericHttpMessageConverter<?> genericConverter =
  (converter instanceof GenericHttpMessageConverter ? (GenericHttpMessageConverter<?>) converter : null);
 if (genericConverter != null ? genericConverter.canRead(targetType, contextClass, contentType) :
   (targetClass != null && converter.canRead(targetClass, contentType))) {
  if (message.hasBody()) {
   HttpInputMessage msgToUse =
    getAdvice().beforeBodyRead(message, parameter, targetType, converterType);
   body = (genericConverter != null ? genericConverter.read(targetType, contextClass, msgToUse) :
       ((HttpMessageConverter<T>) converter).read(targetClass, msgToUse));
   body = getAdvice().afterBodyRead(body, msgToUse, parameter, targetType, converterType);
  }
  else {
   body = getAdvice().handleEmptyBody(null, message, parameter, targetType, converterType);
  }
  break;
 }
}

最后看下PathVariableMethodArgumentResolver发现 和RequestParam走的执行路径一致(二者都是继承自AbstractNamedValueMethodArgumentResolver解析器),因此代码就不贴了。

总结

如果要转换request传来的参数到我们指定的类型,根据入参注解要进行区分:

如果是RequestBody,那么通过配置ObjectMapper(这个玩意儿会注入到Jackson的HttpMessagConverter里面,即MappingJackson2HttpMessageConverter中)来实现Json格式数据的序列化和反序列化; 如果是RequestParam或者PathVariable类型的参数,通过配置Converter实现参数转换(这些Converter会注入到ConversionService中)。

到此这篇关于关于Springboot日期时间格式化处理方式总结的文章就介绍到这了,更多相关Springboot 日期时间格式化内容请搜索易采站长站以前的文章或继续浏览下面的相关文章希望大家以后多多支持易采站长站!