关于您的用例值得添加的一件事 -因为您在映射规则中使用了groovy类,Recursive mapping rule a = b causes infinite loop!
所以抛出了这个异常。Nomin 用途和重要事项:ReflectionIntrospector
它使用通过 Java 反射机制调用的访问器方法执行获取/设置属性。ReflectionIntrospector 使用提供的 NamingPolicy 实例来确定访问器方法。默认情况下使用 JbNamingPolicy,此实现符合 JavaBeans 约定。其名为 ReflectionInstanceCreator 的 InstanceCreator 使用 Class.newInstance() 实例化对象。
资料来源: http: //nomin.sourceforge.net/introspectors.html
一个简单的 Groovy 类,例如:
class Entity {
String name
String somethingElse
}
被编译为实现GroovyObject
提供以下方法的 Java 类:
public interface GroovyObject {
Object invokeMethod(String var1, Object var2);
Object getProperty(String var1);
void setProperty(String var1, Object var2);
MetaClass getMetaClass();
void setMetaClass(MetaClass var1);
}
在这种情况下ReflectionInstanceCreator
,结合automap()
解析以下映射:
a.property = b.property
和
a = b
a = b
我想映射来自getter方法,MetaClass getMetaClass()
因为没有像a.metaClass = b.metaClass
resolved这样的映射。a.property = b.property
由于Object getProperty(String var1)
方法而得到解决。
解决方案
ExplodingIntrospector
可以通过为您的映射脚本明确指定以下内容来解决此问题:
它通过 Java 反射机制立即使用类字段执行获取/设置属性,并且在域对象不为其属性提供访问器的情况下可能很有用。提供的实例创建者是 ReflectionInstanceCreator。
资料来源: http: //nomin.sourceforge.net/introspectors.html
您所要做的就是添加
introspector exploding
mappingFor a: ..., b: ...
标题正下方。例如:
import mypackage.Entity
import mypackage.EntityDto
mappingFor a: Entity, b: EntityDto
introspector exploding
automap()
a.test2 = b.test1
用两个 Groovy 类进行了测试,效果很好。希望能帮助到你。