我正在开发REST API服务,每次发生异常时,我都需要在日志中显示发生此异常的参数,方法和类名。所以我有方法
的单例类public void log(final String className,String methodName,final Map<String,String> params,final String cause) {
final StringBuilder result=new StringBuilder();
for (Map.Entry<String, String> entry : params.entrySet()) {
result.append(entry.getKey()+" "+entry.getValue()+" ");
}
log.info("\n\t\t\tClass: "+className+"\n\t\t\t Method: "+methodName+"\n\t\t\t Params: "+result.toString()+" \n\t\t\t "+"Reason: "+cause);
}
使用示例
public String checkSession(String sid) {
final Map<String, String> params = new HashMap<String, String>();
params.put("sid", sid);
if (sid.isEmpty()) {
logger.log(this.getClass().getSimpleName(), "checkSession", params, " not valid session");
return Enums.Error.WRONG_SESSION.toString();
}
}
然而,在每种方法中,我都需要使用所有参数初始化此映射。如何编写将为所有方法返回Map的方法?
例如我有两种方法
public String createPass(String name,String surname) {
final Map<String, String> params = new HashMap<String, String>();
params.put("name", name);
params.put("surname", surname);
}
public String checkSession(String sid) {
final Map<String, String> params = new HashMap<String, String>();
params.put("sid", sid);
}
我需要的方法就像
public HashMap<String,String> method(String args...){
final Map<String, String> params = new HashMap<String, String>
for(...)
map.put("parameter","parameterName");
}
答案 0 :(得分:0)
我认为你能做的最好的事情是这样的:
public Map<String,String> paramsToMap(String... params){
final Map<String, String> map = new HashMap<>();
for(int i=0; i<params.length-1; i=i+2) {
map.put(params[i], params[i+1]);
}
return map;
}
你这么称呼它:
public String createPass(String name, String surname) {
final Map<String, String> params = paramsToMap("name", name, "surname", surname);
}
public String checkSession(String sid) {
final Map<String, String> params = paramsToMap("sid", sid);
}
我希望我们可以使用反射,但是在编译时会删除参数名称,并且您将留下arg0
,arg1
等...所以无法实现您想要的效果使用反射。您必须自己输入参数名称。
另外作为附注,我认为最好使用Map<String, Object>
并让log
方法排除如何将其打印到日志中。可能使用String.valueOf()