2

我正在使用 Nomin 进行映射任务。从Nomin的文档中获取,它应该能够在自动映射已激活的情况下自行映射具有相同名称的字段。激活它时,会导致无限循环异常。

我有以下内容:

mappingFor a: CoinsOnMarketPlace, b: Coin
// automap() // when deactivated it works fine, when activated infinite loop

a.coin.name         =       b.name
a.coin.rank         =       b.rank
a.priceUSD          =       b.priceUSD  // Could be automapped
a.priceBTC          =       b.priceBTC  // Could be automapped

... 

例外:

org.nomin.core.NominException: ./net/hemisoft/ccm/repository/coinmarketcap2coin.groovy: Recursive mapping rule a = b causes infinite loop!
4

1 回答 1

2

关于您的用例值得添加的一件事 -因为您在映射规则中使用了类,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.metaClassresolved这样的映射。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 类进行了测试,效果很好。希望能帮助到你。

于 2018-01-12T23:43:30.003 回答