在如下代码发生了这个错误query.getIsSelf()==1错误[TRACE][15:30:43][org.hibernate.type.descriptor.sql.BasicBinder] - binding parameter [1] as [BIGINT] - [2]
[DEBUG][15:30:43][org.hibernate.engine.jdbc.internal.LogicalConnectionImpl] - Released JDBC connection
Exception in thread "Thread-12" java.lang.NoSuchMethodError: com.nielsen.nsi.domain.Query.getIsSelf()I
            at com.nielsen.nsi.timer.SyncWordCloudDataService.syncWordCloudData(SyncWordCloudDataService.java:59)
            at com.nielsen.nsi.timer.SyncWordCloudDataService$$FastClassBySpringCGLIB$$e2696af.invoke(<generated>)
            at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
            at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:717)
            at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
            at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:98)
            at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:262)
            at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:95)
            at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
            at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:653)
            at com.nielsen.nsi.timer.SyncWordCloudDataService$$EnhancerBySpringCGLIB$$aa7640e6.syncWordCloudData(<generated>)
            at com.nielsen.nsi.timer.SyncBuzzDataService$SyncWordCloudDataRunnable.run(SyncBuzzDataService.java:173)
            at java.lang.Thread.run(Thread.java:722)
[DEBUG][15:30:43][org.hibernate.loader.Loader] - Result set row: 0【排查】
1,从产品环境上拉下Query.class,反编译,发现这个类的确有这个方法;
2,在我本地运行的时候没有出错;
3,把本地类替换到服务器上之后,出现错误,觉得应该是代码不一致;
4,同步代码之后,发现Query里的isserf字段从int变成了Integer
5,把代码更新成 SELF_BRAND .equals(query.getIsSelf())  就可以了。【原因分析】
Java的编译环境和运行环境还是有不同的。
对于代码query.getIsSelf()==1来说,编译器可能有两种解释:
1,query.getIsSelf()拿到的是Integer对象,编译器会把后面的1自动转化为一个Integer对象,然后做比较,看是否是一个对象(当然不会是一个)
2,query.getIsSelf()拿到的是Integer对象,编译器会自动解释为query.getIsSelf().intValue(),获得int值,然后和1做比较
无论哪种,反正编译器没有报错但是到了运行的时候,运行器根据==1去到Query里找方法:  int getIsSelf()   但是没有,因为只有  Integer getIsSelf() 方法。
于是就爆出这个错误。 【避免方法】
1,严格遵守类型一致,尽量避免是用Java自动类型转换的功能;
2,找错的时候,使用Error,而不是找出错日志,  很奇怪,这个地方竟然没有报错误日志:[ERROR]

解决方案 »

  1.   

    楼主分析过程和定位结果还不好说。如果我看到这个问题,其实原因在于,你们的运行环境和开发环境肯定不一致。或者说,你们有好几个人做了jar包,查问题还要去反编译,而没有人敢新出包去打印日志。要避免这个问题,什么反编译啊,比对啊都是无益的。解决方法只有一个:形成团队的check in - build - test - release的游戏规则。