我正在尝试调试一些代码以确保我设置了一些HttpServletResponse 标题正确。为此,我只想打印出来自HttpServletRequest和HttpServletResponse的头文件。请求端工作正常,但响应没有,因为response.getHeaderNames()未定义。
private void printDebug(HttpServletRequest request, HttpServletResponse response) {
System.out.println("----- Request ---------");
Collections.list(request.getHeaderNames()).forEach(n -> System.out.println(n + ": " + request.getHeader(n.toString())));
System.out.println("----- Response ---------");
response.getHeaderNames().forEach(n -> System.out.println(n + ": " + response.getHeader(n)));
}
使用:
Eclipse Oxygen.1a版本(4.7.1a)
Tomcat v.7.0
jdk1.8.0_112
项目方面:
动态Web模块3.1
在我的pom文件中:
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
但有些地方我确定有一个我缺少的配置,默认情况下我们将Eclipse指向2.5 javax.servlet-api,但我不知道在哪里查看或如何更改它。
更新:如果我取消选中“动态网络模块”,然后执行maven更新,maven会将动态网络模块设置回2.5
如何让这个getHeaderNames()起作用?
答案 0 :(得分:1)
问题在于,当我编译javax.servlet-api v2.5时,即使我在我的pom中明确地包含3.1。
首先,正如@Oleg建议的那样,我打开了HttpServletResponse的声明并检查了包浏览器以找出HttpServletResponse的来源。它来自Maven Dependencies中的servlet-api-2.5.jar。这是我认为发生的事情,但不是我想要的。
接下来,我浏览了所有依赖关系层次结构,以找到包含2.5版本的pom中的哪个条目。我注意到jstl工件包含了我不想要的旧版本。
所以我改变了这个:
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
到此:
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
<exclusions>
<exclusion>
<groupId>java.servlet</groupId>
<artifactId>servlet-api</artifactId>
</exclusion>
</exclusions>
</dependency>
最后,我做了一个Maven更新和一个干净的编译,以确保它有效。
希望这有助于其他人!
谢谢@Oleg。