接口方法的@Override导致JSP编译失败

时间:2010-08-23 15:51:32

标签: java jsp annotations weblogic-10.x

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

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

这里发生了什么?

5 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:3)

@Override应该只保留在源代码中,所以不应该出现在字节代码中。您可以发挥一定的作用,确保这些类与JSP分开编译,并且只在类路径中提供 - 而不是源路径。

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

以前是JSP编译器是服务器附带的一个单独的库,并不依赖于运行服务器的虚拟机.WLS用于使用Javelin。好像他们在10中切换使用Java Compiler API。所以只要你有Sun vm Java 1.6就可以正常工作。但是如果你的堆栈跟踪中有任何“标枪”,那么一定要检查这个角度。

答案 2 :(得分:1)

可能的解决方法可能是使用appc预编译JSP。这至少可以避免这个问题。

关于“真实”问题,我的理解是您确实升级了域名,因此可能需要查看以下资源:

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

答案 3 :(得分:0)

我同意你的直觉以及WLS在某处使用Java 5的其他答案。下面的项目看起来像Oracle / WebLogic资源中的有用花絮。我没有安装WebLogic Server 10.3来确认这些:

Weblogic Server 10.3

根据这一点,至少需要Weblogic Server 10.3才能使用Java 6,但我看不到任何确认为权威信息的内容:

  

Re: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.   
  3. 通过在提示符处输入以下命令,确保您的环境已正确设置:   setWLSenv.cmd(Windows)
      setWLSenv.sh(UNIX)

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

  6.   

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

     

...

答案 4 :(得分:-2)

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

所以如果你有一个界面:

public interface MyInterface {
    public void doSomething();
}

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

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

然后,下面的类扩展MyClassA覆盖 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");
    }
}