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

@InitBinder注解會(huì)用嗎?該如何使用?

開發(fā) 前端
@InitBinder 方法可以注冊(cè)特定控制器的 java.beans.PropertyEditor 或 Spring Converter 和 Formatter 組件。此外,還可以使用 MVC 配置在全局共享的 FormattingConversionService 中注冊(cè)轉(zhuǎn)換器和格式器類型。

環(huán)境:SpringBoot2.7.16

1. 簡介

@Controller 或 @ControllerAdvice 類可以使用 @InitBinder 注解標(biāo)注方法來初始化 WebDataBinder 實(shí)例,WebDataBinder對(duì)象主要用來做數(shù)據(jù)綁定操作;具體使用了@InitBinder注解的方法可以做如下事情:

  • 將請(qǐng)求參數(shù)(即表單或查詢數(shù)據(jù))綁定到模型對(duì)象。
  • 將基于字符串的請(qǐng)求值(如請(qǐng)求參數(shù)、路徑變量、頭信息、cookie 等)轉(zhuǎn)換為控制器方法參數(shù)的目標(biāo)類型。
  • 在呈現(xiàn) HTML 表單時(shí),將模型對(duì)象值格式化為字符串值。

@InitBinder 方法可以注冊(cè)特定控制器的 java.beans.PropertyEditor 或 Spring Converter 和 Formatter 組件。此外,還可以使用 MVC 配置在全局共享的 FormattingConversionService 中注冊(cè)轉(zhuǎn)換器和格式器類型。

2. 定義初始化DataBinder

被@InitBinder標(biāo)注的方法的返回值必須是void。否則將拋出異常。

@InitBinder
public void initBinder(WebDataBinder binder) {
  // ...
}

源碼分析:

以有如下簡單的接口參數(shù)解析綁定進(jìn)行分析

@GetMapping("/index")
public Object index(Integer id) {
  // 
}

當(dāng)請(qǐng)求/index?id=666時(shí)Spring MVC會(huì)通過參數(shù)解析器RequestParamMethodArgumentResolver進(jìn)行參數(shù)類型的轉(zhuǎn)換及綁定(接收到的'666'是字符串將轉(zhuǎn)換為Integer)。

public class RequestParamMethodArgumentResolver ...{}
// 調(diào)用父類的方法
public abstract class AbstractNamedValueMethodArgumentResolver {
  public final Object resolveArgument(...) {
    // ...
    if (binderFactory != null) {
      WebDataBinder binder = binderFactory.createBinder(webRequest, null, namedValueInfo.name);
    }
    // ...
  }
}
// 綁定工廠
public class DefaultDataBinderFactory {
  public final WebDataBinder createBinder(...) {
    WebDataBinder dataBinder = createBinderInstance(target, objectName, webRequest);
    if (this.initializer != null) {
      this.initializer.initBinder(dataBinder, webRequest);
    }
    // 初始化綁定(執(zhí)行所有被@InitBinder注解的方法)
    initBinder(dataBinder, webRequest);
    return dataBinder;
  }
}
// 綁定工廠實(shí)現(xiàn)類
public class InitBinderDataBinderFactory extends DefaultDataBinderFactory {
  public void initBinder(WebDataBinder dataBinder, NativeWebRequest request) throws Exception {
    // 這里的每一個(gè)InvocableHandlerMethod都表示被@InitBinder標(biāo)準(zhǔn)的方法對(duì)象
    for (InvocableHandlerMethod binderMethod : this.binderMethods) {
      if (isBinderMethodApplicable(binderMethod, dataBinder)) {
        Object returnValue = binderMethod.invokeForRequest(request, null, dataBinder);
        // 如果存在返回值將拋出異常
        if (returnValue != null) {
          throw new IllegalStateException(
              "@InitBinder methods must not return a value (should be void): " + binderMethod);
        }
      }
    }
  }
}

3. 實(shí)戰(zhàn)案例

3.1 在Controller中定義

@InitBinder
public void initBinder(WebDataBinder binder) {
  binder.registerCustomEditor(String.class, new PropertyEditorSupport() {
    @Override
    public void setAsText(String text) throws IllegalArgumentException {
      // 為了看到效果,這里吧轉(zhuǎn)換后的值進(jìn)行+1操作
      setValue(Integer.parseInt(text) + 1) ; 
    }
  }) ;
}

定義Controller接口

@GetMapping("/index")
public String index(Integer id) {
  return "轉(zhuǎn)換后id: " + id ;
}

輸出結(jié)果

圖片圖片

3.2 在ControllerAdvice中定義

在@ControllerAdvice中定義的@InitBinder方法將在所有或部分Controller中生效。

@ControllerAdvice()
public class BinderControllerAdvice {


  @InitBinder
  public void initBinder(WebDataBinder binder) {
    binder.registerCustomEditor(Integer.class, new PropertyEditorSupport() {
      @Override
      public void setAsText(String text) throws IllegalArgumentException {
        System.out.println("原始值:" + text) ;
        setValue(Integer.parseInt(text) + 1) ; 
      }
    }) ;
  }
}

為什么說也可以是部分Controller呢?

在@ControllerAdvice注解的屬性中我們可以通過配置包,類及注解等信息。

@ControllerAdvice(basePackages = {"com.pack.service"})
public class BinderControllerAdvice {
  // ...
}

如上配置后,該類中的所有@InitBinder只會(huì)針對(duì)com.pack.service包中的Controller生效。

圖片圖片

3.3 注冊(cè)為全局共享

可以使用 MVC 配置在全局共享的 FormattingConversionService 中注冊(cè)轉(zhuǎn)換器和格式器類型。

默認(rèn)情況下SpringBoot容器會(huì)注冊(cè)一個(gè)默認(rèn)的全局類型轉(zhuǎn)換器,如下:

@Bean
@Override
public FormattingConversionService mvcConversionService() {
  Format format = this.mvcProperties.getFormat();
  WebConversionService conversionService = new WebConversionService(
      new DateTimeFormatters().dateFormat(format.getDate())
        .timeFormat(format.getTime())
        .dateTimeFormat(format.getDateTime()));
  addFormatters(conversionService);
  return conversionService;
}

也就是說我們可以吧類型轉(zhuǎn)換直接注冊(cè)到上面的FormattingConversionService 中。

@InitBinder
public void initBinder(WebDataBinder binder) {
  FormattingConversionService fcs = (FormattingConversionService) binder.getConversionService();
  fcs.addConverter(new Converter<String, Integer>() {
    @Override
    public Integer convert(String source) {
      return Integer.parseInt(source) + 1 ;
    }
  }) ;
}

這樣注冊(cè)以后,我們可以在任意的地方從容器中獲取到ConversionService實(shí)例就可以使用到上面自定義的轉(zhuǎn)換服務(wù)。

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

2022-06-28 14:57:09

FormatterSpring

2020-03-06 10:25:10

注解Java代碼

2023-06-30 08:26:24

Java注解Java程序元素

2021-03-12 18:25:09

開發(fā)前端React

2021-03-24 08:25:08

@SentinelReSentinelSpring

2022-10-27 11:46:48

ConfiguratValuespring

2021-03-29 09:37:17

SpringBoot常用注解Spring Boot

2021-09-06 10:42:18

Linux命令服務(wù)器

2021-08-11 10:00:51

緩存MyBatis管理

2025-01-20 00:00:00

反射Java語言

2021-03-11 08:00:00

存儲(chǔ)數(shù)據(jù)SSD

2022-11-11 08:31:39

Java注解注解類

2019-01-28 17:42:33

Python數(shù)據(jù)預(yù)處理數(shù)據(jù)標(biāo)準(zhǔn)化

2019-07-25 12:46:32

Java高并發(fā)編程語言

2020-06-04 14:15:55

Java中BigDecimal函數(shù)

2018-09-29 15:34:34

JavaList接口

2024-03-06 08:15:03

@Autowired注入方式Spring

2021-05-21 12:36:16

限流代碼Java

2019-04-14 22:33:52

網(wǎng)絡(luò)層協(xié)議VLAN虛擬局域網(wǎng)

2020-09-27 06:50:56

Java互聯(lián)網(wǎng)注解
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 超碰免费在线观看 | 精品国产鲁一鲁一区二区张丽 | 美女黄网 | 日韩高清中文字幕 | 91精品国产乱码久久久 | 午夜免费视频 | 另类专区亚洲 | 国产ts人妖另类 | 99精品视频一区二区三区 | 国产精品毛片无码 | 欧美一区二区三区在线观看视频 | 毛片一级片 | 91精品在线看 | 国产精品久久久久久婷婷天堂 | 精品欧美一区免费观看α√ | av黄色在线 | 91精品国产高清一区二区三区 | 日韩一区不卡 | 国产精品一区二区三 | 国产精品不卡视频 | 婷婷色国产偷v国产偷v小说 | 中文字幕亚洲精品在线观看 | 中文字幕免费视频 | 天天爱天天操 | 亚洲精品久久久9婷婷中文字幕 | 久久久蜜桃一区二区人 | 欧美舔穴| 久久精品色欧美aⅴ一区二区 | 久久精品一级 | 日本韩国欧美在线观看 | 97日日碰人人模人人澡分享吧 | 黄色av网站免费看 | 91网站在线观看视频 | 黑人精品欧美一区二区蜜桃 | 97超碰中文网 | 久久精品中文字幕 | 4hu最新网址 | 亚洲第一女人av | 爽爽免费视频 | 日日噜噜噜夜夜爽爽狠狠视频97 | 免费观看一级特黄欧美大片 |