ConversionNotSupportedException с одноименными классами

ОБНОВЛЕНО: сделаны некоторые неверные предположения о классах и т. Д. Теперь, когда у меня есть "демонстрационный" проект, происходит следующее:

У меня есть два класса, оба названы "Компания".

  • Один из них находится в grails-app/domain/my.classes.domain.Company
  • другой находится в src/groovy/my.clazz.Company

Последний содержит аннотацию @Validateable, а Config.groovy содержит grails.validateable.packages = ['my.clazz']

У меня также есть класс Account в grails-app/domain/my.classes.domain.Account:

package my.classes.domain

import java.io.Serializable;

class Account implements Serializable { Company company }

Затем я использую следующий код (в bootstrap.groovy):

import my.classes.domain.Company
import my.classes.domain.Account
...
Company company = new Company
Account acccount = new Account(company: company)

При запуске этого приложения отображается следующая ошибка:

Вызывается: org.springframework.beans.ConversionNotSupportedException: невозможно преобразовать значение типа [my.clazz.Company] в требуемый тип [my.classes.domain.Company] для свойства 'company': не найдено подходящих редакторов или стратегии преобразования.... еще 33
Вызвано: java.lang.IllegalStateException:
Невозможно преобразовать значение типа [my.clazz.Company] в требуемый тип [my.classes.domain.Company] для свойства 'company': не найдено подходящих редакторов или стратегии преобразования.

Это очень странное исключение, так как все в порядке. Некоторое тестирование подтвердило следующие "подсказки": эта ошибка НЕ ​​возникает, когда я изменяю config.groovy для явного именования классов (т.е. использую grails.validateable.classes = ['my.classes.domain.Company']), эта ошибка НЕ происходит, когда я изменяю свойство компании Аккаунта, чтобы оно имело другое имя (и соответственно изменяю загрузочную версию), то есть:

class Account extends Serializable {
    Company cmp
}

Однако это обходные пути. Я действительно заинтересован в том, ПОЧЕМУ это происходит. Кто-нибудь понял?

Чтобы быть в безопасности, я сделал следующее, чтобы создать эту проблему:

  1. создать класс домена: my.classes.domain.Company
  2. создать класс домена: my.classes.domain.Account
  3. изменить класс домена, как указано выше
  4. создать классный класс: my.clazz.Company
  5. присвойте этому классному классу аннотацию Validatable.
  6. добавьте пакет my.clazz в проверяемые пакеты
  7. в начальной загрузке создайте новую учетную запись с новой учетной записью (компания: компания)

2 ответа

Помимо различных опечаток в вашем коде, которые затрудняют определение проблемы, может показаться, что проблема заключается в том, что вы пытаетесь установить свойство Account.company, которое имеет тип my.class.Company с my.class.domain. Тип компании. Ваш начальный загрузчик должен быть изменен на:

import my.class.Company
import my.class.Account

Company company = new Company
Account acccount = new Account(company: company)

Обратите внимание, правильное заявление на импорт для компании.

Согласно описанной вами ошибке, я думаю, что Grails определил неправильно: компания, которую вы переводите в Учетную запись, была определена как my.clazz.Company, а не my.classes.domain.Company.

Вы можете поставить простую проверку, чтобы точно знать, какой тип company в начальной загрузке:

import java.lang.Class;
...
println company.getClass().getName()
Другие вопросы по тегам