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

时间:2018-07-24 16:31:09

标签: java spring-boot design-patterns

我们正在Spring Boot 1.5中探索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()而会引发异常)。但是在遇到null时,我们可以用默认字符串替换标签值(例如“ unknown”)。

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

我想到了以下内容:

  1. 尝试/捕获::将所有此类语句括在try/catch块中。我知道这可能很昂贵且难以维护。
  2. 处理空值Check for any null tag being passed,并将其替换为默认字符串。但是,我们将有很多这样的语句,并希望具有某种默认情况下会发生的配置。
  3. 包装器界面:创建一个TagWrapper interface,将null替换为默认值,然后调用Tag.of()方法。但是,现在看来,这似乎是我最好的选择,但是当不再需要此选项时(也许稍后在库中引入了类似的方法),摆脱包装将包含很多更改。

Spring中是否有一些配置可以让我预先处理第三方库方法而无需创建包装器?

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

您可以尝试添加以下属性:

在application.yml中:

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

或application.properties:

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

答案 2 :(得分:0)

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

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