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
}
Однако это обходные пути. Я действительно заинтересован в том, ПОЧЕМУ это происходит. Кто-нибудь понял?
Чтобы быть в безопасности, я сделал следующее, чтобы создать эту проблему:
- создать класс домена: my.classes.domain.Company
- создать класс домена: my.classes.domain.Account
- изменить класс домена, как указано выше
- создать классный класс: my.clazz.Company
- присвойте этому классному классу аннотацию Validatable.
- добавьте пакет my.clazz в проверяемые пакеты
- в начальной загрузке создайте новую учетную запись с новой учетной записью (компания: компания)
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()