Java IntelliJ IDEA中的代码标记为编译器错误,在Eclipse中可以正常工作
我正在尝试设置IntelliJ工作区,以便在eclipse项目上进行开发。我遇到的一件事相当令人困惑:Java IntelliJ IDEA中的代码标记为编译器错误,在Eclipse中可以正常工作,java,eclipse,spring,servlets,intellij-idea,Java,Eclipse,Spring,Servlets,Intellij Idea,我正在尝试设置IntelliJ工作区,以便在eclipse项目上进行开发。我遇到的一件事相当令人困惑: Error:(24, 8) java: SomeClass.java:24: getHeader(java.lang.String) in org.springframework.mock.web.MockHttpServletResponse cannot implement getHeader(java.lang.String) in javax.servlet.http.HttpServ
Error:(24, 8) java: SomeClass.java:24: getHeader(java.lang.String) in org.springframework.mock.web.MockHttpServletResponse cannot implement getHeader(java.lang.String) in javax.servlet.http.HttpServletResponse; attempting to use incompatible return type
found : java.lang.Object
required: java.lang.String
问题在于以下类定义:
public class SomeClass extends MockHttpServletResponse {
问题似乎是因为MockHttpServletResponse将集合getHeaders(String)
实现为公共列表getHeaders(String name)
。在这里,我可以看到实现方法使用了一个原始的列表
,其中父级请求使用字符串
键入一个通用的集合
。除了可能不安全之外,IntelliJ为什么要将其标记为编译器错误而不是警告
我没有选择改变这些库中的任何一个。我只是想在IntellJ 14中实现在Eclipse4.3+中已经可以正常工作的功能
编辑:
我已经更新到Intellij15.0,该项目现在使用Java1.7而不是1.6。我仍然在使用IntelliJ时遇到这个问题,但是这个问题在Eclipse中根本没有出现。我可以通过IntelliJ使用现有的Ant脚本编译项目,但我无法通过IDE进行调试
这是我的类定义
public class ExecutableServletResponse extends MockHttpServletResponse {
...
以下是我的“消息”窗格中显示的错误:
Error:(24, 8) java: getHeader(java.lang.String) in org.springframework.mock.web.MockHttpServletResponse cannot implement getHeader(java.lang.String) in javax.servlet.http.HttpServletResponse
return type java.lang.Object is not compatible with java.lang.String
project SDK使用的是1.7版(确切地说是1.7.079)。语言水平为7级。模块SDK和语言级别与项目匹配
我已经尝试过使用eclipse编译器,但是应用程序仍然没有完全编译,并且可能无法运行,因为它无法编译这个类,而webapp的整个部分也无法编译
以下是我的错误截图,FWIW:
您在类中看到了错误,但真正的问题是Spring模拟库与您使用的Servlet规范不兼容。如果您升级到Servlet3.0规范(或者添加了一个依赖项以传递方式将其拉入),则可能会发生这种情况。检查您的依赖项并确保:
- 仅提供Servlet 2.5,或
- 您使用的是与Servlet3.0兼容的Spring版本。还要确保所有Spring依赖项都使用相同的版本
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-mock</artifactId>
<version>2.0.8</version>
</dependency>
javax.servlet
servlet api
2.5
假如
org.springframework
春季模拟
2.0.8
这应该是:
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-web-api</artifactId>
<version>6.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>3.1.0.RELEASE</version>
<scope>test</scope>
</dependency>
爪哇
javaeewebapi
6
假如
org.springframework
弹簧试验
3.1.0.1发布
测试
但这将失败:
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.2.2.RELEASE</version>
<scope>test</scope>
</dependency>
javax.servlet
servlet api
2.5
假如
org.springframework
弹簧试验
4.2.2.1发布
测试
它在Eclipse中工作,但在IntelliJ中不工作,这表明您有多个提供相同类的依赖项。无法保证系统将使用哪个jar加载该类。这可能是因为类路径上既有
servlet api
和javaee web api
,也可能是因为类路径上既有spring mock
和spring test
。在版本2.0.8之后,spring-mock
中的类被移动到spring-test
,并且只有版本3.1.0.RELEASE和更高版本的spring-test
与Servlet 3.0兼容。根据我的项目设置(使用ctrl+alt+shift+s),您是否在这两种情况下使用相同的JDK?以及相同的遵从性级别显示我使用1.6作为项目SDK,使用1.6作为语言级别(用于项目和所有模块)。这似乎与我在Eclipse中使用的相同(使用jdk1.6.0_45和1.6 JDK Compliance),嗯……Spring Javadoc说它正确地返回了列表。此外,它还抱怨存在一个方法对象getHeader(String)
,而不是字符串getHeader(String)
,而不是getHeaders。您是否覆盖了子类中的getHeader?IntelliJ设置是否可能以某种方式使用了不同的servlet依赖关系?我刚刚尝试过,Spring2.5.6+Servlet3产生了这个错误,而Spring2.5.6和Servlet2.5则没有。与Servlet3之间存在一个不兼容的问题,Spring3.1解决了这个问题。我从IntelliJ类路径中删除了spring mock.jar
,错误消失了。原来spring test
也可用,所以问题得到了解决。