簡體   English   中英

使用帶有DozerMaper的parallelStream的對象列表映射給出了StackOverflowError

[英]Mapping list of objects using parallelStream with DozerMaper gives StackOverflowError

我有以下實用程序方法將域對象的列表映射到DTO,從而生成映射對象的列表。

   public static <Z, T> List<T> mapList(Mapper mapper, List<Z> source, Class<T> type) {
        List<T> result = new ArrayList<T>();
        int listSize = source.size();
        for (int i=0;i<listSize;i++) {
            result.add(mapper.map(source.get(i), type));
        }
        return result;
    }

作為映射器,我傳遞了DozerBeanMaper的單例實例(由Spring管理的實例)。 列表源是休眠查詢的結果。 上面的代碼工作正常。

現在,我已更改代碼以使用Stream API(我想並行化映射):

 public static <Z, T> List<T> mapList(Mapper mapper, List<Z> source, Class<T> type) {
     return source.parallelStream()
             .map((s) -> mapper.map(s, type))
             .collect(Collectors.toList());
}

並獲得以下內容:

Caused by: java.lang.NullPointerException
    at org.hibernate.engine.internal.StatefulPersistenceContext.getLoadedCollectionOwnerOrNull(StatefulPersistenceContext.java:755)
    at org.hibernate.event.spi.AbstractCollectionEvent.getLoadedOwnerOrNull(AbstractCollectionEvent.java:75)
    at org.hibernate.event.spi.InitializeCollectionEvent.<init>(InitializeCollectionEvent.java:36)
    at org.hibernate.internal.SessionImpl.initializeCollection(SessionImpl.java:1895)
    at org.hibernate.collection.internal.AbstractPersistentCollection$4.doWork(AbstractPersistentCollection.java:558)
    at org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:260)
    at org.hibernate.collection.internal.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:554)
    at org.hibernate.collection.internal.AbstractPersistentCollection.read(AbstractPersistentCollection.java:142)
    at org.hibernate.collection.internal.PersistentSet.iterator(PersistentSet.java:180)
    at org.dozer.MappingProcessor.addOrUpdateToList(MappingProcessor.java:766)
    at org.dozer.MappingProcessor.addOrUpdateToList(MappingProcessor.java:850)
    at org.dozer.MappingProcessor.mapListToList(MappingProcessor.java:686)
    at org.dozer.MappingProcessor.mapCollection(MappingProcessor.java:553)
    at org.dozer.MappingProcessor.mapOrRecurseObject(MappingProcessor.java:434)
    at org.dozer.MappingProcessor.mapFromFieldMap(MappingProcessor.java:342)
    at org.dozer.MappingProcessor.mapField(MappingProcessor.java:288)
    at org.dozer.MappingProcessor.map(MappingProcessor.java:248)
    at org.dozer.MappingProcessor.map(MappingProcessor.java:197)
    at org.dozer.MappingProcessor.mapCustomObject(MappingProcessor.java:495)
    at org.dozer.MappingProcessor.mapOrRecurseObject(MappingProcessor.java:446)
    at org.dozer.MappingProcessor.mapFromFieldMap(MappingProcessor.java:342)
    at org.dozer.MappingProcessor.mapField(MappingProcessor.java:288)
    at org.dozer.MappingProcessor.map(MappingProcessor.java:248)
    at org.dozer.MappingProcessor.map(MappingProcessor.java:197)
    at org.dozer.MappingProcessor.map(MappingProcessor.java:187)
    at org.dozer.MappingProcessor.map(MappingProcessor.java:124)
    at org.dozer.MappingProcessor.map(MappingProcessor.java:119)
    at org.dozer.DozerBeanMapper.map(DozerBeanMapper.java:120)
    at 
org.mycompany.myproject.utils.BeanMapperUtil.lambda$0(BeanMapperUtil.java:30)

執行重復自身,最后變成StackOverFlowErorr。

如果我使用source.stream()而不是source.parallelStream() ,則不會出現任何錯誤。

有任何想法嗎?

問題在於該方法是在Spring @Transactional注釋的方法中與延遲加載一起調用的。 見例如這個職位] 1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM