为什么spring.expression.compiler.mode无法编译以下内容?

时间:2014-12-04 22:07:51

标签: java spring spring-integration spring-el

我在Spring Integration 4.1.0中使用Spring 4.1.2。 我知道在Spring 4.1中添加了优化以允许编译SpEL表达式。

根据此链接: http://docs.spring.io/spring/docs/current/spring-framework-reference/html/expressions.html#expressions-compiler-configuration

它说当前只有支持:

  • 涉及作业的表达
  • 依赖转化服务的表达
  • 使用自定义解析器或访问器的表达式
  • 使用选择或投影的表达

话虽如此,有人可以看到为什么spring.expression.compiler.mode=MIXED无法编译以下内容吗?它是使用自定义解析器还是访问器? expression="payload + '#{systemProperties['line.separator']}'"

我认为这可能是一项非常常见的任务。 它直接来自"定义集成流程"这个链接的一部分: https://spring.io/guides/gs/integration/

这里是完整的堆栈跟踪:

2014-12-04T16:47:55,035 [task-scheduler-1] [ERROR] (org.springframework.integration.handler.LoggingHandler) - org.springframework.integration.transformer.MessageTransformationException: ; nested exception is org.springframework.messaging.MessageHandlingException: Expression evaluation failed: payload + '
'; nested exception is java.lang.IllegalStateException: Failed to instantiate CompiledExpression                                                                                                                                                                                                                 
    at org.springframework.integration.transformer.MessageTransformingHandler.handleRequestMessage(MessageTransformingHandler.java:74)                                                                                                                                                                             
    at org.springframework.integration.handler.AbstractReplyProducingMessageHandler.handleMessageInternal(AbstractReplyProducingMessageHandler.java:99)                                                                                                                                                            
    at org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:78)                                                                                                                                                                                                
    at org.springframework.integration.dispatcher.AbstractDispatcher.tryOptimizedDispatch(AbstractDispatcher.java:116)                                                                                                                                                                                             
    at org.springframework.integration.dispatcher.UnicastingDispatcher.doDispatch(UnicastingDispatcher.java:101)                                                                                                                                                                                                   
    at org.springframework.integration.dispatcher.UnicastingDispatcher.dispatch(UnicastingDispatcher.java:97)                                                                                                                                                                                                      
    at org.springframework.integration.channel.AbstractSubscribableChannel.doSend(AbstractSubscribableChannel.java:77)                                                                                                                                                                                             
    at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:277)                                                                                                                                                                                                        
    at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:239)                                                                                                                                                                                                        
    at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:115)                                                                                                                                                                                                       
    at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:45)                                                                                                                                                                                                        
    at org.springframework.messaging.core.AbstractMessageSendingTemplate.send(AbstractMessageSendingTemplate.java:95)                                                                                                                                                                                              
    at com.xxx.FileSplitter.sendOutput(FileSplitter.java:178)                                                                                                                                                                                                                                            
    at com.xxx.FileSplitter.produceOutputInternal(FileSplitter.java:146)                                                                                                                                                                                                                                 
    at com.xxx.FileSplitter.produceOutput(FileSplitter.java:69)                                                                                                                                                                                                                                          
    at org.springframework.integration.handler.AbstractMessageProducingHandler.sendOutputs(AbstractMessageProducingHandler.java:119)                                                                                                                                                                               
    at org.springframework.integration.handler.AbstractReplyProducingMessageHandler.handleMessageInternal(AbstractReplyProducingMessageHandler.java:105)                                                                                                                                                           
    at org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:78)                                                                                                                                                                                                
    at org.springframework.integration.dispatcher.AbstractDispatcher.tryOptimizedDispatch(AbstractDispatcher.java:116)                                                                                                                                                                                             
    at org.springframework.integration.dispatcher.UnicastingDispatcher.doDispatch(UnicastingDispatcher.java:101)                                                                                                                                                                                                   
    at org.springframework.integration.dispatcher.UnicastingDispatcher.dispatch(UnicastingDispatcher.java:97)                                                                                                                                                                                                      
    at org.springframework.integration.channel.AbstractSubscribableChannel.doSend(AbstractSubscribableChannel.java:77)                                                                                                                                                                                             
    at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:277)                                                                                                                                                                                                        
    at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:239)                                                                                                                                                                                                        
    at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:115)                                                                                                                                                                                                       
    at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:45)                                                                                                                                                                                                        
    at org.springframework.messaging.core.AbstractMessageSendingTemplate.send(AbstractMessageSendingTemplate.java:95)                                                                                                                                                                                              
    at org.springframework.integration.endpoint.SourcePollingChannelAdapter.handleMessage(SourcePollingChannelAdapter.java:110)                                                                                                                                                                                    
    at org.springframework.integration.endpoint.AbstractPollingEndpoint.doPoll(AbstractPollingEndpoint.java:219)                                                                                                                                                                                                   
    at org.springframework.integration.endpoint.AbstractPollingEndpoint.access$000(AbstractPollingEndpoint.java:55)                                                                                                                                                                                                
    at org.springframework.integration.endpoint.AbstractPollingEndpoint$1.call(AbstractPollingEndpoint.java:149)                                                                                                                                                                                                   
    at org.springframework.integration.endpoint.AbstractPollingEndpoint$1.call(AbstractPollingEndpoint.java:146)                                                                                                                                                                                                   
    at org.springframework.integration.endpoint.AbstractPollingEndpoint$Poller$1.run(AbstractPollingEndpoint.java:298)                                                                                                                                                                                             
    at org.springframework.integration.util.ErrorHandlingTaskExecutor$1.run(ErrorHandlingTaskExecutor.java:52)                                                                                                                                                                                                     
    at org.springframework.core.task.SyncTaskExecutor.execute(SyncTaskExecutor.java:50)                                                                                                                                                                                                                            
    at org.springframework.integration.util.ErrorHandlingTaskExecutor.execute(ErrorHandlingTaskExecutor.java:49)                                                                                                                                                                                                   
    at org.springframework.integration.endpoint.AbstractPollingEndpoint$Poller.run(AbstractPollingEndpoint.java:292)                                                                                                                                                                                               
    at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54)                                                                                                                                                                                         
    at org.springframework.scheduling.concurrent.ReschedulingRunnable.run(ReschedulingRunnable.java:81)                                                                                                                                                                                                            
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)                                                                                                                                                                                                                                     
    at java.util.concurrent.FutureTask.run(FutureTask.java:262)                                                                                                                                                                                                                                                    
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:178)                                                                                                                                                                                       
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:292)                                                                                                                                                                                              
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)                                                                                                                                                                                                                             
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)                                                                                                                                                                                                                             
    at java.lang.Thread.run(Thread.java:745)                                                                                                                                                                                                                                                                       
Caused by: org.springframework.messaging.MessageHandlingException: Expression evaluation failed: payload + '                                                                                                                                                                                                     
'; nested exception is java.lang.IllegalStateException: Failed to instantiate CompiledExpression                                                                                                                                                                                                                 
    at org.springframework.integration.util.AbstractExpressionEvaluator.evaluateExpression(AbstractExpressionEvaluator.java:138)                                                                                                                                                                                   
    at org.springframework.integration.handler.ExpressionEvaluatingMessageProcessor.processMessage(ExpressionEvaluatingMessageProcessor.java:72)                                                                                                                                                                   
    at org.springframework.integration.transformer.AbstractMessageProcessingTransformer.transform(AbstractMessageProcessingTransformer.java:64)                                                                                                                                                                    
    at org.springframework.integration.transformer.MessageTransformingHandler.handleRequestMessage(MessageTransformingHandler.java:68)                                                                                                                                                                             
    ... 45 more                                                                                                                                                                                                                                                                                                    
Caused by: java.lang.IllegalStateException: Failed to instantiate CompiledExpression                                                                                                                                                                                                                             
    at org.springframework.expression.spel.standard.SpelCompiler.compile(SpelCompiler.java:111)                                                                                                                                                                                                                    
    at org.springframework.expression.spel.standard.SpelExpression.compileExpression(SpelExpression.java:467)                                                                                                                                                                                                      
    at org.springframework.expression.spel.standard.SpelExpression.checkCompile(SpelExpression.java:443)                                                                                                                                                                                                           
    at org.springframework.expression.spel.standard.SpelExpression.getValue(SpelExpression.java:331)                                                                                                                                                                                                               
    at org.springframework.integration.util.AbstractExpressionEvaluator.evaluateExpression(AbstractExpressionEvaluator.java:164)                                                                                                                                                                                   
    at org.springframework.integration.util.AbstractExpressionEvaluator.evaluateExpression(AbstractExpressionEvaluator.java:123)                                                                                                                                                                                   
    ... 48 more                                                                                                                                                                                                                                                                                                    
Caused by: java.lang.VerifyError: (class: spel/Ex2, method: getValue signature: (Ljava/lang/Object;Lorg/springframework/expression/EvaluationContext;)Ljava/lang/Object;) Incompatible argument to function                                                                                                      
    at java.lang.Class.getDeclaredConstructors0(Native Method)                                                                                                                                                                                                                                                     
    at java.lang.Class.privateGetDeclaredConstructors(Class.java:2585)                                                                                                                                                                                                                                             
    at java.lang.Class.getConstructor0(Class.java:2885)                                                                                                                                                                                                                                                            
    at java.lang.Class.newInstance(Class.java:350)                                                                                                                                                                                                                                                                 
    at org.springframework.expression.spel.standard.SpelCompiler.compile(SpelCompiler.java:108)                                                                                                                                                                                                                    
    ... 53 more                                                                                                                                                                                                                                                                                                    

1 个答案:

答案 0 :(得分:2)

表达式编译器不知道有效负载类型似乎存在问题。这有效......

expression="payload.toString() + '#{systemProperties['line.separator']}'"

...大概是因为我们告诉SpEL编译器LH参数的类型。

我会看到我能找到的东西。