Java IntelliJ IDEA中的代码标记为编译器错误,在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

我正在尝试设置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.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
也可用,所以问题得到了解决。