Служба Grails не сохраняет объект домена при запуске очереди сообщений - PullRequest
1 голос
/ 18 февраля 2011

У меня есть приложение Grails, у которого есть служба, которая создает отчеты. Отчет определяется как:

class Report {
    Date createDate
    String reportType
    List contents

    static constraints = {
    }
}

Служба создает отчет и заполняет contents в виде списка, который возвращается createCriteria.

Моя проблема в том, что моя служба утверждает, что сохраняет отчет, никаких ошибок не появляется, ведение журнала говорит, что все это есть, но когда я иду на вызов show из контроллера в этом отчете, он говорит, что содержимое равно нулю.

Еще один важный момент: моя служба вызывается из очереди сообщений ActiveMQ. Сообщение от моего контроллера отчетов.

Контроллер:

class ReportController {

    def scaffold = Report

    def show = {
        def rep = Report.get(params.id)

        log.info("Report is " + (rep? "not null" : "null")) //says report is not null
        log.info("Report content is " + (rep.contents? "not null" : "null")) //always says report.contents is null.

        redirect(action: rep.reportType, model: [results: rep.contents, resultsTotal: rep.contents.size()])
    }
}

Мой сервис, который создает отчет:

class ReportService {

static transactional = false
static expose = ['jms']
static destination = "Report"

void onMessage(msg) 
{
    this."$msg.reportType"(msg)
}

void totalQuery(msg) 
{       
   def results = Result.createCriteria().list {
       //This returns exactly what i need.
   }

   Report.withTransaction() {
       def rep = new Report(createDate: new Date(), reportType: "totalQuery", contents: results)

       log.info("Validation results: ${rep.validate()}")

       if( !rep.save(flush: true) ) {
           rep.errors.each {
                log.error(it)
           }
        }
   }
}

Есть ли что-то очевидное, что мне здесь не хватает? Я думаю, что поскольку все мои модульные тесты работают, контекст гибернации не передается через очередь сообщений. Но это породило бы исключения, не так ли? Я уже несколько дней бьюсь над этой проблемой, поэтому точка в правильном направлении была бы отличной.

Спасибо

1 Ответ

3 голосов
/ 18 февраля 2011

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

Если выЕсли вы хотите обратиться к коллекции результатов, вам понадобится hasMany:

class Report {
   Date createDate
   String reportType

   static hasMany = [contents: Result]
}

. Если вам нужен упорядоченный список, добавьте также поле List с тем же именем и вместосоздав Set (по умолчанию), это будет List:

class Report {
   Date createDate
   String reportType

   List contents
   static hasMany = [contents: Result]
}

Ваши модульные тесты работают, потому что вы не обращаетесь к базе данных или не используете Hibernate.Я думаю, что лучше всегда проверять интеграцию классов домена, чтобы вы хотя бы использовали базу данных в памяти и высмеивали классы домена при тестировании контроллеров, служб и т. Д.

...