Lang ToStringBuilder请求参数记录

时间:2011-05-31 18:37:29

标签: java log4j request apache-commons

我需要在某些情况下记录所有请求参数以进行调试......

我尝试使用ToStringBuilder.reflectionToString(request),但它仍显示内存地址

有没有简单的方法来记录纯文本中的请求参数,以便我可以做一些事情

logger.info(ToStringBuilder.reflectionToString(请求)); ?

我也试过logger.info(ToStringBuilder.reflectionToString(request.getParameterMap());

2 个答案:

答案 0 :(得分:3)

reflectionToString仅对给定的对象使用反射,以查找要打印的属性。属性本身使用其toString()方法输出。 请求和参数映射都没有您感兴趣的请求参数作为直接属性,因此reflectionToString对您失败。

我知道在JDK或commons-lang中没有OOTB深入反射打印对象的方法。

简单的呼叫是什么

logger.info(request.getParameterMap());

为你生产?

啊,我明白了:参数值是String数组,只打印它们的哈希码。

您可以尝试这样的辅助函数(免责声明:未编译和未经测试)

public static String getParameterToString(ServletRequest request){
  StringBuilder sb = new StringBuilder("{");
  for (Map.Entry<String, String[]> entry : request.getParameterMap().entrySet()){
    sb.append(entry.getKey()).append(":");
    sb.append(Arrays.toString(entry.getValue())).append(",");
  }
  if (sb.length() > 1)
    sb.setLength(sb.length() - 1);
  return sb.append("}").toString();
}

答案 1 :(得分:1)

此功能已经过测试

public static String dumpParams(ServletRequest req) {
    StringBuilder sb = new StringBuilder();
    Set<Map.Entry<String, String[]>> entries = req.getParameterMap().entrySet();
    for (Map.Entry<String, String[]> entry : entries) {
        sb.append(entry.getKey())
          .append(" = ")
          .append(Arrays.toString(entry.getValue()))
          .append(", ");
    }
    if (sb.length() > 2)
        sb.setLength(sb.length() - 2);  //Removes the last comma
    return sb.toString();
}