2015-04-30 2 views
4

Возможно ли каким-то образом создать признак с полями и ограничениями для этих полей, а затем создать классы домена, которые реализуют эту черту и собирают поля с ограничениями?Использование черт и ограничений с помощью объектов grails 3.x

У меня есть код, который по сути выглядит как:

trait Shared { 
    String sharedField 

    static constraints = { 
    sharedField nullable: true 
    } 
} 

class ImplementingClass implements Shared { 
    ... 
} 

Сохранение экземпляра ImplementingClass с нулевым sharedField затем отвергнута с нарушением ограничений.

Возможно ли это? Есть ли альтернативный синтаксис, который требуется для использования ограничений и других конструкций GORM в чертах, реализуемых объектами домена?

+1

Почему вы используете черту, чтобы добавить данные в класс ? Это не то, для чего нужны поля. Они, по сути, являются частным государством для этой цели, а не для класса внедрения. Этот аксессуар элемента «sharedField» искажается, чтобы попытаться сохранить эту приватность. – billjamesdev

+0

Я думаю, проблема в том, что статические ограничения должны быть определены в классе домена. Я не знаю, что использовать свойства для добавления свойств в домен Grails нецелесообразно. Это одна из основных функций Traits: http://www.groovy-lang.org/objectorientation.html#_properties. Напомним, что [свойства в Groovy компилируются в частные поля с общедоступными методами get/set] (http://stackoverflow.com/a/13227508/1524502). – jonnybot

+2

Очень разумно определять общие свойства, которые могут быть добавлены в несколько доменов. У меня есть свойство AccessControlledObject, которое определяет ряд общих свойств и логики для добавления поддержки ACL для объекта домена. Очень разумно и теоретически поддерживается чертами в соответствии с http://docs.groovy-lang.org/latest/html/documentation/core-traits.html#_properties. На практике, однако, попытка использования признаков в домене кажется катастрофой. Странные ошибки компиляции, причудливое поведение, все чрезвычайно сложно отследить. Вместо него остается надежное подклассов. –

ответ

0

У меня была такая же проблема, и я посмотрел исходный код Grails и сделал несколько экспериментов.

importFrom(Shared) не работает, потому что Grails ищет поле constraints через clazz.getDeclaredFields(), что приводит к пустующему массиву для признаков.

Теперь у вас есть два варианта:

1) Сделайте которым Java/Groovy класса выглядит ваш признак, но содержит только свойства и ограничения на карте

class SharedConstraints { 
    String sharedField 

    static constraints = { 
     sharedField nullable: true 
    } 
} 

Теперь вы можете использовать SharedConstraints с importFrom

2) Создайте строгий скрипт для ограничений (http://docs.grails.org/latest/guide/hibernate.html#addingConstraints). Эта функция в основном используется для классов домена Java, но также может использоваться для признаков.

Создать SharedConstraints.groovy в одном пакете:

constraints = { 
    sharedField nullable: true 
} 

Если вы используете IntelliJ с Grails 3.0 (возможно, другие версии тоже) сценарий должен быть помещен в папку ресурсов. Если поместить этот файл в папку SRC/Java, как описано в документации Grails скрипт компилируется и не будет работать intelliJ screenshot

отметить также эту ошибку https://github.com/grails/grails-core/issues/10052

Смежные вопросы