3

出于某种原因,将@Override方法覆盖接口方法会导致 JSP 编译在 weblogic 中失败。一切肯定都在流失JDK 1.6.0_14,但这种 Java 5 主义仍然存在。

奇怪的是,JSP 编译偶尔会失败,堆栈跟踪指向 JSP 本身不一定明显使用的代码。

这里发生了什么?

4

5 回答 5

3

我自己也见过很多。在 Java 6 中,(假设)允许在接口实现方法上使用 @Override。在 Java 5 中,这是一个错误。但是在我的 Java 6 代码中,有时 @Override 在接口实现方法上被接受,有时则不是。

更奇怪的是,一些 IDE(例如 NetBeans)可以使用它,而 IntelliJ IDEA 有时可以,有时不行。但是,我发现在任一 IDE 中编译代码都会忽略 IDE 报告的所谓错误。

换句话说,问题是否体现在您的 IDE 中?如果是这样,直接编译代码(必要时使用命令行),看看会发生什么。IDE 可能会报告虚假错误。

于 2010-08-28T13:06:40.530 回答
3

@Override 应该只保留在源代码中,因此不应出现在字节码中。您可以从某个角度确保这些类与 JSP 分开编译并且仅在类路径中可用,而不是在源路径中可用。

如果情况已经如此,那么它可能与立即显示的问题不同。

曾经是 JSP 编译器,它是服务器附带的一个单独的库,与运行服务器的 vm 无关。WLS 曾经使用 Javelin。似乎他们在 10 中将其切换为使用Java Compiler API。因此,只要您拥有 Sun vm Java 1.6,它就应该可以正常工作。但是如果你的堆栈跟踪中有“标枪”的东西,一定要检查那个角度。

于 2010-08-31T20:08:18.903 回答
1

一种可能的解决方法可能是使用appc. 这至少可以规避这个问题。

关于“真正”的问题,我的理解是您确实升级了域,所以也许看看以下资源:

这是一个疯狂的猜测,但可能激活了一些向后兼容性标志,并且 WebLogic 继续使用“旧”方法。

于 2010-09-03T23:53:48.453 回答
0

我同意您的直觉以及 WLS 在这里使用 Java 5 的其他答案。下面的项目似乎是来自 Oracle/WebLogic 资源的有用花絮。我没有安装 WebLogic Server 10.3 来确认这些:

网络逻辑服务器 10.3

据此,至少需要 Weblogic Server 10.3 才能使用 Java 6,但我看不到任何确认这是权威信息的东西:

回复:WebLogic 10.0 支持 Java 6?
发布时间:2009 年 4 月 9 日下午 12:26 回复:user8324142
您好,
Weblogic 10 将不支持 JDK6。
请升级到 Weblogic 10.3 以使用 JDK 6。

检查 Java 版本

确定您使用的 JDK 版本

您可以通过发出命令来确定您使用的是哪个版本的 JDK,如下所示:

  1. 打开命令提示符窗口并转到相应的目录:
    BEA_HOME\WL_HOME\server\bin (Windows)
    BEA_HOME/WL_HOME/server/bin (UNIX)

    在这两个路径名中,BEA_HOME 代表您安装软件的目录,WL_HOME 代表 wlserver_<版本>。

  2. 通过在提示符处输入以下命令,确保您的环境设置正确: setWLSenv.cmd (Windows)
    setWLSenv.sh (UNIX)

  3. 在提示符处输入以下命令:java -version

配置Java版本:

设置用于启动 WebLogic Server 的 Java 参数

... 每次启动 WebLogic Server 时都必须指定 Java 参数。... Oracle 建议您将命令合并到 [startup] 脚本中...

如果您使用配置向导创建域,则 WebLogic 启动脚本位于您指定域的域名目录中。默认情况下,该目录为 BEA_HOME\user_projects\domain\domain-name,其中 BEA_HOME 为包含产品安装的目录,domain-name 为所选配置模板定义的域目录名称。...

将变量 JAVA_HOME 的值更改为 JDK 的位置。例如:
set JAVA_HOME=C:\bea\jdk150_03

...

于 2010-09-05T18:09:10.813 回答
-2

在我看来,@Override对于覆盖方法而不是实现方法的方法是有意义的。

所以如果你有一个接口:

public interface MyInterface {
    public void doSomething();
}

实现该接口的类如下(MyClassA):

public MyClassA implements MyInterface {
    public void doSomething() {
        System.out.println("This is from MyClassA");
    }
}

然后,下面的类 extendsMyClassAoverrides doSomething,然后我会添加@Override注释。

public MyClassB extends MyClassA implements MyInterface {
    @Override
    public void doSomething() {
        System.out.println("This is from MyClassB");
    }
}

在任何情况下,我都不会执行以下操作(无论是否允许),因为它打破了覆盖某些东西的想法——你正在实现,而不是覆盖接口:

public MyClassA implements MyInterface {
    @Override
    public void doSomething() {
        System.out.println("This is from MyClassA");
    }
}
于 2010-08-31T19:18:22.740 回答