成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Spring強大的數(shù)據(jù)格式化處理功能,你必須得知道

開發(fā) 前端
要創(chuàng)建自己的Formatter格式化程序,只需要實現(xiàn)上面的Formatter接口。將泛型T替換為需要格式化的對象類型?—?例如,java.util.Date。實現(xiàn)print()操作以打印T的實例以在客戶端區(qū)域中顯示。實現(xiàn)parse()操作,從客戶端語言環(huán)境返回的格式化表示中解析T的實例。

環(huán)境:Springboot2.6.12

通常,當需要實現(xiàn)通用類型轉(zhuǎn)換邏輯時,可以使用轉(zhuǎn)換器SPI?例如,用于在java.util.Date和Long之間轉(zhuǎn)換。當你在客戶端環(huán)境(如web應用程序)中工作并且需要解析和打印本地化字段值時,可以使用格式化程序SPI。ConversionService為兩個SPI提供統(tǒng)一的類型轉(zhuǎn)換API。

在Springboot環(huán)境下如何自定義數(shù)據(jù)類型的轉(zhuǎn)換?

Formatter SPI

Formatter SPI 實現(xiàn)字段格式化邏輯非常簡單,而且是強類型的。以下列表顯示格式化程序接口定義:

package org.springframework.format;
public interface Formatter<T> extends Printer<T>, Parser<T> {
}

Formatter 從Printer和Parser構建塊接口擴展而來。以下列表顯示了這兩個接口的定義:

public interface Printer<T> {
  String print(T fieldValue, Locale locale);
}
import java.text.ParseException;


public interface Parser<T> {
  T parse(String clientValue, Locale locale) throws ParseException;
}

要創(chuàng)建自己的Formatter格式化程序,只需要實現(xiàn)上面的Formatter接口。將泛型T替換為需要格式化的對象類型?—?例如,java.util.Date。實現(xiàn)print()操作以打印T的實例以在客戶端區(qū)域中顯示。實現(xiàn)parse()操作,從客戶端語言環(huán)境返回的格式化表示中解析T的實例。如果解析嘗試失敗,格式化程序應該拋出ParseException或IllegalArgumentException。注意確保格式化程序?qū)崿F(xiàn)是線程安全的。

自定義Formatter程序

根據(jù)用戶輸入的信息,每個字段信息通過逗號分割,通過Formatter程序?qū)⑵滢D(zhuǎn)換為Users對象。如輸入:張三,30;將信息解析為Users對象姓名為張三,年齡為30。

public class Users {
  private String name ;
  private Integer age ;
}

格式化程序:

public class UsersFormatter implements Formatter<Users> {
  @Override
  public String print(Users object, Locale locale) {
    if (Objects.isNull(object)) {
      return "" ;
    }
    return "【name = " + object.getName() + ", age = " + object.getAge() + "】" ;
  }
  @Override
  public Users parse(String text, Locale locale) throws ParseException {
    if (text == null || text.trim().length() == 0) {
      return null ;
    }
    Users user = new Users() ;
    // 下面做簡單處理,不做校驗
    String[] values = text.split(",") ;
    user.setName(values[0]) ;
    user.setAge(Integer.parseInt(values[1]));
    return user ;
  }


}

格式化程序定義完后,需要注冊到系統(tǒng)中讓系統(tǒng)能夠知道如何進行轉(zhuǎn)換。

@Configuration
public class WebConfig implements WebMvcConfigurer {


  @Override
  public void addFormatters(FormatterRegistry registry) {
    registry.addFormatter(new UsersFormatter()) ;
  }
  
}

測試接口:

@GetMapping("/save")
public Object save(Users users) {
  return users ;
}

輸出:

圖片圖片

基于注解的Formatter

可以按字段類型或注解配置字段格式。要將注解綁定到格式化程序,需要實現(xiàn)
AnnotationFormatterFactory。以下顯示了AnnotationFormatterFactory接口的定義:

package org.springframework.format;


public interface AnnotationFormatterFactory<A extends Annotation> {


  Set<Class<?>> getFieldTypes();


  Printer<?> getPrinter(A annotation, Class<?> fieldType);


  Parser<?> getParser(A annotation, Class<?> fieldType);
}

要創(chuàng)建實現(xiàn),請執(zhí)行以下操作:

參數(shù)化要與格式邏輯關聯(lián)的字段annotationType?—?例如org.springframework.format.annoation.DateTimeFormat。

  • getFieldTypes()返回可以使用注釋的字段類型。
  • getPrinter()返回Printer以打印帶注釋字段的值。
  • getParser()返回一個Parser來解析帶注釋字段的值。

自定義注解格式化程序

自定義注解類,用來需要格式化的字段。

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE})
public @interface AgeFormat {
}

自定義注解格式化程序。

public final class AgeFormatAnnotationFormatterFactory
        implements AnnotationFormatterFactory<AgeFormat> {
  public Set<Class<?>> getFieldTypes() {
    Set<Class<?>> types = new HashSet<Class<?>>() ;
    types.add(Integer.class) ;
    return types;
  }


  @Override
  public Printer<Integer> getPrinter(AgeFormat annotation, Class<?> fieldType) {
    return new AgeFormatter() ;
  }


  @Override
  public Parser<Integer> getParser(AgeFormat annotation, Class<?> fieldType) {
    return new AgeFormatter() ;
  }
  
  private class AgeFormatter implements Formatter<Integer> {
    @Override
    public String print(Integer object, Locale locale) {
      if (object == null) {
        return "" ;
      }
      return object.toString() ;
    }
    
    @Override
    public Integer parse(String text, Locale locale) throws ParseException {
      if (text == null || text.trim().length() == 0) {
        return -1 ;
      }
      return Integer.parseInt(text.substring(1)) ;
    }
  }


}

注冊格式化程序。

@Configuration
public class WebConfig implements WebMvcConfigurer {
  @Override
  public void addFormatters(FormatterRegistry registry) {
    registry.addFormatterForFieldAnnotation(new AgeFormatAnnotationFormatterFactory()) ;
  }
}

Users.age字段添加注解。

public class Users {
  private String name ;
  @AgeFormat
  private Integer age ;
}

測試接口。

@GetMapping("/save2")
public Object save2(Users users) {
  return users ;
}

注意這里的年齡前面加了一個‘s’字符。

注解添加到參數(shù)上

格式化程序:

public final class UsersFormatAnnotationFormatterFactory implements AnnotationFormatterFactory<UsersFormat> {
  public Set<Class<?>> getFieldTypes() {
    Set<Class<?>> types = new HashSet<Class<?>>() ;
    types.add(Users.class) ;
    return types;
  }


  @Override
  public Printer<?> getPrinter(UsersFormat annotation, Class<?> fieldType) {
    return new UsersFormatter();
  }


  @Override
  public Parser<?> getParser(UsersFormat annotation, Class<?> fieldType) {
    return new UsersFormatter() ;
  }


}

接口:

@GetMapping("/save3")
public Object save3(@UsersFormat Users users) {
  return users ;
}


完畢!!!

責任編輯:武曉燕 來源: Spring全家桶實戰(zhàn)案例源碼
相關推薦

2018-09-25 16:31:35

維諦技術

2018-03-09 11:44:36

公有云云支出浪費

2018-03-21 10:56:44

云支出云計算浪費

2021-01-05 05:40:11

JavaDockerMySQL

2016-11-10 13:00:32

網(wǎng)絡傳輸協(xié)議pythonhttp

2018-01-02 09:31:12

大數(shù)據(jù)數(shù)據(jù)互聯(lián)網(wǎng)

2011-09-06 13:56:07

Vista服務器網(wǎng)卡

2021-10-21 08:13:11

Springboot

2020-12-08 15:19:52

開發(fā)軟件框架

2025-01-28 00:00:00

OpenFeign接口依賴

2021-09-07 19:18:20

大數(shù)據(jù)大數(shù)據(jù)應用

2022-04-13 10:38:04

Springboot日期時間格式化

2016-01-04 09:27:56

TCP網(wǎng)絡協(xié)議

2011-03-07 15:01:42

MySQLXML數(shù)據(jù)

2024-03-29 13:17:03

Docker數(shù)據(jù)卷Volume

2021-08-04 07:47:19

HTTP網(wǎng)絡協(xié)議

2024-01-26 08:22:26

XMLJSON格式

2019-04-01 06:37:12

R語言數(shù)據(jù)分析數(shù)據(jù)

2021-04-14 14:46:13

前端Chrome插件

2016-06-29 13:50:12

云計算
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩精品av| 欧美2区 | 正在播放国产精品 | 久久久久成人精品 | 亚洲欧洲日韩精品 中文字幕 | 成人在线精品视频 | 91在线精品秘密一区二区 | 日韩精品一区二区三区在线播放 | www.日本三级| 一区二区三区四区不卡 | 亚洲天堂男人的天堂 | 国产成人福利 | 伊人久久国产 | 亚洲一区成人 | 久久新视频 | 日韩在线播放视频 | 日韩一区二区在线观看视频 | 欧美精品在线一区 | 欧美日韩一区二区视频在线观看 | 精品久久亚洲 | 欧美精品一区三区 | 欧美aaaaaaaaaa | 精品一区二区av | 亚洲天堂中文字幕 | 精品国产欧美 | 免费av电影网站 | 久久久久国产一区二区 | 国产在线播放一区二区三区 | 日批日韩在线观看 | 在线观看中文视频 | 人人九九精 | 亚洲国产一区二区三区在线观看 | 国产精久久久久久久妇剪断 | 亚洲精品视频在线 | 国产精品成人一区二区 | 成人黄色电影免费 | 日本福利片 | 黑人中文字幕一区二区三区 | 亚洲网站在线观看 | 久久久69 | 日韩中文字幕免费在线观看 |