2016-04-07 14 views
0

這是春天4.1.9.RELEASE,彈簧數據1.11.4.RELEASE,Javers 1.6.0與Spring集成Spring AOP中,@JaversAuditable仍試圖提交修改時異常被拋出

所以使用Spring與@JaversAuditable,我發現如果在嘗試插入異常(如重複鍵異常)時處理異常,JaversTransactionalDecorator仍會繼續並嘗試生成提交。

但是,由於插入失敗,我的實體沒有ID,Javers最終拋出一個異常(見下文)。通過調試,我發現我最終在org.springframework.aop.aspectjAspectJAfterAdvice.invoke()終於塊。然後它調用invokeAdviceMethod(JoinPointMatch,null,null),第三個nullThrowable的一個點。

根據http://docs.spring.io/spring/docs/4.1.9.RELEASE/spring-framework-reference/html/aop.html,@After建議將作爲最終運行,無論該方法是否存在正常或異常。因此,聽起來Javer需要能夠檢測是否拋出異常,或使用不同的建議,如@AfterReturning,可能與單獨的@AfterThrowing。我試圖找出當前的@After Javers有(org.javers.spring.auditable.aspect.JaversAuditableRepositoryAspect.commitAdvice(JoinPoint pjp))如何能夠檢測到異常/ throwable是否已被拋出,但我似乎無法在文檔中找到任何關於此的信息。

所以,這是Javers已經有的東西,但由於某種原因,它不正確地拿起拋出的SQL異常,或在哪裏會檢測到一些信息在@After意見拋出的異常/拋出,所以我可以去貢獻一個解決這個問題?

對不起,可能不是非常有組織,我在這裏正常時間幾個小時。

Caused by: org.javers.common.exception.JaversException: ENTITY_INSTANCE_WITH_NULL_ID Found Entity instance of class 'com.findology.api.model.publisher.Publisher' with null id 
at org.javers.core.metamodel.type.EntityType.getIdOf(EntityType.java:96) 
at org.javers.core.metamodel.object.InstanceId.createFromInstance(InstanceId.java:28) 
at org.javers.core.metamodel.object.GlobalIdFactory.createId(GlobalIdFactory.java:47) 
at org.javers.core.graph.LiveCdoFactory.create(LiveCdoFactory.java:24) 
at org.javers.core.graph.LiveCdoFactory.create(LiveCdoFactory.java:9) 
at org.javers.core.graph.EdgeBuilder.asCdo(EdgeBuilder.java:39) 
at org.javers.core.graph.ObjectGraphBuilder.buildGraph(ObjectGraphBuilder.java:45) 
at org.javers.core.graph.LiveGraphFactory.createLiveGraph(LiveGraphFactory.java:39) 
at org.javers.core.commit.CommitFactory.create(CommitFactory.java:76) 
at org.javers.core.JaversCore.commit(JaversCore.java:70) 
at org.javers.spring.jpa.JaversTransactionalDecorator.commit(JaversTransactionalDecorator.java:52) 
at org.javers.spring.jpa.JaversTransactionalDecorator$$FastClassBySpringCGLIB$$acb40bd0.invoke(<generated>) 
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) 
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:718) 
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) 
at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99) 
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:281) 
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96) 
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:653) 
at org.javers.spring.jpa.JaversTransactionalDecorator$$EnhancerBySpringCGLIB$$c6591394.commit(<generated>) 
at org.javers.spring.auditable.aspect.JaversCommitAdvice.commitMethodArguments(JaversCommitAdvice.java:24) 
at org.javers.spring.auditable.aspect.JaversAuditableRepositoryAspect.commitAdvice(JaversAuditableRepositoryAspect.java:48) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:498) 
at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:621) 
at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:603) 
at org.springframework.aop.aspectj.AspectJAfterAdvice.invoke(AspectJAfterAdvice.java:46) 
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:168) 
at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99) 
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:281) 
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96) 
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92) 
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:653) 
at com.findology.api.dao.PublisherDao$$EnhancerBySpringCGLIB$$8ba00510.insert(<generated>) 
at com.findology.api.controller.SimpleController.createPublisher(SimpleController.java:82) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:498) 
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:222) 
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137) 
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110) 
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:775) 
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:705) 
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) 
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959) 
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893) 
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:965) 
... 74 common frames omitted 

回答

0

你是對的,@JaversAuditable不應該調用javers.commit(),當一個異常從一個存儲庫方法拋出通知。你能想出一個PR來解決JaVers中的問題嗎(使用'成功'切入點,也許@AfterReturning就像你提到的那樣)?

+0

當然,我會看看我是否可以今天得到這個,併發送公關。 – Drizzt321

+0

修復在JaVers 1.6.2中發佈 –