Класс Grails GORM с аннотацией @ GrailsCompileStati c отображается в таблице закрытия отображения stati c, версия, autoTimestamp в качестве неразрешенного символа - PullRequest
1 голос
/ 07 февраля 2020

Ссылки:

  1. https://youtrack.jetbrains.com/issue/IDEA-206196
  2. https://youtrack.jetbrains.com/issue/IDEA-207415?_ga=2.103698112.1724644326.1581075934-247190714.1566820331
package de.equeo.requestcode

import grails.compiler.GrailsCompileStatic

@GrailsCompileStatic
class Feature {

    String name

    static mapping = {
        table 'rq_feature'
        version false
        autoTimestamp false
    }

}

Это приводит к ошибке только в IDE (отлично работает в grails run-app или во время компиляции):

enter image description here

Ответы [ 2 ]

5 голосов
/ 07 февраля 2020

Вместо этого вы можете использовать встроенный тип safe dsl, добавленный в GORM 6.1

import static grails.gorm.hibernate.mapping.MappingBuilder.*

class Book {
    String title

    static final mapping = orm {
0 голосов
/ 07 февраля 2020

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

Первый обходной путь

Я использовал свою собственную логику c этого из https://github.com/wizpanda/kernel/blob/v2.1.6/src/main/groovy/com/wizpanda/logging/KernelLogging.groovy#L63 и создал метод *1003* stati c, который использует @DelegatesTo аннотация для обмана IDE 101

import grails.compiler.GrailsCompileStatic
import org.grails.orm.hibernate.cfg.HibernateMappingBuilder

@GrailsCompileStatic
class Feature {

    String name

    /**
     * This is to solve the IntelliJ Idea problem as defined
     * @param delegate
     * @param closure
     * @return
     */
    static applyFooMapping(Object delegate, @DelegatesTo(HibernateMappingBuilder) Closure closure) {
        closure.delegate = delegate
        closure.resolveStrategy = Closure.DELEGATE_ONLY
        closure.call()
    }

    static mapping = {
        applyFooMapping(delegate) {
            table 'rq_feature'
            version false
            autoTimestamp false
        }
    }

}

Приветствия!

Второй обходной путь (улучшение до 1-го)

Чтобы решить эту проблему для нескольких доменов, создайте класс groovy в src/main/groovy/some/package/AbstractFooDomain:

@GrailsCompileStatic
abstract class AbstractFooDomain {

    /**
     * This is to solve the IntelliJ Idea problem as defined
     * @param delegate
     * @param closure
     * @return
     */
    static applyFooMapping(Object delegate, @DelegatesTo(HibernateMappingBuilder) Closure closure) {
        closure.delegate = delegate
        closure.resolveStrategy = Closure.DELEGATE_ONLY
        closure.call()
    }
}

А теперь используйте его в классах своего домена:


@GrailsCompileStatic
class Feature extends AbstractFooDomain {

    String name

    static mapping = {
        applyFooMapping(delegate) {
            table 'rq_feature'
            version false
            autoTimestamp false
        }
    }

}

enter image description here

Еще раз ура !

Третий обходной путь (рекомендуется)

Поскольку @ JamesKleeh ответил, вам даже не нужно определять вышеупомянутый метод для DSL безопасного типа:

package com.wizpanda.hooman

import grails.compiler.GrailsCompileStatic

import static grails.gorm.hibernate.mapping.MappingBuilder.orm

@GrailsCompileStatic
class User {

    String firstName
    String lastName
    String bio
    String email

    static final mapping = orm {
        table "rq_feature"
        version false
        autoTimestamp false
        property("bio", [type: "text"])
        property("firstName", {
            column([name: "fn"])
        })
    }

}

enter image description here

...