有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

IntelliJ IDEA中的java代码标记为编译器错误,在Eclipse中可以正常工作

我正在尝试设置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中实现在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:

enter image description here


共 (1) 个答案

  1. # 1 楼答案

    您在类中看到了错误,但真正的问题是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>
    

    这应该是:

    <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并且只移动到版本3.1.0。spring-test的发行版和更高版本与Servlet 3.0兼容