bindData () меняет идентификатор домена при использовании наследования gorm - PullRequest
0 голосов
/ 13 октября 2018

У меня есть класс домена grails, который расширяет базовый класс в папке src, например:

// src/main/groovy/demo/MyBaseClass.groovy
package demo

import grails.gorm.dirty.checking.DirtyCheck

@DirtyCheck
class MyBaseClass {
    String name
}
// grails-app/domain/demo/MyDomain.groovy
package demo

class MyDomain extends MyBaseClass {
    Date birthDate
}

Однако при использовании bindData в контроллере, id из MyDomain может быть изменено параметрами запроса.Это можно проверить с помощью этого неудачного теста:

// src/test/groovy/demo/IdDataBindingSpec.groovy
package demo

import grails.web.databinding.DataBinder
import org.grails.testing.GrailsUnitTest
import spock.lang.Specification

class IdDataBindingSpec extends Specification 
        implements GrailsUnitTest, DataBinder {

    void "Bind id to MyDomain is not possible"() {
        given: "A new instance"
            MyDomain myDomain = new MyDomain()
        and: "Request params"
            Map params = [id:5, name:'test']

        when: "Binding data"
            bindData(myDomain, params)

        then: "id is not updated"
            !myDomain.id
        and: "Other params are updated"
            myDomain.name == 'test'
    }
}

Любой нормальный домен пройдет вышеуказанный тест, но домен, расширяющий базовый класс с src, не пройдет.Как я могу исправить это поведение?

Редактировать: я использую Grails 3.3.8 с gorm 6.1

1 Ответ

0 голосов
/ 13 октября 2018

При использовании наследования gorm базовые классы в src должны быть объявлены как абстрактные, например:

// src/main/groovy/demo/MyBaseClass.groovy
package demo

import grails.gorm.dirty.checking.DirtyCheck

@DirtyCheck
abstract class MyBaseClass {
    String name
}
...