Повторяющееся имя/подпись метода для ошибки компиляции метода при использовании @I18nFields

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

Версия Grails: 2.3.7 (я пытался использовать версию 2.3.4, но получил ту же проблему и обновил ее)

Для этого использовалась документация Grails: http://grails.org/plugin/i18n-fields.

Мой класс домена выглядит так

package com.sampleapp.domain

import i18nfields.I18nFields;

@I18nFields
class Products {

 def name

 static constraints = {}

 static i18nFields = ['name']
}

В моем Config.groovy есть строка ниже, чтобы указать локаль

// internationalization support - testing 
i18nFields {
    locales = ['en','es']
}

Определение подключаемого модуля BuildConfig.groovy

plugins {
    // plugins for the build system only
    build ":tomcat:7.0.47"

    // plugins for the compile step
    compile ":scaffolding:2.0.1"
    compile ':cache:1.1.1'

    // plugins needed at runtime but not for compilation
    runtime  ":hibernate:3.6.10.6" // or":hibernate4:4.1.11"//
    runtime ":database-migration:1.3.8"
    runtime ":jquery:1.10.2.2"
//  compile  ":jquery-ui:1.10.2.2"
    runtime ":resources:1.2.1"
    // Uncomment these (or add new ones) to enable additional resources capabilities
    runtime ":zipped-resources:1.0.1"
    runtime ":cached-resources:1.1"
    //runtime ":yui-minify-resources:0.1.5"

    compile ':platform-core:1.0.RC6'
    compile ":cache-headers:1.1.5"
    runtime ':spring-security-core:2.0-RC2'
    // internationalization
    compile ":i18n-fields:0.8.1"
}

Ошибка компиляции

grails-workspace\Test\grails-app\domain\com\sampleapp\domain\Products.groovy: -1: Repetitive method name/signature for method 'void setName_es(java.lang.String)' in class 'com.sampleapp.domain.Products'.
 @ line -1, column -1.

Ошибка дважды повторяется для свойства name для локалей en и es.

Нет ошибки, если я удалю аннотацию i18nFields, а пример приложения до этого работал нормально. Я проверил сообщение GGTS с повторяющимся именем/подписью метода в контроллерах для аналогичной ошибки в контроллере. Я также проверил, чтобы убедиться, что версия groovy верна, и в моем случае это 2.1.

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


person user3405231    schedule 11.03.2014    source источник
comment
У меня возникла та же проблема в grails 2.3.4 с jdk 1.8, возврат назад решил эту проблему для меня.   -  person Sachin Anand    schedule 02.07.2014


Ответы (3)


Вероятно, это как-то связано с новым механизмом Binding в Grails 2.3. Может быть, геттеры и сеттеры теперь установлены автоматически?

Когда я комментирую эти две строки в ClassI18nalizator.groovy, ошибка исчезает. Кажется, это работает, по крайней мере, частично. Я могу использовать поля в строительных лесах. Это не настоящее решение, но, возможно, подсказка для тех, кто разбирается в Grails лучше меня.

    private def getSetterMethod(field) {
            // setter should return void. that's why the return statement.
            //return new AstBuilder().buildFromString("i18nfields.I18nFieldsHelper.setValue(this, '${field}', value); return;").pop();
    }

    private def getGetterMethod(field) {
            //new AstBuilder().buildFromString("i18nfields.I18nFieldsHelper.getValueOrDefault(this, '${field[0..-7]}', '${field[-5..-1]}')").pop();
    }

После этого я столкнулся со второй проблемой:

Нет подписи метода: groovy.util.ConfigObject.contain() применима для типов аргументов: (java.lang.String) значения: [en_US]

Я решил это, добавив redisLocale в Config.groovy.

i18nFields { 
    locales = ['de_DE', 'en_US']
    defaultLocale = "en_US"
    redisLocales = ['de_DE', 'en_US']
}
person Muhammad Max Krüper    schedule 23.03.2014
comment
Благодарю вас. Ваше решение сработало. для второй проблемы с методом без подписи: groovy.util.ConfigObject.contain() я получил то же самое при загрузке gsp. Я передал языковой параметр вместе с именем поля, чтобы разрешить то же самое. - person user3405231; 26.03.2014
comment
Мне также пришлось установить defaultLocale в Config.groovy: i18nFields { locales = ['de_DE', 'en_US'] defaultLocale = en_US } - person Muhammad Max Krüper; 04.04.2014

Эта проблема возникает, когда вы пытаетесь использовать Java > v7 с любой версией Grails ‹ 2.3.7. Либо понизьте версию JVM, либо обновите Grails.

person TekOps    schedule 30.05.2016
comment
Этот. Пытался запустить grails 2.3.5 на java 8 sdk, и эта ошибка появлялась везде. Я установил последнюю версию java 7 sdk, которую смог найти, и она работала как шарм. Спасибо. - person Hernán Erasmo; 14.09.2016

Спасибо за попытку (и за то, что сообщили мне через github;))

Проблема была известна, но еще не решена. Предыдущий ответ (комментирование методов) не является точным, хотя он следует правильному пути, потому что проблема возникает из-за новых изменений в Grails, которые вызовут конфликт в геттерах и сеттерах.

Решение, которое я нашел, состоит в том, чтобы отдельно создать свойство и геттер/сеттер, и, похоже, оно работает.

Я выпускаю новую версию, как только ее можно будет полностью протестировать в проекте, но код уже доступен в https://github.com/jorgeuriarte/grails-i18n-fields-plugin/tree/redis_integration (версия 0.9-redis-SNAPSHOT), если вы хотите его использовать.

person Jorge Uriarte    schedule 31.03.2014