Spring Boot中预处理第三方库方法

我们正在探索 Spring Boot 1.5 中的 Micrometer 指标收集库。


Micrometer 在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...

}

现在,我们正在以编程方式收集一些标签,最终可能会得到一个空标签(由于 会引发异常requireNonNull())。但是在遇到空值时,我们可以用默认字符串(例如“未知”)替换标记值。


处理这个问题的最佳方法是什么?


我想到了以下几点:

  1. Try / Catch:将所有此类语句括在一个try/catch块中。我知道这可能很昂贵且难以维护。

  2. 在我们的末尾处理 null: Check for any null tag being passed,并将其替换为默认字符串。但是,我们会有很多这样的语句,并且希望有一些默认情况下会发生这种情况的配置。

  3. Wrapper接口:创建一个TagWrapper interface,用默认值替换null,调用Tag.of()方法。现在对我来说似乎是最好的选择,但是,当不再需要它时(也许稍后会在库中引入这样的方法),摆脱包装器将包括很多更改。

Spring 中是否有一些配置允许我在不创建包装器的情况下预先处理第三方库方法?


蓝山帝景
浏览 191回答 3
3回答

侃侃无极

也许使用 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   }}

暮色呼如

我可能遗漏了一些东西,但是您不能将值包装在传递给Tag接口的 Optional 中吗?// wrapping values in Optionalpublic static String wrapTags(String s){  return Optional.ofNullable(s).orElse("UNKNOWN");}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java