ГОРМ для зимней спячки вне Грааля - PullRequest
0 голосов
/ 16 апреля 2019

Начиная с github repo , который демонстрирует, как использовать GORM вне Grails, я пытаюсь использовать динамические искатели, чтобы можно было искать конкретный объект домена по одному из его свойств. В этом примере у нас есть объект person в groovy как таковой:

package domain

import grails.gorm.annotation.Entity
import org.grails.datastore.gorm.GormEntity

@Entity
class Person implements GormEntity<Person> {

    String firstName
    String lastName

    static mapping = {
        firstName blank: false
        lastName blank: false
    }
}

Теперь допустим, я хочу найти человека по фамилии. Я должен быть в состоянии использовать метод лица с расширенными возможностями GORM findByLastName. Я могу скомпилировать код, который пытается это сделать, но когда я вызываю его во время выполнения, метод не найден.

Я добавил тестовый метод в PersonSpec.groovy, который выглядит следующим образом:

   @Rollback
   def "person can be found by last name"() {
      when:
      def p = new Person(firstName: 'Scott', lastName: 'Ericsson')
      p.save(flush: true)

      def foundPerson = p.findByLastName('Ericsson')

      then:
      foundPerson.firstName == 'Scott'
   }

Я получаю эту ошибку при запуске теста:

domain.PersonSpec > person can be found by last name FAILED
    groovy.lang.MissingMethodException at PersonSpec.groovy:32

Тестовый метод, описанный выше, успешно создает и сохраняет личную запись, поэтому некоторые аспекты функциональности GORM работают. Но функциональность динамического поиска не применяется должным образом во время выполнения, хотя компилятор считает, что все выглядит хорошо.

Весь мой build.gradle таков:

apply plugin: 'groovy'

repositories {
    jcenter()
}

dependencies {
   compile "org.hibernate:hibernate-validator:5.3.4.Final"
   compile "org.grails:grails-datastore-gorm-hibernate5:7.0.0.RELEASE"
   runtime "com.h2database:h2:1.4.192"
   runtime "org.apache.tomcat:tomcat-jdbc:8.5.0"
   runtime "org.apache.tomcat.embed:tomcat-embed-logging-log4j:8.5.0"
   runtime "org.slf4j:slf4j-api:1.7.10"

   testCompile 'org.spockframework:spock-core:1.1-groovy-2.4'
}

Кто-нибудь знает, чего мне не хватает?

1 Ответ

2 голосов
/ 16 апреля 2019

Так что я боролся с этим пару дней, и разве вы не знаете, как только я отправлю вопрос, я пойму это почти мгновенно. Все просто - мне нужно статически использовать метод findByLastName для объекта Person вместо экземпляра person. Код, который работает в PersonSpec, теперь выглядит следующим образом:

   @Rollback
   def "person can be found by last name"() {
      when:
      def p = new Person(firstName: 'Scott', lastName: 'Ericsson')
      p.save(flush: true)

      def foundPerson = Person.findByLastName('Ericsson')

      then:
      foundPerson.firstName == 'Scott'
   }
...