2015-11-09 19 views
11

Molte volte ho ottenere stacktraces come questo (si veda la freccia per la linea confusa):

org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [PRIMARY]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement 
       at org.springframework.orm.hibernate5.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:164) 
       at org.springframework.orm.hibernate5.HibernateTransactionManager.convertHibernateAccessException(HibernateTransactionManager.java:741) 
       at org.springframework.orm.hibernate5.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:589) 
       at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:761) 
       at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:730) 
       at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:485) 
       at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:291) 
       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 com.panpwr.admin.services.detector.SimpleDetectorPersistenceService$$EnhancerBySpringCGLIB$$66303639.saveComplexRuleAndActionTemplates(<generated>) 
       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
       at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
       at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
... 
... 
... 

Cosa significa il $$ segno, e che cosa è il 'generato' significa in questa linea? com.panpwr.admin.services.detector.SimpleDetectorPersistenceService$$EnhancerBySpringCGLIB$$66303639.saveComplexRuleAndActionTemplates(<generated>)

E perché dice solo il metodo eseguito ma non la linea in esso?

risposta

13

$ è un carattere consentito nei nomi di classe.

Il nome SimpleDetectorPersistenceService$$EnhancerBySpringCGLIB$$66303639 suggerisce che si tratta di una classe generata dinamicamente in fase di esecuzione dal framework Spring utilizzando CGLIB.

Utilizzano $$ e un offset numerico per rendere questo nome di classe univoco per evitare conflitti con le classi esistenti.

La stringa (<generated>) nel stracktrace troppo è stato generato da CGLIB:
Quando CGLIB crea una classe in fase di esecuzione che utilizza <generated> come segnaposto per il nome del file di origine. Lo stacktrace quindi stampa semplicemente questa stringa anziché il vero file sorgente e il numero di riga.