为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

蓝山帝景 2021-06-07 08:39:16
我们正在探索 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())。但是在遇到空值时,我们可以用默认字符串(例如“未知”)替换标记值。处理这个问题的最佳方法是什么?我想到了以下几点:Try / Catch:将所有此类语句括在一个try/catch块中。我知道这可能很昂贵且难以维护。在我们的末尾处理 null: Check for any null tag being passed,并将其替换为默认字符串。但是,我们会有很多这样的语句,并且希望有一些默认情况下会发生这种情况的配置。Wrapper接口:创建一个TagWrapper interface,用默认值替换null,调用Tag.of()方法。现在对我来说似乎是最好的选择,但是,当不再需要它时(也许稍后会在库中引入这样的方法),摆脱包装器将包括很多更改。Spring 中是否有一些配置允许我在不创建包装器的情况下预先处理第三方库方法?
查看完整描述

3 回答

?
侃侃无极

TA贡献2051条经验 获得超10个赞

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

   }

}


查看完整回答
反对 回复 2021-06-10
?
暮色呼如

TA贡献1853条经验 获得超9个赞

我可能遗漏了一些东西,但是您不能将值包装在传递给Tag接口的 Optional 中吗?


// wrapping values in Optional

public static String wrapTags(String s){

  return Optional.ofNullable(s).orElse("UNKNOWN");

}



查看完整回答
反对 回复 2021-06-10
  • 3 回答
  • 0 关注
  • 190 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信