中文字幕精品亚洲无线码二区,国产黄a三级三级三级看三级,亚洲七七久久桃花影院,丰满少妇被猛烈进入,国产小视频在线观看网站

springboot~http請求和響應的字段格式化

我們以日期類型為例,把它作為請求參數和響應字段進行說明,默認的日期字段格式為ISO 8601標準,DateTimeFormat.ISO.DATE_TIME,格式為yyyy-MM-dd'T'HH:mm:ss,與咱們常用的日期時間有所(suo)不同,所(suo)以(yi)咱們需(xu)要重新定義(yi)一下。

本文功能

  • 統一了日期參數,由傳入的字符串傳為java對象
  • 統一了返回實體的日期字段,默認是iso8601
  • 統一了返回實體的長整型返回值精度丟失問題,統一傳為字符串

請求參數統一處理

  • 請求參數前端輸入的是字符串
  • 接口類型LocalDate 傳入的格式匹配yyyy-MM-dd
  • 接口類型LocalTime 傳入的格式匹配HH:mm:ss
  • 接口類型LocalDateTime 傳入的格式匹配yyyy-MM-dd'T'HH:mm:ss
/**
 * WebMvc配置.
 *
 * @author lind
 * @date 2023/5/24 14:46
 * @since 1.0.0
 */
@Configuration
public class WebMvcConfiguration implements WebMvcConfigurer {

	static DateTimeFormatter DT_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
	static DateTimeFormatter T_FORMATTER = DateTimeFormatter.ofPattern("HH:mm:ss");
	static DateTimeFormatter D_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");

	/**
	 * 增加GET請求參數中時間類型轉換,注意是LocalTime,LocalDate和LocalDateTime,因為你配置的是DateTimeFormatter.
	 * <ul>
	 * <li>HH:mm:ss -> LocalTime</li>
	 * <li>yyyy-MM-dd -> LocalDate</li>
	 * <li>yyyy-MM-dd HH:mm:ss -> LocalDateTime</li>
	 * </ul>
	 * @param registry
	 */
	@Override
	public void addFormatters(FormatterRegistry registry) {
		DateTimeFormatterRegistrar registrar = new DateTimeFormatterRegistrar();
		// 對輸入參數轉為LocalDate,LocalTime,LocalDateTime格式化
		registrar.setTimeFormatter(T_FORMATTER);
		registrar.setDateFormatter(D_FORMATTER);
		registrar.setDateTimeFormatter(DT_FORMATTER);
		registrar.registerFormatters(registry);
		// 對輸入參數轉為java.util.Date格式化
		registry.addFormatter(new CompositeFormatter());
	}

	/**
	 * java.util.Date日期格式化.
	 */
	private static class CompositeFormatter implements Formatter<Date> {

		private final List<Formatter<Date>> formatters = Arrays.asList(new DateFormatter("yyyy-MM-dd HH:mm:ss"),
				new DateFormatter("yyyy-MM-dd"), new DateFormatter("HH:mm:ss"));

		@Override
		public Date parse(String text, Locale locale) throws ParseException {
			for (Formatter<Date> formatter : formatters) {
				try {
					return formatter.parse(text, locale);
				}
				catch (ParseException ignored) {
				}
			}
			throw new ParseException("Unable to parse date: " + text, 0);
		}

		@Override
		public String print(Date date, Locale locale) {
			return formatters.get(0).print(date, locale);
		}

	}

}

響應體中字段的格式化

  • 默認采用jackson進行java對象到json的格式化,我們也以這個為例
  • 其實json序列化方式需要自行實現
/**
 * json響應配置. Long到字符串,避免Long被截取 Date日期格式化 LocalDate日期格式化
 *
 * @author lind
 * @date 2023-08-16
 */
@Configuration
@ConditionalOnClass(ObjectMapper.class)
@AutoConfigureBefore(JacksonAutoConfiguration.class) // 在JacksonAutoConfiguration之前加載
public class JacksonConfiguration {

	@Bean
	@ConditionalOnMissingBean
	public Jackson2ObjectMapperBuilderCustomizer customizer() {
		return builder -> {
			builder.locale(Locale.CHINA);
			builder.timeZone(TimeZone.getTimeZone(ZoneId.systemDefault()));
			// 早期的Date類型的格式化,默認的返回日期2022-04-21T10:28:00,添加后返回日期2022-04-21 10:28:07
			builder.simpleDateFormat(JavaTimeModule.NORM_DATETIME_PATTERN);
			// java8建議的LocalDate,LocalDateTime,LocalTime的格式化
			builder.modules(new JavaTimeModule());
			// Long 類型轉 String 類型,避免js丟失精度
			builder.serializerByType(Long.class, ToStringSerializer.instance);
		};
	}

}

JavaTimeModule可以根據自(zi)己(ji)的地區去配(pei)置

public class JavaTimeModule extends SimpleModule {

	public static final String NORM_DATETIME_PATTERN = "yyyy-MM-dd HH:mm:ss";

	public static final DateTimeFormatter NORM_DATETIME_FORMATTER = createFormatter(NORM_DATETIME_PATTERN);

	public JavaTimeModule() {
		super(PackageVersion.VERSION);

		// ======================= 時間序列化規則 ===============================
		// yyyy-MM-dd HH:mm:ss
		this.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(NORM_DATETIME_FORMATTER));
		// yyyy-MM-dd
		this.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ISO_LOCAL_DATE));
		// HH:mm:ss
		this.addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ISO_LOCAL_TIME));
		// Instant 類型序列化
		this.addSerializer(Instant.class, InstantSerializer.INSTANCE);

		// ======================= 時間反序列化規則 ==============================
		// yyyy-MM-dd HH:mm:ss
		this.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(NORM_DATETIME_FORMATTER));
		// yyyy-MM-dd
		this.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ISO_LOCAL_DATE));
		// HH:mm:ss
		this.addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ISO_LOCAL_TIME));
		// Instant 反序列化
		this.addDeserializer(Instant.class, InstantDeserializer.INSTANT);
	}

	public static DateTimeFormatter createFormatter(String pattern) {
		return DateTimeFormatter.ofPattern(pattern, Locale.getDefault()).withZone(ZoneId.systemDefault());
	}

}
posted @ 2025-02-05 10:57  張占嶺  閱讀(284)  評論(0)    收藏  舉報