【问题标题】:Bad type on operand stack in method models.MyModel方法models.MyModel中操作数堆栈上的错误类型
【发布时间】:2012-08-11 09:22:12
【问题描述】:

这是我的模型文档:

@Entity
@Table(name = "documents")
public class Document extends Model {
    @Id
    public Long id;

    @Constraints.Required
    @Formats.NonEmpty
    @Column(nullable=false)
    public String document;
    
    public static Model.Finder<Long,Document> find = new Model.Finder(Long.class, Document.class);
    
    // Will return an absolute URL to this document
    public String getUrl() {
        return controllers.routes.Documents.display(document.toLowerCase()).absoluteURL(Http.Context.current().request());
    }
}

问题是,它在编译时抛出了一个VerifyError异常,我发现唯一可以避免它的方法是注释该行并将其替换为return null,这不是很有效。

这是该异常的堆栈跟踪:

Caused by: java.lang.VerifyError: Bad type on operand stack in method models.Document.getUrl()Ljava/lang/String; at offset 13
    at java.lang.Class.forName0(Native Method) ~[na:1.7.0_05]
    at java.lang.Class.forName(Class.java:264) ~[na:1.7.0_05]
    at play.db.ebean.EbeanPlugin.onStart(EbeanPlugin.java:69) ~[play_2.9.1.jar:2.0.2]

这个错误是什么?如何在不丢失 getUrl 方法的情况下避免它?

【问题讨论】:

  • 你的代码很奇怪,因为你的属性document是String类型,然后你调用document.name(),但是方法name()不是String类的一部分...
  • 对不起,我通过删除所有无用的东西来简化代码,但忘记那部分!

标签: playframework playframework-2.0 java-7


【解决方案1】:

我认为 Ebean 正在尝试在这里施展魔法。

我建议使用静态函数:

public static String buildUrl(String document) {
    return controllers.routes.Documents.display(document.toLowerCase()).absoluteURL(Http.Context.current().request());
}

【讨论】:

  • 很遗憾,即使我有该模型的实例,我也必须通过静态方法:/
  • 尝试保留非静态方法,并将其从 getUrl 重命名为 buildUlr
【解决方案2】:

你可以添加

@Transient

方法的注释,它的工作原理!

【讨论】:

  • javax.persistence.Transient
  • 谢谢,救了我的命!
【解决方案3】:

我今天也遇到了同样的问题。我尝试应用上面建议的相同逻辑(对问题方法使用静态函数)但无济于事。我重新开始播放,清理,重新编译,问题就消失了。

这是我使用的播放命令。

exit
play
clean
run

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-25
    • 1970-01-01
    • 2022-10-06
    • 2023-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-10
    相关资源
    最近更新 更多