【问题标题】:Grails: can't have an abstract method in a non-abstract class ERRORGrails:在非抽象类中不能有抽象方法错误
【发布时间】:2017-04-13 13:38:33
【问题描述】:

Grails 版本:2.3.4

Java 版本:1.7.0_79

我在一个独立的应用程序中开发了一个到 AWS S3 的上传器,该应用程序是最新版本的 Grails 中的。它正在工作,我现在一直在尝试将它实现到我较旧的 Grails 主应用程序中。

关于这行代码,我在服务器启动时遇到错误:

import grails.validation.Validateable
import org.springframework.web.multipart.MultipartFile

abstract class FeaturedImageCommand implements Validateable {
 MultipartFile featuredImageFile
 Long id
 Long eventId
 Integer version

static constraints = {
    id nullable: false
    version nullable: false
    eventId nullable:false

    featuredImageFile  validator: { val, obj ->
        if ( val == null ) {
            return false
        }
        if ( val.empty ) {
            return false
        }

        ['jpeg', 'jpg', 'png'].any { extension -> // <1>
             val.originalFilename?.toLowerCase()?.endsWith(extension)
        }
    }
}

}

错误显示:

在非抽象类中不能有抽象方法。必须将“FeaturedImageCommand”类声明为抽象类,或者必须实现“java.lang.Class.annotationType()”方法。

我假设我的 java 和 grails 版本导致了这个问题,但我真的希望有办法解决这个问题而不更新它们?

谢谢。

【问题讨论】:

  • 你有什么不明白的!? Can't have an abstract method in a non-anstract class.
  • 我不明白这个解决方案在我的项目中与旧版本相比如何工作

标签: java validation class grails abstract


【解决方案1】:

Validateable是注解类型,annotationType()方法来自Annotation接口,所有@interface类型都隐式继承。

(您的代码...奇怪。为什么要将注释“实现”为类?我的理解是您将无法使用定义为@interface 的子类的类作为注释...)

  • 如果您尝试使用类型层次结构声明注释,Java 语法不允许这样做。 (JLS 明确表示。)

  • 如果您(真的)想要一个 implements@interface 的类,那么您将需要实现该方法。 (而且我不知道你是如何摆脱以前不这样做的。Validateable 在我可以在 Grepcode 网站上看到的所有版本中都是 @interface。)

【讨论】:

  • 嘿,谢谢你提供的信息。查看我更新的帖子,解释使用验证器...我应该一开始就包含它。
  • 嗯……我明白了。这是 Grails 代码而不是 Java 代码。好吧,我想问题出在 Grails 方面。但是,这仍然不能解释为什么该代码实现了@interface?
  • 如果你用 Java 写了这个,如果一个类实现了@interface,你需要(最终)实现那个方法。所以我认为不报错是Groovy编译器的一个bug,而你发现的是编译器的bug已经修复。您应该做的是修复代码中的(明显)错误,而不是寻找允许它的 Groovy / Grails 实现。
猜你喜欢
  • 1970-01-01
  • 2012-09-21
  • 2012-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多