繁体   English   中英

@service Spring bean方法上的current.ExecutionException

[英]concurrent.ExecutionException on @service spring bean method

我今年春天有@Service bean:

@Service
public class ParMngImpl implements ParMng {

    @Autowired
    private ApplicationContext ctx;

    @Autowired
    private ParDAO pDao;

    //@Transactional(readOnly = true)
    public /*synchronized*/ Double getDbl(Storable st, String cd, Date genDt) {
        Par par = getByCD(cd);
        try {
            for (Dw d: st.getDw()) {
                if (Utl.between(genDt, d.getDt1(), d.getDt2())) {
                    if (d.getPar().equals(par)) {
                        if (d.getPar().getTp().equals("NM")) {
                            if (d.getPar().getDataTp().equals("SI")) {
                                return d.getN1();
                            } else {
                                    throw new WrongGetMethod("Wrong type");
                            }
                        } else {
                            throw new WrongGetMethod("Wrong cd");
                        }
                    }
                }
            }
            if (!isExByCd(cd)) {
                throw new WrongGetMethod("Parameter not exists");
            };
        } catch (WrongGetMethod e) {
            //TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }
...

这个bean是无状态的(没有任何实例字段),它是-单调的。 为什么当我删除“同步”字时,却得到了这个并发异常:

java.util.concurrent.ExecutionException: java.lang.NullPointerException
    at java.util.concurrent.FutureTask.report(FutureTask.java:122)
    at java.util.concurrent.FutureTask.get(FutureTask.java:192)
    at com.ric.bill.ChrgServ.chrgLsk(ChrgServ.java:179)
    at com.ric.bill.ChrgServ$$FastClassBySpringCGLIB$$67dcba28.invoke(<generated>)
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:651)
    at com.ric.bill.ChrgServ$$EnhancerBySpringCGLIB$$e923e72.chrgLsk(<generated>)
    at com.ric.bill.ChrgServThr.chrgAndSaveLsk(ChrgServThr.java:35)
    at com.ric.bill.ChrgServThr$$FastClassBySpringCGLIB$$8f447d36.invoke(<generated>)
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:720)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
    at org.springframework.aop.interceptor.AsyncExecutionInterceptor$1.call(AsyncExecutionInterceptor.java:115)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.NullPointerException
    at org.hibernate.engine.internal.StatefulPersistenceContext.getLoadedCollectionOwnerOrNull(StatefulPersistenceContext.java:780)
    at org.hibernate.event.spi.AbstractCollectionEvent.getLoadedOwnerOrNull(AbstractCollectionEvent.java:58)
    at org.hibernate.event.spi.InitializeCollectionEvent.<init>(InitializeCollectionEvent.java:22)
    at org.hibernate.internal.SessionImpl.initializeCollection(SessionImpl.java:2002)
    at org.hibernate.collection.internal.AbstractPersistentCollection$4.doWork(AbstractPersistentCollection.java:562)
    at org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:246)
    at org.hibernate.collection.internal.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:558)
    at org.hibernate.collection.internal.AbstractPersistentCollection.read(AbstractPersistentCollection.java:131)
    at org.hibernate.collection.internal.PersistentBag.iterator(PersistentBag.java:277)
    at com.ric.bill.mm.impl.ParMngImpl.getDbl(ParMngImpl.java:65)
    at com.ric.bill.mm.impl.ParMngImpl$$FastClassBySpringCGLIB$$e246ae1d.invoke(<generated>)
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)

另外,“ @ Transactional(readOnly = true)”也无法帮助我解决此问题。

我必须说,当我使用“同步”时,我的代码运行良好,但是我认为这不是一个好的解决方案。

任何建议将不胜感激。

在这行代码中,我尝试遍历集合getDw():

对于(Dw d:st.getDw()){

这是不正确的,因为此集合无法在线程中初始化。 因此,我的解决方案是在调用此方法之前,对传递的实体执行st.size()以初始化集合。

它完全解决了我的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM