【问题标题】:Code in IntelliJ IDEA marked with compiler error where it works fine in EclipseIntelliJ IDEA 中的代码标有编译器错误,在 Eclipse 中运行良好
【发布时间】:2015-09-26 20:23:08
【问题描述】:

我正在尝试设置我的 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 将 Collection<String> getHeaders(String) 实现为 public List getHeaders(String name)。在这里,我可以看到实现方法使用了原始List,其中父请求使用String 键入的通用Collection。除了可能不安全之外,为什么 IntelliJ 会将其标记为编译器错误而不是警告?

我无法更改这些库中的任何一个。我只是想在 IntellJ 14 中工作,而在 Eclipse 4.3+ 中已经可以正常工作。

编辑:

我已经更新到 IntelliJ 15.0,并且该项目现在使用 Java 1.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

项目 SDK 使用的是 1.7 版本(准确地说是 1.7.0_79)。语言级别为 7。模块 SDK 和语言级别与项目匹配。

我已经尝试使用 eclipse 编译器,但是应用程序仍然没有完全编译,并且可能无法运行,因为它无法编译此类,因此整个 webapp 的一部分没有编译.

这是我的错误截图,FWIW:

【问题讨论】:

  • 你在这两种情况下使用相同的JDK吗?
  • 和相同的合规级别?
  • 根据我的项目设置(使用 ctrl+alt+shift+s)显示我使用 1.6 作为项目 SDK 和 1.6 作为语言级别(用于项目和所有模块)。这似乎与我在 Eclipse 中的相同(使用 jdk1.6.0_45 和 1.6 JDK 兼容)
  • 嗯...Spring Javadoc 说 getHeaders 正确返回 List。此外,它抱怨有一个方法Object getHeader(String) 而不是String getHeader(String),而不是关于getHeaders。你在你的子类中覆盖了 getHeader 吗?
  • 您的 IntelliJ 设置是否可能以某种方式使用不同的 servlet 依赖项?我刚试过,Spring 2.5.6 + servlet 3 会产生这个错误,而 Spring 2.5.6 和 servlet 2.5 不会。有一个 issue in Spring JIRA 与 Servlet 3 不兼容,Spring 3.1 已修复此问题。

标签: java eclipse spring servlets intellij-idea


【解决方案1】:

您在类中看到了错误,但真正的问题是 Spring 模拟库与您使用的 Servlet 规范不兼容。如果您升级到 Servlet 3.0 规范(或添加了一个可传递的依赖项),则可能会发生这种情况。检查您的依赖关系并确保:

  • 仅提供 Servlet 2.5,或
  • 您正在使用与 Servlet 3.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>

应该这样:

<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>

但这会失败:

<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>

它在 Eclipse 中工作但在 IntelliJ 中不工作的事实表明您有多个提供相同类的依赖项。无法保证系统将使用哪个 jar 来加载类。这可能是因为您的类路径中有servlet-apijavaee-web-api,或者因为您的类路径中有spring-mockspring-test。在 2.0.8 版本之后,spring-mock 中的类被移到了spring-test,并且只有 spring-test 的 3.1.0.RELEASE 及更高版本与 Servlet 3.0 兼容。

【讨论】:

  • 看来就是这样。我从 IntelliJ 类路径中删除了spring-mock.jar,错误就消失了。原来spring-test也是可用的,这样问题就解决了。
猜你喜欢
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 2014-04-11
  • 2017-06-15
  • 1970-01-01
  • 2016-11-11
  • 2018-11-11
  • 2012-04-06
相关资源
最近更新 更多