欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

詳解SpringBoot時(shí)間參數(shù)處理完整解決方案

在JavaWeb程序的開發(fā)過程中,接口是前后端對(duì)接的主要窗口,而接口參數(shù)的接收有時(shí)候是一個(gè)令人頭疼的事情,這其中最困擾程序猿的,應(yīng)該是時(shí)間參數(shù)的接收。

站在用戶的角度思考問題,與客戶深入溝通,找到吳興網(wǎng)站設(shè)計(jì)與吳興網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:成都做網(wǎng)站、成都網(wǎng)站設(shè)計(jì)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名注冊(cè)、網(wǎng)頁空間、企業(yè)郵箱。業(yè)務(wù)覆蓋吳興地區(qū)。

比如:設(shè)置一個(gè)用戶的過期時(shí)間,前端到底以什么格式傳遞參數(shù)呢?時(shí)間戳?還是2019-12-01 22:13:00這種格式?還是其他格式?

今天我就來總結(jié)一下SpringBoot Web應(yīng)用接口接收時(shí)間類型參數(shù)的問題解決方案。

注:目前我對(duì)Spring源碼的掌握還不是很好,所以這一篇僅僅總結(jié)一下解決方法,后面感悟多了會(huì)重寫一下!

示例代碼請(qǐng)前往:https://github.com/laolunsi/spring-boot-examples

經(jīng)過簡(jiǎn)單的測(cè)試,我們知道:

  1. 不使用@RequestBody注解的情況下,所有時(shí)間類型參數(shù)都會(huì)引起報(bào)錯(cuò);
  2. 使用@RequestBody,前端傳遞時(shí)間戳或2019-11-22形式正常,傳遞2019-11-22 11:22:22報(bào)錯(cuò),其他格式同樣報(bào)錯(cuò)。

之前有接觸過類似的解決辦法,在類的屬性上加上@DateFormat注解,解決單個(gè)時(shí)間參數(shù)問題。

但是局限較多。

理想的解決方案是:一次配置,全局通用,多種格式,自動(dòng)轉(zhuǎn)換(朗朗上口嗷)

一、源碼簡(jiǎn)要分析

首先我們來簡(jiǎn)單分析一下源碼:

詳解SpringBoot時(shí)間參數(shù)處理完整解決方案

深入的就不解釋了(我現(xiàn)在也不懂🤦‍♂️)

簡(jiǎn)單來說,接口接收的參數(shù),首先被HandlerMethodArgumentResolver的實(shí)現(xiàn)類處理了一遍,將其轉(zhuǎn)換為我們需要的格式。

這里主要分為兩種情況:

  • 使用了@RequestBody的參數(shù),一般是對(duì)象接收,前端傳遞的通常是JSON形式
  • 其他接收參數(shù)的方式,比如@RequestAttribute,@RequestParam,或者默認(rèn)形式,前端傳遞的通常是表單參數(shù)、請(qǐng)求URL后綴參數(shù)等

二、解決方法

  1. 默認(rèn)形式,或使用@RequestAttribute,或使用@RequestParam,這樣的參數(shù),通過配置converter來解決問題
  2. 使用@RequestBody解析的參數(shù),通過在ObjectMapper中配置序列化和反序列化規(guī)則來處理

2.1 自定義converter

針對(duì)第一種情況,我們需要配置converter,這里介紹兩種方法:

  1. @ControllerAdvice + @InitBinder
  2. 直接使用@Bean定義converter類

首先我們這里需要一個(gè)DateConverter類,這個(gè)類實(shí)現(xiàn)了Converter接口,重寫了其中的convert方法,將String轉(zhuǎn)成Date類型:

我們這里定義了三種處理格式:

/**
 * 日期轉(zhuǎn)換類
 * 將標(biāo)準(zhǔn)日期、標(biāo)準(zhǔn)日期時(shí)間、時(shí)間戳轉(zhuǎn)換成Date類型
 */
/*@Deprecated*/
public class DateConverter implements Converter<String, Date> {

 private Logger logger = LoggerFactory.getLogger(DateConverter.class);

 private static final String dateFormat = "yyyy-MM-dd HH:mm:ss";
 private static final String shortDateFormat = "yyyy-MM-dd";
 private static final String timeStampFormat = "^\\d+$";

 @Override
 public Date convert(String value) {
  logger.info("轉(zhuǎn)換日期:" + value);

  if(value == null || value.trim().equals("") || value.equalsIgnoreCase("null")) {
   return null;
  }

  value = value.trim();

  try {
   if (value.contains("-")) {
    SimpleDateFormat formatter;
    if (value.contains(":")) {
     formatter = new SimpleDateFormat(dateFormat);
    } else {
     formatter = new SimpleDateFormat(shortDateFormat);
    }
    return formatter.parse(value);
   } else if (value.matches(timeStampFormat)) {
    Long lDate = new Long(value);
    return new Date(lDate);
   }
  } catch (Exception e) {
   throw new RuntimeException(String.format("parser %s to Date fail", value));
  }
  throw new RuntimeException(String.format("parser %s to Date fail", value));
 }
}

注:這個(gè)DateConverter類在下面都會(huì)用到。

import com.aegis.yqmanagecenter.config.date.DateConverter;
import com.aegis.yqmanagecenter.model.bean.common.JsonResult;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.core.convert.support.GenericConversionService;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.*;

import java.beans.PropertyEditorSupport;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

@ControllerAdvice
public class ControllerHandler {

 private Logger logger = LoggerFactory.getLogger(ControllerHandler.class);

 @InitBinder
 public void initBinder(WebDataBinder binder) {
  // 方法1,注冊(cè)converter
  GenericConversionService genericConversionService = (GenericConversionService) binder.getConversionService();
  if (genericConversionService != null) {
   genericConversionService.addConverter(new DateConverter());
  }

  // 方法2,定義單格式的日期轉(zhuǎn)換,可以通過替換格式,定義多個(gè)dateEditor,代碼不夠簡(jiǎn)潔
  DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  CustomDateEditor dateEditor = new CustomDateEditor(df, true);
  binder.registerCustomEditor(Date.class, dateEditor);


  // 方法3,同樣注冊(cè)converter
  binder.registerCustomEditor(Date.class, new PropertyEditorSupport() {
   @Override
   public void setAsText(String text) throws IllegalArgumentException {
    setValue(new DateConverter().convert(text));
   }
  });

 }
}

注:上面的三個(gè)方法都是利用@ControllerAdvice+@InitBinder來設(shè)置時(shí)間參數(shù)處理的,其中1和3都可以設(shè)置DateConverter,而方法2只能一個(gè)一個(gè)手動(dòng)設(shè)置格式。

這里需要注意,上述配置方法都無法解決Json格式數(shù)據(jù)中的時(shí)間參數(shù)接收問題。下面我們直接看完整的解決方案——將DateConverter注冊(cè)為組件,并使用ObjectMapper來配置時(shí)間參數(shù)的序列化(接口返回值)和反序列化形式(接口接收參數(shù))。

2.2 配置ObjectMapper以及完整解決方案

完整的解決方案:

/**
 * 日期轉(zhuǎn)換配置
 * 解決@RequestAttribute、@RequestParam和@RequestBody三種類型的時(shí)間類型參數(shù)接收與轉(zhuǎn)換問題
 */
@Configuration
public class DateConfig {

 /**
  * 默認(rèn)日期時(shí)間格式
  */
 public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";

 /**
  * Date轉(zhuǎn)換器,用于轉(zhuǎn)換RequestParam和PathVariable參數(shù)
  */
 @Bean
 public Converter<String, Date> dateConverter() {
  return new DateConverter();
 }

 /**
  * Json序列化和反序列化轉(zhuǎn)換器,用于轉(zhuǎn)換Post請(qǐng)求體中的json以及將我們的對(duì)象序列化為返回響應(yīng)的json
  * 使用@RequestBody注解的對(duì)象中的Date類型將從這里被轉(zhuǎn)換
  */
 @Bean
 public ObjectMapper objectMapper(){
  ObjectMapper objectMapper = new ObjectMapper();
  objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
  objectMapper.disable(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE);

  JavaTimeModule javaTimeModule = new JavaTimeModule();

  //Date序列化和反序列化
  javaTimeModule.addSerializer(Date.class, new JsonSerializer<Date>() {
   @Override
   public void serialize(Date date, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
    SimpleDateFormat formatter = new SimpleDateFormat(DEFAULT_DATE_TIME_FORMAT);
    String formattedDate = formatter.format(date);
    jsonGenerator.writeString(formattedDate);
   }
  });
  javaTimeModule.addDeserializer(Date.class, new JsonDeserializer<Date>() {
   @Override
   public Date deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
    return new DateConverter().convert(jsonParser.getText());
   }
  });

  objectMapper.registerModule(javaTimeModule);
  return objectMapper;
 }

}

參考:簡(jiǎn)書-Spring中使用LocalDateTime、LocalDate等參數(shù)作為入?yún)?/p>

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。

當(dāng)前標(biāo)題:詳解SpringBoot時(shí)間參數(shù)處理完整解決方案
地址分享:http://aaarwkj.com/article28/psoicp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供自適應(yīng)網(wǎng)站、網(wǎng)站改版、企業(yè)建站外貿(mào)建站、Google、定制開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

微信小程序開發(fā)
人妻一区日韩二区国产| 日本东京热免一区二区| 亚洲综合国产中文字幕| 成熟性性生活免费视频| 久草午夜福利视频免费观看| 亚洲精品黄色片中文字幕| 亚洲成人有码在线观看| 一本色道久久亚洲综合精品蜜桃 | 男人天堂插插综合搜索| 久久精品国产亚洲av制服| 国产在线成年人免费观看| 久久精品国产亚洲av不卡| 日本韩国一级黄色免费| 久久精品亚洲av三区麻豆| 久久亚洲精品中文字幕一| 亚洲欧洲一区二区中文字幕| 国产一区二区91精品| 日本免费一区二区三个| 日韩精品熟女中文字幕| 午夜性色福利视频你懂的| 久久麻豆精亚洲av品国产一区| 日本高清不卡免费在线观看视频一二三区 | 国产老熟女高潮一区二区| 欧美日韩在线一区二区精品| 日本精品av一区二区| 激情av一区二区不卡| 中文字幕成人资源网站| 丝袜美腿亚洲综合一区| 99国产综合精品女| 色婷婷一区二区三区影片| 欧美日韩在线视频一区| 97在线观看全部视频| 精品午夜免费福利视频| 六月丁香花五月婷婷| 中文字幕二区三区av| 日韩欧美国产麻豆一区精品| 在线看黄色片播放器日韩| 避暑地堕落人妻中文字幕| 正在播放日韩黄色精品| 中文字幕黄色三级视频| 激情影院在线观看福利|