Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 有没有一种方法可以多次迭代HttpServletRequest.getAttributeNames()呢?_Java_Attributes_Enumeration_Servlets_Enumerator - Fatal编程技术网

Java 有没有一种方法可以多次迭代HttpServletRequest.getAttributeNames()呢?

Java 有没有一种方法可以多次迭代HttpServletRequest.getAttributeNames()呢?,java,attributes,enumeration,servlets,enumerator,Java,Attributes,Enumeration,Servlets,Enumerator,我正在尝试记录HttpServletRequest属性集合的内容。我需要在servlet第一次启动时执行此操作,然后在servlet完成之前再次执行此操作。我这样做是为了理解一个粗糙且维护不当的servlet。因为我需要尽可能少的影响,所以servlet过滤器不是一个选项 这就是问题所在。当servlet启动时,我将遍历HttpServletRequest.getAttributeNames()返回的枚举。但是,当我想再次遍历它时,getAttributeNames().hasMoreEleme

我正在尝试记录HttpServletRequest属性集合的内容。我需要在servlet第一次启动时执行此操作,然后在servlet完成之前再次执行此操作。我这样做是为了理解一个粗糙且维护不当的servlet。因为我需要尽可能少的影响,所以servlet过滤器不是一个选项

这就是问题所在。当servlet启动时,我将遍历HttpServletRequest.getAttributeNames()返回的枚举。但是,当我想再次遍历它时,getAttributeNames().hasMoreElements()返回“false”!我找不到任何方法“重置”枚举。更糟糕的是,即使我使用HttpServletRequest.setAttribute()向集合添加属性,调用getAttributeNames().hasMoreElements()时仍然会得到“false”的结果

这真的有可能吗?真的没有办法对属性名称进行多次迭代吗

根据要求,这是我的代码。这很简单,别以为我在做什么有趣的事

/**
 * 
 * Returns the contents of the Attributes collection, formatted for the InterfaceTracker loglines
 * 
 */
@SuppressWarnings("unchecked")
public static String getAttributes(HttpServletRequest request) {
    try {       
        StringBuilder toLog = new StringBuilder();  

        Enumeration attributeNames = request.getAttributeNames();           

        while(attributeNames.hasMoreElements()) {
            String current = (String) attributeNames.nextElement();

            toLog.append(current + "=" + request.getAttribute(current));            

            if(attributeNames.hasMoreElements()) {
                toLog.append(", ");
            }           
        }       

        return "TRACKER_ATTRIBUTES={"+ toLog.toString() + "}";
    }
    catch (Exception ex) {
        return "TRACKER_ATTRIBUTES={" + InterfaceTrackerValues.DATA_UNKNOWN_EXCEPTION_THROWN + "}";
    }               
}

也许您应该在调用
HttpServletRequest.setAttribute()
的地方发布代码

在这一点上,您粗糙且维护不好的servlet似乎正在删除对
getAttributeNames()
的两次调用之间的属性,但是如果没有任何代码示例,就很难说了

更新

你的代码中没有任何东西会因为我的错误而跳出来。。。因此,我在
handleRequest()
中构建了一个极其简单的测试用例,并对其进行了测试(使用jboss-eap-4.3作为容器)。我必须首先手动设置一个属性,因为我对请求属性的理解是,它们总是在服务器端设置的(即,如果我没有设置它,那么我就没有得到任何输出,因为
getAttributeNames()
返回的
枚举
是空的)

输出

INFO  [STDOUT] muckingwattrs
INFO  [STDOUT] ----------------------------
INFO  [STDOUT] muckingwattrs

因此,您的容器可能没有正确实现
getAttributeNames()
?也许可以直接在
handleRequest()
doGet()/doPost()

中尝试一个像我这样非常简单的测试用例,谢谢你的帮助,但我知道这不是servlet的错。作为测试,我尝试在迭代集合之后,在同一个函数中向集合添加属性。尽管如此,hasMoreElements()返回为false。也许您没有第二次回调GetAttributeName,这就是为什么完整示例会很有趣的原因。还有,您使用哪个servlet容器?好的,我发现了我的问题。我觉得有点傻,因为这个问题与HttpServletRequest无关。我最终注意到,我只是在单元测试中遇到了这个问题,而不是在实际运行servlet时。事实证明,我用错了Mockito。因此,尽管您无法找到我的问题的根本原因,但您确实帮助我排除了HttpServletRequest的可能性。谢谢!通常不是这样吗?:)很高兴我们能帮忙(即使是间接的)!所以您在服务开始时调用getAttributes方法/doGet/doPost方法,然后在结束时再次调用它,rite?Downvoting,因为这只是一个用户错误。
INFO  [STDOUT] muckingwattrs
INFO  [STDOUT] ----------------------------
INFO  [STDOUT] muckingwattrs