从另一个 class 中的方法获取参数值
Get parameter value from method in another class
我想要实现的是,使用 Raygun(一种崩溃报告服务)发送遇到问题的用户的详细信息。
我最初尝试使用与此类似的方法来获取用户名:
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
username = authentication.getName();
但出于某种原因,这返回了值 ipaduser
。我不确定该值从何而来,但这显然不是答案。
然后我尝试了:
System.getProperty("user.name");
但这只是获取我们 API 服务器的登录用户的名称,而不是使用该应用程序的用户的用户名。
经过一番挖掘,我发现用户的用户名和数据库名称存储在名为 ApiAccessToken 的自定义对象中。问题是,这个 ApiAccessToken 对象只在我们控制器的方法中设置 classes.
例如:
@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;
}
我的另一个想法是在控制器 class 中有一个局部变量来存储 apiKey
的值,然后我会使用 getter 将该值传递给另一个方法.例如,在控制器中 class:
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
}
然后在 class 中我向 Raygun 发送异常详细信息:
String apiKey = Controller.getApiKey();
ApiAccessToken accessToken = validateApiKey(apiKeyService, apiKey);
username = accessToken.getUsername();
database = accessToken.getDatabaseName();
但是那只是 returns 一个 NullPointerException 并且不会向 Raygun 发送任何东西。
任何帮助将不胜感激,因为我不完全确定还可以尝试什么。让我知道是否有任何您认为我应该包含的遗漏内容。再一次,我对 Spring MVC 还是很陌生,编写大部分内容的开发人员不再受雇于我们。
由于api_key是一个请求参数,只能通过controller获取。
class Controller {
@RequestMapping(path = "/api/foo", method = RequestMethod.GET)
public List<Bar> getBarForDatabase(@RequestParam(value = "api_key") String apiKey) {
...
Raygun.sendException(apiKey)
...
}
}
class Raygun {
public static sendException(String apiKey) {
ApiAccessToken accessToken = validateApiKey(apiKeyService, apiKey);
username = accessToken.getUsername();
database = accessToken.getDatabaseName();
...
}
}
如果你想在多个地方使用api键获取用户信息,看看Interceptor
在 Minh Hoang 的建议下,我解决了这个问题。
我向 class RaygunUnhandledExceptionHandler 添加了一个全局变量:
private static ApiAccessToken accessToken = new ApiAccessToken();
然后我在 RaygunUnhandledExceptionHandler 中编写了这个方法来获取 accessToken
并将其设置为我在上面声明的变量:
public static void getAccessTokenFromController(ApiAccessToken accessTokenFromController) { accessToken = accessTokenFromController; }
然后我将此行添加到控制器中的 /api/foo,以便它将 accesstoken
发送到 RaygunUnhandledExceptionHandler:
// Sends the API Key to RaygunUnhandledExceptionHandler
RaygunUnhandledExceptionHandler.getAccessTokenFromController(accessToken);
然后在RaygunUnhandledExceptionHandler中的defaultErrorHandler()中:
ArrayList tags = new ArrayList<String>();
tags.add("username: " + accessToken.getUsername());
tags.add("database: " + accessToken.getDatabaseName());
再次感谢 Minh Hoang 和 fantahirocco 帮助我解决这个问题。
如果您发现此实施有任何问题,请告诉我。
我想要实现的是,使用 Raygun(一种崩溃报告服务)发送遇到问题的用户的详细信息。
我最初尝试使用与此类似的方法来获取用户名:
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
username = authentication.getName();
但出于某种原因,这返回了值 ipaduser
。我不确定该值从何而来,但这显然不是答案。
然后我尝试了:
System.getProperty("user.name");
但这只是获取我们 API 服务器的登录用户的名称,而不是使用该应用程序的用户的用户名。
经过一番挖掘,我发现用户的用户名和数据库名称存储在名为 ApiAccessToken 的自定义对象中。问题是,这个 ApiAccessToken 对象只在我们控制器的方法中设置 classes.
例如:
@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;
}
我的另一个想法是在控制器 class 中有一个局部变量来存储 apiKey
的值,然后我会使用 getter 将该值传递给另一个方法.例如,在控制器中 class:
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
}
然后在 class 中我向 Raygun 发送异常详细信息:
String apiKey = Controller.getApiKey();
ApiAccessToken accessToken = validateApiKey(apiKeyService, apiKey);
username = accessToken.getUsername();
database = accessToken.getDatabaseName();
但是那只是 returns 一个 NullPointerException 并且不会向 Raygun 发送任何东西。
任何帮助将不胜感激,因为我不完全确定还可以尝试什么。让我知道是否有任何您认为我应该包含的遗漏内容。再一次,我对 Spring MVC 还是很陌生,编写大部分内容的开发人员不再受雇于我们。
由于api_key是一个请求参数,只能通过controller获取。
class Controller {
@RequestMapping(path = "/api/foo", method = RequestMethod.GET)
public List<Bar> getBarForDatabase(@RequestParam(value = "api_key") String apiKey) {
...
Raygun.sendException(apiKey)
...
}
}
class Raygun {
public static sendException(String apiKey) {
ApiAccessToken accessToken = validateApiKey(apiKeyService, apiKey);
username = accessToken.getUsername();
database = accessToken.getDatabaseName();
...
}
}
如果你想在多个地方使用api键获取用户信息,看看Interceptor
在 Minh Hoang 的建议下,我解决了这个问题。
我向 class RaygunUnhandledExceptionHandler 添加了一个全局变量:
private static ApiAccessToken accessToken = new ApiAccessToken();
然后我在 RaygunUnhandledExceptionHandler 中编写了这个方法来获取 accessToken
并将其设置为我在上面声明的变量:
public static void getAccessTokenFromController(ApiAccessToken accessTokenFromController) { accessToken = accessTokenFromController; }
然后我将此行添加到控制器中的 /api/foo,以便它将 accesstoken
发送到 RaygunUnhandledExceptionHandler:
// Sends the API Key to RaygunUnhandledExceptionHandler
RaygunUnhandledExceptionHandler.getAccessTokenFromController(accessToken);
然后在RaygunUnhandledExceptionHandler中的defaultErrorHandler()中:
ArrayList tags = new ArrayList<String>();
tags.add("username: " + accessToken.getUsername());
tags.add("database: " + accessToken.getDatabaseName());
再次感谢 Minh Hoang 和 fantahirocco 帮助我解决这个问题。
如果您发现此实施有任何问题,请告诉我。