2015-09-18 7 views
0

Домен Класс:Grails 3 "MissingMethodException" ошибка на классе домена сохранить() метод (и другие методы)

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) 
    } 

Так что кажется, что метод «сохранить» не найден .. WTF?

+0

где вы вызываете 'save' в этом коде? Я не вижу его –

+0

Я обновил и добавил код –

+0

несвязанный - 'nullable: false' является значением по умолчанию в классах домена, поэтому вы можете удалить весь блок' ограничений ' –

ответ

3

Этот

LogJournal.save() 

ищет статический метод на классе. Вы хотите, чтобы начальная буква в нижнем регистре вызывала сохранение в переменной экземпляра:

logJournal.save() 
+0

Глупые ошибки .... Благодаря –