Java - Orika 1.4.5 - OutOfMemoryException:PermGen Space

时间:2016-02-08 15:59:48

标签: java out-of-memory permgen orika mappers

我遇到了Orika 1.4.5和PermGen Space的问题。

确实,我这样使用ConfigurableMapper:

 public class SoapSearchPrdvFreeSlotsMapper extends ConfigurableMapper {
@Override
public void configure(MapperFactory mapperFactory) {
    mapperFactory.registerClassMap(mapperFactory.classMap(PrdvFreeSlot.class, PrdvWsListerDispoTelV2Filter.class)
                .field("typeRdv", "wsldtTypeRdv")
                .field("motifId", "wsldtMotifId")
                .byDefault().toClassMap());
    }
    mapperFactory.registerClassMap(mapperFactory.classMap(PrdvFreeSlot.class, PrdvWsListerDispoTelV2.class)
                .field("typeRdv", "wsldtTypeRdv")
                .field("motifId", "wsldtMotifId")
                .field("quantum", "wsldtActiviteIdActivQuantum")
                .field("activiteJours", "wsldtActiviteIdActivJours")
                .field("activiteHeureFerme", "wsldtActiviteIdActivHeureFerme")
                .field("activiteHeureOuvert", "wsldtActiviteIdActivHeureOuvert")
                .field("startDate", "disDate")
                .field("disCapacity", "disCapacite")
                .field("disReserve", "disReserve")
                .field("reserveCC", "wsldtReserveCC")
                .byDefault().toClassMap());
    }
}

@Override
public void configureFactoryBuilder(DefaultMapperFactory.Builder builder) {
    builder.build().getConverterFactory().registerConverter(new DateXmlDateConverter());
}

}

但是每当我调用这个mapper时,我都会自动生成存储在PermGen中的类映射器。

我尝试使用" existsRegisteredMapper" MapperFactory阻止类映射器自动生成,但它不起作用:

public static <T, U> boolean existsRegisteredMapperInFactory(MapperFactory mapperFactory, Class<T> classSrc, Class<U> classDest) {
    return mapperFactory.existsRegisteredMapper(TypeFactory.valueOf(classSrc), TypeFactory.valueOf(classDest), true);
}

和修改后的第一个代码块:

if (!existsRegisteredMapperInFactory(mapperFactory, PrdvWsListerDispoTelV2Filter.class, PrdvFreeSlot.class)) {
        mapperFactory.registerClassMap(mapperFactory.classMap(PrdvFreeSlot.class, PrdvWsListerDispoTelV2Filter.class)
                .field("typeRdv", "wsldtTypeRdv")
                .field("motifId", "wsldtMotifId")
                .byDefault().toClassMap());
    }

请问,有没有办法阻止类映射器自动生成而不重写我的所有映射器?

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

请确保映射器是单例。你不需要每次都实例化它。

您无需验证映射器是否已注册。它只会生成一次(每个MapperFactory实例)。

所以只需确保SoapSearchPrdvFreeSlotsMapper是一个单例(只有一个实例,ConfigurableMapper是线程安全的)