繁体   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