ConversionNotSupportedException具有类似命名的类

时间:2011-05-09 12:44:05

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

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

我有两个班,都叫'公司'。

  • 一个放在grails-app / domain / my.classes.domain.Company
  • 另一个是在src / groovy / my.clazz.Company

最后一个有@Validateable注释,Config.groovy包含grails.validateable.packages = ['my.clazz']

我还有一个帐户类,在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)

运行此应用时,会显示以下错误:

Caused by: org.springframework.beans.ConversionNotSupportedException: Cannot convert value of type [my.clazz.Company] to required type [my.classes.domain.Company] for property 'company': no matching editors or conversion strategy found
    ... 33 more
Caused by: java.lang.IllegalStateException:
Cannot convert value of type [my.clazz.Company] to required type [my.classes.domain.Company] for property 'company': no matching editors or conversion strategy found

这是一个非常奇怪的例外,因为一切似乎都很好。 一些测试证明了以下'提示': 当我修改config.groovy以明确命名类时(即使用grails.validateable.classes = ['my.classes.domain.Company']),不会发生此错误, 当我将Account的公司属性修改为不同的名称(并相应地修改引导程序)时,不会发生此错误,即:

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包添加到validateable包
  7. 在引导程序中,使用新帐户(公司:公司)
  8. 创建一个新帐户

2 个答案:

答案 0 :(得分:0)

除了代码中的各种拼写错误导致问题难以确定之外,问题似乎是您尝试使用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)

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

答案 1 :(得分:0)

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

您可以进行简单的检查,以确定引导程序中company的类型是什么:

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