Grails 3" MissingMethodException"域类save()方法(和其他方法)上的错误

时间:2015-09-18 19:00:46

标签: grails groovy gorm grails-domain-class grails-3.0

域类:

package com.myapp.gorm.log

import com.myapp.gorm.security.User
import com.myapp.gorm.system.TransactionJournal

class LogJournal {

    static constraints = {
      message nullable: false
      category nullable: false
      user1 nullable: false
    }

    static mapping = {
      dateCreated column: "ts"
      lastUpdated column: "ts_update"
    }

LogMessage        message
LogCategory       category
User               user1
User               user2
String             value
TransactionJournal transaction

Date dateCreated
Date lastUpdated


boolean equals(o) {
    if (this.is(o)) return true
    if (getClass() != o.class) return false

    LogJournal that = (LogJournal) o

    if (category != that.category) return false
    if (dateCreated != that.dateCreated) return false
    if (id != that.id) return false
    if (lastUpdated != that.lastUpdated) return false
    if (message != that.message) return false
    if (transaction != that.transaction) return false
    if (user1 != that.user1) return false
    if (user2 != that.user2) return false
    if (value != that.value) return false

    return true
}

int hashCode() {
    int result
    result = message.hashCode()
    result = 31 * result + category.hashCode()
    result = 31 * result + user1.hashCode()
    result = 31 * result + (user2 != null ? user2.hashCode() : 0)
    result = 31 * result + (value != null ? value.hashCode() : 0)
    result = 31 * result + (transaction != null ? transaction.hashCode() : 0)
    result = 31 * result + dateCreated.hashCode()
    result = 31 * result + (lastUpdated != null ? lastUpdated.hashCode() : 0)
    result = 31 * result + id.hashCode()
    return result
  }

}

错误:

groovy.lang.MissingMethodException: No signature of method:     c       com.domainboost.gorm.log.LogJournal.save() is applicable for argument types: ()     values: []
Possible solutions: save(), save(boolean), save(java.util.Map), wait(), last(), any()

或者其他域类正常工作,只有这个有问题。我看到grails无法在此类实例上执行任何方法。

没有任何验证错误。

我在这里调用这个域类(它的logback:appender):

class SystemAppender extends AppenderBase<ILoggingEvent>  {

   static appInitialized = false

  @Override
  public void append(ILoggingEvent event) {
    if (appInitialized) {
        LogMessage logMessage = LogMessage.findByMessage(event.getMessage())
        if (!logMessage) {
            logMessage = new LogMessage()
            logMessage.message = event.getMessage()
            logMessage.save(flash: true)
        }
        String categoryStr = event.argumentArray[0]
        LogCategory logCategory = LogCategory.findByCategory(categoryStr)
        if (!logCategory) {
            logCategory = new LogCategory()
            logCategory.category = categoryStr
            logCategory.save(flash: true)
        }
        User user1 = null
        if (event.argumentArray.contains(1)) {
            user1 = event.argumentArray[1]
        }
        User user2 = null
        if (event.argumentArray.contains(2)) {
            user1 = event.argumentArray[2]
        }
        TransactionJournal tj = null
        if (event.argumentArray.contains(3)) {
            tj = event.argumentArray[3]
        }
        LogJournal logJournal = new LogJournal()
        logJournal.category = logCategory
        logJournal.message = logMessage
        logJournal.user1 = user1
        logJournal.user2 = user2
        logJournal.transaction = tj
        LogJournal.save()

      }
  }
}

我如何在grails控制台中测试它

import org.slf4j.Logger
import org.slf4j.LoggerFactory

def Logger logger = LoggerFactory.getLogger("sysLog")
logger.info("message", "category")

错误已开启      LogJournal.save()

以错误结束的代码在GormStaticApi.groovy

@CompileStatic(TypeCheckingMode.SKIP)
    def methodMissing(String methodName, Object args) {
    FinderMethod method = gormDynamicFinders.find { FinderMethod f ->   f.isMethodMatch(methodName) }
    if (!method) {
        throw new MissingMethodException(methodName, persistentClass, args)
    }

所以看来这种方法&#34;保存&#34;找不到.. WTF?

1 个答案:

答案 0 :(得分:3)

LogJournal.save()

正在寻找类上的静态方法。您希望小写首字母在实例变量上调用save:

logJournal.save()