2015-02-06 11 views
11

Sto lavorando a un progetto che ha introdotto di recente espressioni lambda. Un esempio va così.VerifyError Uso illegale della chiamata di funzione non virtuale su espressione Lambda in Java 8

public class ExampleItemWriter implements ItemWriter<MyItem> { 
    public void write(List<? extends MyItem> list) throws RepositoryException { 
     list.stream().forEach((item)->{ 
      if (item == null) { 
      } 
     }); 
    } 
} 

Non credo che i dettagli all'interno del forEach() sono rilevanti per il problema, ma se sono posso pubblicare. Ci sono alcune altre espressioni come questa in tutto il codice che generano la stessa eccezione.

java.lang.BootstrapMethodError: call site initialization exception 
     at java.lang.invoke.CallSite.makeSite(CallSite.java:328) 
     at java.lang.invoke.MethodHandleNatives.linkCallSite(MethodHandleNatives.java:296) 
     at com.example.repository.batch.ExampleItemWriter.write(ExampleItemWriter.java:83) 
     at sun.reflect.GeneratedMethodAccessor198.invoke(Unknown Source) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
     at java.lang.reflect.Method.invoke(Method.java:483) 
     at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317) 
     at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190) 
     at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) 
     at org.springframework.aop.support.DelegatingIntroductionInterceptor.doProceed(DelegatingIntroductionInterceptor.java:133) 
     at org.springframework.aop.support.DelegatingIntroductionInterceptor.invoke(DelegatingIntroductionInterceptor.java:121) 
     at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
     at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207) 
     at com.sun.proxy.$Proxy93.write(Unknown Source) 
     at org.springframework.batch.core.step.item.SimpleChunkProcessor.writeItems(SimpleChunkProcessor.java:175) 
     at org.springframework.batch.core.step.item.SimpleChunkProcessor.doWrite(SimpleChunkProcessor.java:151) 
     at org.springframework.batch.core.step.item.FaultTolerantChunkProcessor$3.doWithRetry(FaultTolerantChunkProcessor.java:329) 
     at org.springframework.retry.support.RetryTemplate.doExecute(RetryTemplate.java:255) 
     at org.springframework.retry.support.RetryTemplate.execute(RetryTemplate.java:188) 
     at org.springframework.batch.core.step.item.BatchRetryTemplate.execute(BatchRetryTemplate.java:217) 
     at org.springframework.batch.core.step.item.FaultTolerantChunkProcessor.write(FaultTolerantChunkProcessor.java:422) 
     at org.springframework.batch.core.step.item.SimpleChunkProcessor.process(SimpleChunkProcessor.java:199) 
     at org.springframework.batch.core.step.item.ChunkOrientedTasklet.execute(ChunkOrientedTasklet.java:75) 
     at org.springframework.batch.core.step.tasklet.TaskletStep$ChunkTransactionCallback.doInTransaction(TaskletStep.java:395) 
     at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:133) 
     at org.springframework.batch.core.step.tasklet.TaskletStep$2.doInChunkContext(TaskletStep.java:267) 
     at org.springframework.batch.core.scope.context.StepContextRepeatCallback.doInIteration(StepContextRepeatCallback.java:77) 
     at org.springframework.batch.repeat.support.RepeatTemplate.getNextResult(RepeatTemplate.java:368) 
     at org.springframework.batch.repeat.support.RepeatTemplate.executeInternal(RepeatTemplate.java:215) 
     at org.springframework.batch.repeat.support.RepeatTemplate.iterate(RepeatTemplate.java:144) 
     at org.springframework.batch.core.step.tasklet.TaskletStep.doExecute(TaskletStep.java:253) 
     at org.springframework.batch.core.step.AbstractStep.execute(AbstractStep.java:195) 
     at org.springframework.batch.core.job.SimpleStepHandler.handleStep(SimpleStepHandler.java:137) 
     at org.springframework.batch.core.job.flow.JobFlowExecutor.executeStep(JobFlowExecutor.java:64) 
     at org.springframework.batch.core.job.flow.support.state.StepState.handle(StepState.java:60) 
     at org.springframework.batch.core.job.flow.support.SimpleFlow.resume(SimpleFlow.java:152) 
     at org.springframework.batch.core.job.flow.support.SimpleFlow.start(SimpleFlow.java:131) 
     at org.springframework.batch.core.job.flow.FlowJob.doExecute(FlowJob.java:135) 
     at org.springframework.batch.core.job.AbstractJob.execute(AbstractJob.java:301) 
     at org.springframework.batch.core.launch.support.SimpleJobLauncher$1.run(SimpleJobLauncher.java:134) 
     at org.springframework.core.task.SyncTaskExecutor.execute(SyncTaskExecutor.java:50) 
     at org.springframework.batch.core.launch.support.SimpleJobLauncher.run(SimpleJobLauncher.java:127) 
     at com.example.repository.batch.RunScheduler.run(RunScheduler.java:69) 
     at com.example.repository.batch.messaging.listener.SourceJobRunner.runSourceJob(SourceJobRunner.java:139) 
     at com.example.repository.batch.messaging.listener.SourceJobRunner.onMessage(SourceJobRunner.java:94) 
     at org.springframework.jms.listener.adapter.MessageListenerAdapter.onMessage(MessageListenerAdapter.java:214) 
     at org.springframework.jms.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:660) 
     at org.springframework.jms.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:620) 
     at org.springframework.jms.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:591) 
     at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:308) 
     at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:246) 
     at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1142) 
     at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:1134) 
     at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:1031) 
     at java.lang.Thread.run(Thread.java:745) 
Caused by: java.lang.VerifyError: (class: com/example/repository/batch/ExampleItemWriter$$Lambda$57, method: accept signature: (Ljava/lang/Object;)V) Illegal use of nonvirtual function call 
     at sun.misc.Unsafe.defineAnonymousClass(Native Method) 
     at java.lang.invoke.InnerClassLambdaMetafactory.spinInnerClass(InnerClassLambdaMetafactory.java:324) 
     at java.lang.invoke.InnerClassLambdaMetafactory.buildCallSite(InnerClassLambdaMetafactory.java:194) 
     at java.lang.invoke.LambdaMetafactory.metafactory(LambdaMetafactory.java:304) 
     at java.lang.invoke.CallSite.makeSite(CallSite.java:289) 
     ... 54 more 

Abbiamo un paio di ambienti diversi in esecuzione lo stesso codice e solo alcuni di essi lanciare questa eccezione. Ho passato molte ore su questo problema e finalmente pubblicato qui per le idee. Gli ambienti sembrano avere lo stesso jdk 1.8.0_31 e stiamo usando il plug-in maven-compilatore 3.2.

Qualche consiglio su dove potremmo apparire? Sono fuori di idee. Grazie,/w

+0

Quale versione di primavera stai usando? – henry

+0

@henry che stiamo usando 4.1.1.RELEASE – wsams

+2

Puoi ottenere un dump javap -c -v del file class, mostrando il bytecode per il metodo write e l'attributo BootstrapMethod a cui fa riferimento l'acquisizione del lambda? –

risposta

0

La ragione potrebbe essere che l'interfaccia è sostituito da una versione che è stato compilato su Java 8 e resto del codice è in versione inferiore dire Java 5. C'è bug aperto per questo https://bugs.openjdk.java.net/browse/JDK-8004967

Tuttavia, non penso che questo sia il caso qui visto che stai usando le funzionalità di java8 in ExampleItemWriter e devi compilarlo su java8. Quindi non vi è alcuna questione di obiettivi incoerenti. Puoi ancora considerare di ricostruire l'intero progetto su java8.

0

Ho copiato il metodo di scrittura in un'altra classe, sostituendo MyItem con stringa e utilizzando un'eccezione regolare. Quindi, questo ha funzionato bene per un elenco di stringhe.

Così ho assumere questo o ha a che fare con il contenuto di foreach(), oppure - ciò che è stato detto sopra - con un conflitto di versione.