有条件地多次调用Java方法是否有更好的方法?

y53ybaqx  于 2023-01-29  发布在  Java
关注(0)|答案(1)|浏览(134)

我有一个生成访问令牌的方法,该令牌作为API请求的授权载体传递:

private void generateAccessToken() {
    try {
      OAuthClientRequest request = OAuthClientRequest
              .tokenLocation(uri)
              .setGrantType(GrantType.CLIENT_CREDENTIALS)
              .buildBodyMessage();

      request.addHeader("Authorization", "Basic " + Base64.getEncoder()
                                                          .encodeToString((clientId + ":" + clientSecret).getBytes(StandardCharsets.UTF_8)));

      OAuthClient client = new OAuthClient(new URLConnectionClient());

      OAuthJSONAccessTokenResponse oAuthResponse = client
              .accessToken(request, OAuth.HttpMethod.POST, OAuthJSONAccessTokenResponse.class);

      accessToken = oAuthResponse.getAccessToken();
    }
    catch (OAuthSystemException | OAuthProblemException e) {
      logger.error(e::getMessage);
    }

  }

我在需要时调用该方法,它生成一个访问令牌:

generateAccessToken();

现在,由于某种原因,身份服务器在第一次尝试时随机无法生成令牌并返回空值。它需要尝试2或3次才能生成令牌。此问题的解决方法是调用generateAccessToken(); 3次,这样,如果第一次调用返回null,则第二次调用将生成该令牌;如果第一次调用返回null,则第三次调用将生成该令牌。因此,此解决方法修复了此问题:

generateAccessToken();
generateAccessToken();
generateAccessToken();

我没有在每次发送API请求时强制调用3次,而是应用了一个基本条件,即仅当第一次调用生成null时才调用后续方法。
生成访问令牌();

if (accessToken == null) {
  generateAccessToken();
}

if (accessToken == null) {
  generateAccessToken();

} else {
  String s = ("Access token could not be generated");

}

这个条件运行良好,但我认为也许有一种更好的方法来构造这个条件,除了这个基本的if条件之外,是否有一种更好的、更强类型的、Java最佳实践的方法来调用generateAccessToken();只有当它最初生成一个null值的时候?

xriantvc

xriantvc1#

你为什么不用while循环呢?

while (accessToken == null) {
  generateAccessToken();
}

最后添加一个条件,检查一定数量的尝试:

int attempts = 0;
while (accessToken == null && attempts < 3) {
  generateAccessToken();
  attempts++;
}

显示错误消息:

int attempts = 0;
while (accessToken == null && attempts < 3) {
  generateAccessToken();
  attempts++;
}
if(accessToken == null) {
  // Access token could not be generated
}

相关问题