【问题标题】:Internal Server Error in Play frameworkPlay 框架中的内部服务器错误
【发布时间】:2014-05-23 15:14:12
【问题描述】:

我想在 Play 框架中渲染一个简单的页面 页面位于 localhost:9000/upload

但是当我尝试加载这个页面时,我得到了这个奇怪的堆栈跟踪。错误不是编译也不是运行时。这是一些堆栈跟踪行。 ---(从 SBT 运行应用程序,启用自动重新加载)---

  [info] play - Listening for HTTP on /0.0.0.0:9000

  (Server started, use Ctrl+D to stop and go back to the console...)

  [info] play - database [default] connected at jdbc:mysql://192.168.2.250:3306/DP
  AU
  [info] play - Application started (Dev)
  [error] application -

  ! Internal server error, for (GET) [/indicatorupload] ->

  java.lang.VerifyError: Stack map does not match the one at exception handler 563

  Exception Details:
  Location:
  controllers/IndicatorUploadController.updateIndicatorTable(Lcontrollers/Indi
  catorUploadController$ExcelInd;I)V @563: astore_3
  Reason:
  Type 'controllers/IndicatorUploadController$ExcelInd' (current frame, locals
  [5]) is not assignable to 'models/Indicators' (stack map, locals[5])
  Current Frame:
  bci: @463
  flags: { }
  locals: { 'controllers/IndicatorUploadController$ExcelInd', integer, 'models
  /Indicators', top, top, 'controllers/IndicatorUploadController$ExcelInd', 'java/
  lang/String' }
  stack: { 'java/lang/NumberFormatException' }
  Stackmap Frame:
  bci: @563
  flags: { }
  locals: { 'controllers/IndicatorUploadController$ExcelInd', integer, 'models
  /Indicators', top, top, 'models/Indicators', 'java/lang/Object' }
   stack: { 'java/lang/NumberFormatException' }
  Bytecode:
  0000000: bb00 8e59 b700 8f4d b800 9057 2c1b 85b8
  0000010: 0091 3a06 3a05 1905 1906 b602 d92c 2a3a
  0000020: 0501 3a06 1905 b602 b23a 0619 063a 063a
  0000030: 0519 0519 06b6 02dc 2c2a 3a05 013a 0619
  0000040: 05b6 02b8 3a06 1906 3a06 3a05 1905 1906
  0000050: b602 df2c 2a3a 0501 3a06 1905 b602 be3a
  0000060: 0619 063a 063a 0519 0519 06b6 02e2 2c2a
  0000070: 3a05 013a 0619 05b6 02c7 3a06 1906 3a06
  0000080: 3a05 1905 1906 b602 e52c 2a3a 0501 3a06
  0000090: 1905 b602 e83a 0619 063a 063a 0519 0519
  00000a0: 06b6 02eb 2c2a 3a05 013a 0619 05b6 02ee
  00000b0: 3a06 1906 3a06 3a05 1905 1906 b602 f12c
  00000c0: 2a3a 0501 3a06 1905 b602 c13a 0619 063a
  00000d0: 063a 0519 0519 06b6 02f4 2c2a 3a05 013a
  00000e0: 0619 05b6 02c4 3a06 1906 3a06 3a05 1905
  00000f0: 1906 b602 f72c 2a3a 0501 3a06 1905 b602

我尝试在我的项目目录中设置 _JAVA_OPTION = -XX:-UseSplitVerifier 然后尝试运行。 cmd 行应该显示 "Picked up _JAVA_OPTIONS: -XX:-UseSplitVerifier" 但我也没有得到。 (我很困惑是 JAVA_OPTION 还是 _JAVA_OPTION)。我什至在环境变量中设置了相同的 JAVA_OPTION

【问题讨论】:

    标签: java playframework playframework-2.2


    【解决方案1】:

    来自VerifyError 的 Javadoc:

    当“验证程序”检测到类文件虽然格式正确,但包含某种内部不一致或安全问题时引发。

    此错误可能是由于针对类或库的一个版本进行编译,然后针对该类/库的不同版本运行而导致的。 This answer 给出了很好的解释。

    Exception Details:
    
    Location: controllers/IndicatorUploadController.updateIndicatorTable(Lcontrollers/IndicatorUploadController$ExcelInd;I)V @563: astore_3
    Reason:
    Type 'controllers/IndicatorUploadController$ExcelInd' (current frame, locals
    [5]) is not assignable to 'models/Indicators' (stack map, locals[5])
    

    看起来您的控制器有一个名为ExcelInd 的内部类,它是您的Indicators 模型类的子类。看起来您的 updateIndicatorTable 方法中有一行试图将 ExcelInd 的实际类型的值分配给 Indicators 类型的引用。这听起来很有效,但在实际运行的代码中,这两个类之间似乎没有继承关系。

    如果您最近引入了这种继承关系,我会尝试在您的 Play 控制台中运行 clean 任务,看看是否可以解决您的问题。

    【讨论】:

      【解决方案2】:

      该错误是由 javaassist 上的错误引起的。随着新版本 3.18.2 的解决。如下添加到project/plugins.sbt

      libraryDependencies += "org.javassist" % "javassist" % "3.18.2-GA"
      

      更多关于这个问题here

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-07-20
        • 2018-04-09
        • 1970-01-01
        • 1970-01-01
        • 2021-03-17
        • 2019-05-18
        • 2021-05-12
        • 2017-10-25
        相关资源
        最近更新 更多