亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

SpringBoot接口請求入?yún)⒑统鰠⒃鰪姷奈宸N方法

 更新時間:2024年07月30日 09:32:41   作者:碼到三十五  
這篇文章主要介紹了SpringBoot接口請求入?yún)⒑统鰠⒃鰪姷奈宸N方法,使用`@JsonSerialize`和`@JsonDeserialize`注解,全局配置Jackson的`ObjectMapper`,使用`@ControllerAdvice`配合`@InitBinder`,自定義HttpMessageConverter和使用AOP進行切面編程,需要的朋友可以參考下

在Spring Boot , Spring Cloud中,對接口的請求入?yún)⒑统鰠⑦M行自定義的序列化和反序列化增強,通常有以下幾種方法:

1. 使用@JsonSerialize和@JsonDeserialize注解

可以在實體類的字段上使用這兩個注解來指定自定義的序列化器和反序列化器。

使用場景:

  • 當需要對某個特定字段進行自定義的序列化和反序列化時。
  • 當實體類中的某些字段類型不是標準的JSON類型,需要轉(zhuǎn)換成JSON能識別的格式時。
  • 需要在序列化和反序列化過程中添加自定義邏輯,如加密、解密、格式轉(zhuǎn)換等。

首先,定義自定義的序列化器和反序列化器:

public class CustomLocalDateTimeSerializer extends JsonSerializer<LocalDateTime> {
    @Override
    public void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        gen.writeString(value.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
    }
}

public class CustomLocalDateTimeDeserializer extends JsonDeserializer<LocalDateTime> {
    @Override
    public LocalDateTime deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        return LocalDateTime.parse(p.getValueAsString(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
    }
}

然后,在實體類中使用這些注解:

public class MyEntity {
    @JsonSerialize(using = CustomLocalDateTimeSerializer.class)
    @JsonDeserialize(using = CustomLocalDateTimeDeserializer.class)
    private LocalDateTime dateTime;

    // getters and setters
}

2. 全局配置Jackson的ObjectMapper

通過配置ObjectMapper來全局地改變序列化和反序列化的行為,可以添加自定義的模塊或配置屬性。

使用場景

  • 當項目中多個實體類需要應用相同的序列化和反序列化規(guī)則時。
  • 需要在全局范圍內(nèi)統(tǒng)一處理日期、時間、枚舉等類型的序列化和反序列化。
  • 需要對ObjectMapper進行全局的配置,如設置默認的時區(qū)、日期格式等。

創(chuàng)建一個自定義模塊,并注冊序列化器和反序列化器:

public class CustomJacksonModule extends SimpleModule {
    public CustomJacksonModule() {
        addSerializer(LocalDateTime.class, new CustomLocalDateTimeSerializer());
        addDeserializer(LocalDateTime.class, new CustomLocalDateTimeDeserializer());
    }
}

然后,配置ObjectMapper

@Bean
public Jackson2ObjectMapperBuilderCustomizer jsonCustomizer() {
    return builder -> {
        builder.modules(new CustomJacksonModule());
    };
}

3. 使用@ControllerAdvice配合@InitBinder

要對Spring MVC的控制器進行全局的配置,可以使用@ControllerAdvice注解。然后,在這個類中使用@InitBinder注解的方法來注冊自定義的屬性編輯器。

注意:@InitBinder主要用于處理表單數(shù)據(jù)的綁定,對于JSON數(shù)據(jù)的序列化和反序列化,它并不是最直接的方法。但如果是處理非JSON格式的請求體(如表單數(shù)據(jù)),則可以使用此方法。

使用場景(對于JSON數(shù)據(jù),更偏向于使用其他方法;對于表單數(shù)據(jù)):

  • 當需要對表單數(shù)據(jù)的綁定進行自定義處理時。
  • 當需要在多個控制器中復用相同的表單數(shù)據(jù)綁定邏輯時。

創(chuàng)建一個自定義的屬性編輯器:

public class CustomLocalDateTimeEditor extends PropertyEditorSupport {
    @Override
    public void setAsText(String text) throws IllegalArgumentException {
        setValue(LocalDateTime.parse(text, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
    }

    @Override
    public String getAsText() {
        LocalDateTime value = (LocalDateTime) getValue();
        return value.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
    }
}

然后,在@ControllerAdvice類中注冊這個屬性編輯器:

@ControllerAdvice
public class CustomControllerAdvice {
    @InitBinder
    public void initBinder(WebDataBinder binder) {
        binder.registerCustomEditor(LocalDateTime.class, new CustomLocalDateTimeEditor());
    }
}

4. 自定義HttpMessageConverter

可以編寫自定義的HttpMessageConverter來處理特定的媒體類型,并在其中實現(xiàn)自定義的序列化和反序列化邏輯。然后,將其注冊到Spring MVC的配置中。

使用場景:

  • 當Spring Boot默認的HttpMessageConverter無法滿足自定義的序列化和反序列化需求時。
  • 當需要處理非標準的媒體類型時,如自定義的二進制格式或文本格式。
  • 當需要在序列化和反序列化過程中應用復雜的業(yè)務邏輯時。

創(chuàng)建一個自定義的HttpMessageConverter:

public class CustomLocalDateTimeConverter extends MappingJackson2HttpMessageConverter {
    public CustomLocalDateTimeConverter() {
        super();
        ObjectMapper customObjectMapper = new ObjectMapper();
        customObjectMapper.registerModule(new CustomJacksonModule());
        setObjectMapper(customObjectMapper);
    }
}

然后,在配置類中注冊這個轉(zhuǎn)換器:

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.add(0, new CustomLocalDateTimeConverter());
    }
}

5. 使用AOP進行切面編程

可以使用Spring AOP來對控制器的方法進行切面,從而在方法執(zhí)行前后進行自定義的序列化和反序列化操作。

使用場景

  • 當需要在不修改原有業(yè)務代碼的情況下,對方法入?yún)⒑统鰠⑦M行額外的處理時。
  • 當需要對多個控制器或方法中的入?yún)⒑统鰠媒y(tǒng)一的處理邏輯時。
  • 當處理邏輯與業(yè)務邏輯相對獨立,且需要保持代碼結(jié)構(gòu)清晰時。

首先,定義一個切面:

@Aspect
@Component
public class CustomSerializationAspect {
    @Before("execution(* com.example.controller..*.*(..)) && args(..,@RequestParam(..),@RequestBody(..))")
    public void beforeControllerMethod(JoinPoint joinPoint) {
        // 在這里可以修改入?yún)?,但通常不建議這么做,因為這會改變方法的簽名
        // 更常見的是在處理響應后進行修改
    }

    @AfterReturning(pointcut = "execution(* com.example.controller..*.*(..)) && @annotation(org.springframework.web.bind.annotation.RequestMapping)", returning = "result")
    public void afterControllerMethod(JoinPoint joinPoint, Object result) {
        // 在這里可以修改出參,例如將LocalDateTime轉(zhuǎn)換為特定格式的字符串
        if (result instanceof MyEntity) {
            MyEntity entity = (MyEntity) result;
            // 假設你想在這里修改entity的dateTime字段
        }
    }
}

注意:AOP通常用于橫切關注點的處理,如日志、事務管理等,而不是用于修改方法的入?yún)⒑统鰠?。如果你需要修改入?yún)⒑统鰠?,通常建議使用其他方法,如自定義的HttpMessageConverter或@ControllerAdvice。在上面的AOP示例中看到了如何捕獲方法的執(zhí)行,但實際上修改入?yún)⑹遣煌扑]的,而出參的修改也通常不是AOP的最佳用途。如果確實需要在AOP中修改出參,你可能需要考慮使用@AfterReturning注解,并檢查返回值的類型,然后進行相應的處理。然而,更常見做法是使用Jackson的序列化特性或@ControllerAdvice來全局處理響應體的格式。

結(jié)語

Spring Boot, Spring Cloud 中要增強請求出入?yún)⒌姆绞街? 通常,對于簡單的自定義需求,使用@JsonSerialize和@JsonDeserialize注解是最直接和簡單的方式。而對于更復雜的全局配置或跨多個控制器的需求,則可能需要使用ObjectMapper的配置或@ControllerAdvice。

以上就是SpringBoot接口請求入?yún)⒑统鰠⒃鰪姷奈宸N方法的詳細內(nèi)容,更多關于SpringBoot接口出入?yún)⒃鰪姷馁Y料請關注腳本之家其它相關文章!

相關文章

  • 分析那些不講武德的SDK(構(gòu)造使用規(guī)范)

    分析那些不講武德的SDK(構(gòu)造使用規(guī)范)

    這篇文章主要為大家介紹了盤點分析那些不講武德的SDK(構(gòu)造規(guī)范)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-05-05
  • Spring如何實現(xiàn)輸出帶動態(tài)標簽的日志

    Spring如何實現(xiàn)輸出帶動態(tài)標簽的日志

    文章介紹了如何通過動態(tài)標簽日志實現(xiàn),解決了部分業(yè)務代碼在多個模塊中調(diào)用時日志無法直觀看出來源的問題,主要通過ThreadLocal存儲業(yè)務標簽,并在日志輸出時插入該標簽,實現(xiàn)日志的動態(tài)標簽功能,感興趣的朋友一起看看吧
    2024-12-12
  • Java中的while無限循環(huán)結(jié)構(gòu)及實例

    Java中的while無限循環(huán)結(jié)構(gòu)及實例

    這篇文章主要介紹了Java中的while無限循環(huán)結(jié)構(gòu)及實例,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • 使用Springboot整合Apollo配置中心

    使用Springboot整合Apollo配置中心

    這篇文章主要介紹了使用Springboot整合Apollo配置中心的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Intellij IDEA全局替換快捷鍵整理

    Intellij IDEA全局替換快捷鍵整理

    這篇文章主要給大家介紹了關于Intellij IDEA全局替換快捷鍵整理的相關資料,文中通過圖文介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-02-02
  • Java中WeakHashMap的使用詳解

    Java中WeakHashMap的使用詳解

    這篇文章主要介紹了Java中WeakHashMap的使用詳解,WeakHashMap是一種弱引用的Map,底層數(shù)據(jù)結(jié)構(gòu)為數(shù)組鏈表,與HashMap相比,WeakHashMap的區(qū)別在于它的key存儲為弱引用,在垃圾回收時,如果key沒有被強引用所引用,那么key會被回收掉,需要的朋友可以參考下
    2023-09-09
  • java文件對話框過濾特定文件類型示例

    java文件對話框過濾特定文件類型示例

    文件作為存儲數(shù)據(jù)的單元,會根據(jù)數(shù)據(jù)類型產(chǎn)生很多分類,也就是所謂的文件類型。在對數(shù)據(jù)文件進行操作時,常常需要根據(jù)不同的文件類型來作不同的處理。本實例實現(xiàn)的是讀取文件夾指定類型的文件并顯示到表格控件中
    2014-02-02
  • JavaSE API實現(xiàn)生成隨機數(shù)的2種方法(Random類和Math類的Random方法)

    JavaSE API實現(xiàn)生成隨機數(shù)的2種方法(Random類和Math類的Random方法)

    本文主要介紹了JavaSE API實現(xiàn)生成隨機數(shù)的2種方法,主要包括Random類和Math類的random方法都可以用來生成隨機數(shù),具有一定的參考價值,感興趣的可以了解一下
    2023-10-10
  • mybatis中string和date的轉(zhuǎn)換方式

    mybatis中string和date的轉(zhuǎn)換方式

    這篇文章主要介紹了mybatis中string和date的轉(zhuǎn)換方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Java8新特性之深入解析日期和時間_動力節(jié)點Java學院整理

    Java8新特性之深入解析日期和時間_動力節(jié)點Java學院整理

    這篇文章主要介紹了Java8新特性之深入解析日期和時間_動力節(jié)點Java學院整理,需要的朋友可以參考下
    2017-06-06

最新評論