簡體   English   中英

在Spring Boot中預處理第三方庫方法

[英]Pre-handle third party library method in Spring Boot

我們正在Spring Boot 1.5中探索Microometer指標收集庫。

千分尺在“ Tag界面中提供了一種靜態方法來創建度量的標記。

public interface Tag {
    String getKey();

    String getValue();

    static Tag of(String key, String value) {
        return new ImmutableTag(key, value);
    }
}

ImmutableTag的實現如下:

public class ImmutableTag implements Tag {
    private String key;
    private String value;

    public ImmutableTag(String key, String value) {
        requireNonNull(key);
        requireNonNull(value);
        this.key = key;
        this.value = value;
    }
...other methods...
}

現在,我們正在以編程方式收集一些標簽,並且可能最終會得到一個null標簽(由於requireNonNull() ,它將引發異常)。 但是在遇到null時,我們可以用默認字符串替換標簽值(例如“ unknown”)。

處理此問題的最佳方法是什么?

我想到了以下幾點:

  1. Try / Catch:將所有此類語句括在try/catch塊中。 我知道這可能很昂貴且難以維護。
  2. 在我們的一端處理null: Check for any null tag being passed ,並將其替換為默認字符串。 但是,我們將有很多這樣的語句,並且希望具有某種默認情況下會發生的配置。
  3. 包裝器接口:創建一個TagWrapper interface ,將null替換為默認值,然后調用Tag.of()方法。 但是,現在看來,這似乎是我最好的選擇,但是當不再需要此選項時(也許稍后在庫中引入了類似的方法),擺脫包裝程序將包含很多更改。

Spring中是否有一些配置可以讓我預先處理第三方庫方法而無需創建包裝器?

也許使用Spring AOP。 就像是:

@around(value="execution(* package.name.class.Tag.of)")
public void wrapTags(ProceedingJoinPoint call){
   try {
     Object[] args = call.getArgs();
     // wrap args in Optional.ofNullable
     call.proceed();
   } catch (Exception e){
      // handle exception
   }
}

您可以嘗試添加以下屬性:

在application.yml中:

spring:
  jackson:
    deserialization:
      fail-on-null-creator-properties: false

或application.properties:

spring.jackson.deserialization.fail-on-null-creator-properties= false

我可能會丟失一些東西,但是您不能將要傳遞給Tag接口的Optional值包裝起來嗎?

// wrapping values in Optional
public static String wrapTags(String s){
  return Optional.ofNullable(s).orElse("UNKNOWN");
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM