AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當前位置:首頁 > 科技  > 軟件

SpringBoot優(yōu)雅定制接口參數(shù)格式轉(zhuǎn)換

來源: 責編: 時間:2024-05-29 08:52:24 156觀看
導讀環(huán)境:SpringBoot3.2.51. 簡介在Spring MVC中,數(shù)據(jù)類型的轉(zhuǎn)換、自動綁定和格式化是一個非常強大的功能,Spring內(nèi)置了非常多的數(shù)據(jù)類型轉(zhuǎn)換器。如在一個HTTP請求中SpringMVC默認就具備將JSON個數(shù)的數(shù)據(jù)轉(zhuǎn)換為Java對象,將一

環(huán)境:SpringBoot3.2.5Xzy28資訊網(wǎng)——每日最新資訊28at.com

1. 簡介

在Spring MVC中,數(shù)據(jù)類型的轉(zhuǎn)換、自動綁定和格式化是一個非常強大的功能,Spring內(nèi)置了非常多的數(shù)據(jù)類型轉(zhuǎn)換器。如在一個HTTP請求中SpringMVC默認就具備將JSON個數(shù)的數(shù)據(jù)轉(zhuǎn)換為Java對象,將一個字符串數(shù)字轉(zhuǎn)換為Number類型等等。然而,Spring的默認數(shù)據(jù)綁定機制有時可能無法滿足特定的業(yè)務需求,比如從特定格式的字符串中解析出自定義對象的實例。為了解決這個問題,Spring允許我們自定義注解和數(shù)據(jù)格式化器,以便在請求參數(shù)和Java對象之間進行自定義的轉(zhuǎn)換。Xzy28資訊網(wǎng)——每日最新資訊28at.com

本篇文章將結(jié)合如下需求講解如何基于SpringBoot環(huán)境下自定義注解來實現(xiàn)數(shù)據(jù)的轉(zhuǎn)換。Xzy28資訊網(wǎng)——每日最新資訊28at.com

現(xiàn)有如下接口:Xzy28資訊網(wǎng)——每日最新資訊28at.com

@GetMapping("/user")public User getUser(User user) {  return user ;}

請求url如下:Xzy28資訊網(wǎng)——每日最新資訊28at.com

http://localhost:9001/api/objects/user?user=666,中國

在默認情況下,Spring是無法將這里的user參數(shù)值正確的綁定到User對象。Xzy28資訊網(wǎng)——每日最新資訊28at.com

2. 實戰(zhàn)案例

2.1 實現(xiàn)目標

為了盡可能的簡單,期望通過在接口請求參數(shù)上添加一個注解就能完成數(shù)據(jù)類型的轉(zhuǎn)換及綁定。如下形式:Xzy28資訊網(wǎng)——每日最新資訊28at.com

@GetMapping("/user")public User getUser(@UserFormat User user)

Spring提供了一種基于注解驅(qū)動的格式化,也就是上面這里看到的通過注解標注一個參數(shù)(字段)來實現(xiàn)數(shù)據(jù)的格式化。Xzy28資訊網(wǎng)——每日最新資訊28at.com

要實現(xiàn)基于注解驅(qū)動的格式化,需要我們自定義類實現(xiàn)AnnotationFormatterFactory接口。該接口定義如下:Xzy28資訊網(wǎng)——每日最新資訊28at.com

// 這里的泛型是注解類型,也就是我們要使用什么注解來標記我們的參數(shù)(字段)public interface AnnotationFormatterFactory<A extends Annotation> {  // 這個注解可以使用在什么字段上  Set<Class<?>> getFieldTypes();  // 將對象轉(zhuǎn)換為String  Printer<?> getPrinter(A annotation, Class<?> fieldType);  // 將字符串解析為對象  Parser<?> getParser(A annotation, Class<?> fieldType);}

該接口非常的簡單,主要就是如何將對象轉(zhuǎn)String,如何從String轉(zhuǎn)對象。Xzy28資訊網(wǎng)——每日最新資訊28at.com

2.2 自定義注解格式化工廠

public class StringToUserFormatter implements AnnotationFormatterFactory<UserFormat> {    @Override    public Set<Class<?>> getFieldTypes() {      return Set.of(User.class) ;    }    @Override    public Printer<User> getPrinter(UserFormat annotation, Class<?> fieldType) {      return (object, locale) -> object.toString() ;    }    @Override    public Parser<User> getParser(UserFormat annotation, Class<?> fieldType) {      return (text, locale) -> {        Assert.hasText(text, "數(shù)據(jù)錯誤") ;        String[] s = text.split(",") ;        User user = new User() ;        user.setId(Long.parseLong(s[0])) ;        user.setName(s[1]) ;        return user ;      } ;    }  }

自定義注解:Xzy28資訊網(wǎng)——每日最新資訊28at.com

@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.PARAMETER)public static @interface UserFormat {}

有了以上的工廠類后,接下來是注冊到Spring容器中。Xzy28資訊網(wǎng)——每日最新資訊28at.com

2.3 注冊格式化器

@Componentpublic class WebDataTypeConfig implements WebMvcConfigurer {  @Override  public void addFormatters(FormatterRegistry registry) {    registry.addFormatterForFieldAnnotation(new StringToUserFormatter()) ;  }}

完成以上步驟就大功告成了,接下來測試Xzy28資訊網(wǎng)——每日最新資訊28at.com

2.4 測試

@GetMapping("/user")public User getUser(@UserFormat User user) {  return user ;}

測試結(jié)果Xzy28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片Xzy28資訊網(wǎng)——每日最新資訊28at.com

正確的轉(zhuǎn)換為User對象。基于該注解進行格式化不僅僅只用到接口參數(shù)上,還可以用到字段上。Xzy28資訊網(wǎng)——每日最新資訊28at.com

2.5 用在字段上

public static class DTO {  @UserFormat  private User user ;  private Integer age ;}

測試接口:Xzy28資訊網(wǎng)——每日最新資訊28at.com

// 注意,可不要改成post,然后用@RequestBody。無用反而報錯@GetMapping("/dto")public DTO save(DTO dto) {  return dto ;}

測試結(jié)果Xzy28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片Xzy28資訊網(wǎng)——每日最新資訊28at.com

正確的輸出結(jié)果。Xzy28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-91353-0.htmlSpringBoot優(yōu)雅定制接口參數(shù)格式轉(zhuǎn)換

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: Python中的全局變量和局部變量詳解

下一篇: 深入Go原理:協(xié)程間通信基礎Chan

標簽:
  • 熱門焦點
Top