【问题标题】:ConversionNotSupportedException with similarly named classesConversionNotSupportedException 具有类似名称的类
【发布时间】:2011-05-09 12:44:05
【问题描述】:

更新:对类等做了一些错误的假设。当我有一个“演示”项目时,现在会发生以下情况:

我有两个班级,都名为“公司”。

  • 一个放在 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

导入 java.io.Serializable;

类 Account 实现 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]:找不到匹配的编辑器或转换策略 ... 33 更多 引起:java.lang.IllegalStateException: 无法将类型 [my.clazz.Company] 的值转换为属性“公司”所需的类型 [my.classes.domain.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. 创建一个 groovy 类:my.clazz.Company
  5. 为这个 groovy 类提供 Validatable 注解。
  6. 将 my.clazz 包添加到可验证的包中
  7. 在引导程序中,使用新帐户(公司:公司)创建一个新帐户

【问题讨论】:

    标签: grails grails-domain-class grails-validation


    【解决方案1】:

    除了使问题难以确定的代码中的各种拼写错误之外,问题似乎是您正在尝试使用 my.class 设置类型为 my.class.Company 的 Account.company 属性.domain.Company 类型。您的引导程序需要更改为:

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

    注意,公司的正确导入声明。

    【讨论】:

    • 修改了问题,但是,这实际上是我不想要的:我想在我的引导程序中使用 my.classes.domain.* 东西......
    • 那么您需要明确哪些公司帐户引用。帐户需要 my.class.Company。您需要修改帐户以支持此功能。
    • 我想更大的问题是你为什么要这样做?为什么要有非域的可持久类?
    • 天哪,我真的应该三重检查:(
    【解决方案2】:

    根据您描述的错误,我认为 Grails 判断错误:您转入 Account 的公司被确定为 my.clazz.Company,而不是 my.classes.domain.Company。

    您可以通过简单的检查来确定引导程序中company 的类型:

    import java.lang.Class;
    ...
    println company.getClass().getName()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-10
      • 2012-01-27
      • 2019-05-29
      • 2013-11-29
      • 2011-11-20
      • 1970-01-01
      • 2015-07-23
      相关资源
      最近更新 更多