私が達成しようとしているのは、Raygun (クラッシュ報告サービス) を使用して、問題を経験したユーザーの詳細を送信することです。
私はもともと、これに似た方法を使用してユーザー名を取得しようとしました:
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
username = authentication.getName();
しかし、何らかの理由で、これは値 を返しましたipaduser
。その値がどこから来たのかはわかりませんが、これは明らかに答えではありません。
次に試しました:
System.getProperty("user.name");
ただし、これは、アプリケーションを使用しているユーザーのユーザー名ではなく、API サーバーにログインしているユーザーの名前を取得するだけです。
いろいろ調べてみたところ、ユーザーのデータベースのユーザー名と名前が、ApiAccessToken というカスタム オブジェクトに格納されていることがわかりました。問題は、この ApiAccessToken オブジェクトが Controller クラスのメソッドでのみ設定されていることです。
例えば:
@RequestMapping(path = "/api/foo", method = RequestMethod.GET)
public List<Bar> getBarForDatabase(@RequestParam(value = "api_key") String apiKey{
ApiAccessToken accessToken = validateApiKey(apiKeyService, apiKey);
// Etc
}
ApiAccessToken と validateApiKey() のコードは次のとおりです。
public final class ApiAccessToken {
private String databaseName;
private String username;
public String getDatabaseName() { return databaseName; }
public void setDatabaseName(String databaseName) { this.databaseName = databaseName; }
public String getUsername() { return username; }
public void setUsername(String username) { this.username = username; }
}
と
protected ApiAccessToken validateApiKey(ApiKeyService apiKeyService, String apiKey){
UserAccountJdbcRepository userAccountJdbcRepository = new UserAccountJdbcRepository(createDataSourceForDatabase(USERS_DATABASE_NAME));
ApiAccessToken accessToken = apiKeyService.validateApiKey(userAccountJdbcRepository, apiKey);
if (accessToken == null) {
throw new InvalidApiKeyException();
}
return accessToken;
}
私のもう 1 つのアイデアは、値を格納する Controller クラスにローカル変数をapiKey
用意し、getter を使用してその値を他のメソッドに渡すことでした。たとえば、Controller クラスでは次のようになります。
private static String apiKey;
public static String getApiKey() { return apiKey; }
@RequestMapping(path = "/api/foo", method = RequestMethod.GET)
public List<Bar> getBarForDatabase(@RequestParam(value = "api_key") String apiKey{
ApiAccessToken accessToken = validateApiKey(apiKeyService, apiKey);
apiKey = this.apiKey;
//Etc
}
次に、Raygun に例外の詳細を送信するクラスで:
String apiKey = Controller.getApiKey();
ApiAccessToken accessToken = validateApiKey(apiKeyService, apiKey);
username = accessToken.getUsername();
database = accessToken.getDatabaseName();
しかし、これは NullPointerException を返すだけで、Raygun には何も送信しません。
他に何を試すべきか完全にはわからないので、どんな助けでも大歓迎です。含めるべきだと思われるもので、私が省略したものがある場合はお知らせください。繰り返しますが、私はまだ Spring MVC にかなり慣れていないため、これのほとんどを書いた開発者はもう私たちと一緒に雇われていません。