不能在Spring-Integration 4.1.x中将String值转换为ExpressionEvaluatingRequestHandlerAdvice的Expression [英] Cannot convert String value to Expression for ExpressionEvaluatingRequestHandlerAdvice in spring-integration 4.1.x

查看:106
本文介绍了不能在Spring-Integration 4.1.x中将String值转换为ExpressionEvaluatingRequestHandlerAdvice的Expression的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我无法使ExpressionEvaluatingRequestHandlerAdvice类在Spring Integration 4.1.x中工作.以下表达式建议上下文XML代码段产生转换错误,指出Spring无法将属性onSuccessExpression从字符串转换为表达式.在Spring Integration 4.1.0-RELEASE之前,setOnSuccessExpression()方法仅接受字符串,而现在它已重载以接受字符串或表达式.

I am unable to get the ExpressionEvaluatingRequestHandlerAdvice class to work in Spring Integration 4.1.x. The following expression advice context XML snippet produces a conversion error stating that Spring cannot convert the property onSuccessExpression to an Expression from a String. Prior to Spring Integration 4.1.0-RELEASE the setOnSuccessExpression() method only accepted Strings, now it is overloaded to accept a String or Expression.

<sftp:outbound-channel-adapter channel="outboundChannel"
    session-factory="sftpCachingSessionFactory" remote-directory="${sftp.remote.file.location.path}"
    temporary-file-suffix=".tmp">
    <sftp:request-handler-advice-chain>
        <bean
            class="org.springframework.integration.handler.advice.RequestHandlerRetryAdvice">
            <property name="retryTemplate" ref="defaultRetryTemplate" />
        </bean>
        <bean
            class="org.springframework.integration.handler.advice.ExpressionEvaluatingRequestHandlerAdvice">
            <property name="onSuccessExpression" value="headers.ID" />
            <property name="successChannel" ref="outboundSuccessChannel" />
        </bean>
    </sftp:request-handler-advice-chain>
</sftp:outbound-channel-adapter>

以下是显示的错误:

Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.integration.file.config.FileWritingMessageHandlerFactoryBean#0': Cannot resolve reference to bean 'org.springframework.integration.handler.advice.ExpressionEvaluatingRequestHandlerAdvice#7d12855' while setting bean property 'adviceChain' with key [1]; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.integration.handler.advice.ExpressionEvaluatingRequestHandlerAdvice#7d12855' defined in class path resource [file-transfer-service-file-endpoint-context.xml]: Initialization of bean failed; nested exception is org.springframework.beans.ConversionNotSupportedException: Failed to convert property value of type 'java.lang.String' to required type 'org.springframework.expression.Expression' for property 'onSuccessExpression'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to required type [org.springframework.expression.Expression] for property 'onSuccessExpression': no matching editors or conversion strategy found
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:359)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:108)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveManagedList(BeanDefinitionValueResolver.java:382)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:157)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1469)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1214)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:302)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:743)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:757)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480)
    at pmd.common.spring.SpringServiceContextLoader.main(SpringServiceContextLoader.java:63)
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.integration.handler.advice.ExpressionEvaluatingRequestHandlerAdvice#7d12855' defined in class path resource [file-transfer-service-file-endpoint-context.xml]: Initialization of bean failed; nested exception is org.springframework.beans.ConversionNotSupportedException: Failed to convert property value of type 'java.lang.String' to required type 'org.springframework.expression.Expression' for property 'onSuccessExpression'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to required type [org.springframework.expression.Expression] for property 'onSuccessExpression': no matching editors or conversion strategy found
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:547)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:302)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:351)
    ... 15 more
Caused by: org.springframework.beans.ConversionNotSupportedException: Failed to convert property value of type 'java.lang.String' to required type 'org.springframework.expression.Expression' for property 'onSuccessExpression'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to required type [org.springframework.expression.Expression] for property 'onSuccessExpression': no matching editors or conversion strategy found
    at org.springframework.beans.BeanWrapperImpl.convertIfNecessary(BeanWrapperImpl.java:475)
    at org.springframework.beans.BeanWrapperImpl.convertForProperty(BeanWrapperImpl.java:511)
    at org.springframework.beans.BeanWrapperImpl.convertForProperty(BeanWrapperImpl.java:505)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.convertForProperty(AbstractAutowireCapableBeanFactory.java:1515)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1474)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1214)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537)
    ... 21 more
Caused by: java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to required type [org.springframework.expression.Expression] for property 'onSuccessExpression': no matching editors or conversion strategy found
    at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:287)
    at org.springframework.beans.BeanWrapperImpl.convertIfNecessary(BeanWrapperImpl.java:460)
    ... 27 more

我的问题是我不应该转换onSuccessExpression,而setOnSuccessExpression()方法上有一个用于String的setter.我是否已解决问题,还是Spring Int创建了错误?

My problem is I don't think my onSuccessExpression should be being converted there is a setter for Strings on the setOnSuccessExpression() method. Is there a fix on my part or did Spring Int create a bug?

推荐答案

这是一个错误;我们添加了第二套设置器以支持DSL(因此您可以注入String或Expression).

This is a bug; we added a second set of setters to support the DSL (so you can inject either a String or Expression).

问题在于,这违反了JavaBean定义(两个具有不同参数类型的设置器),因此Spring不知道该选择哪个.我们需要更改方法名称.

The problem is that violates the JavaBean definition (2 setters with different parameter types) so Spring doesn't know which one to pick. We need to change the method names.

不幸的是,对于Spring调用哪种方法并不确定.

Unfortunately it's indeterminate as to which method is invoked by Spring.

与此同时,您可以尝试解决此问题...

In the meantime, you can try work around it with this...

<bean id="success" class="org.springframework.integration.config.ExpressionFactoryBean">
    <constructor-arg value="headers.ID" />
</bean>

和...

<property name="onSuccessExpression" ref="success" />

但是,不幸的是,它不确定哪个方法被调用.在我的环境中,您的代码有效,因为选择了方法的字符串版本.

Unfortunately, though, it's indeterminate which method is invoked; in my environment your code works because the String version of the method is selected.

因此,如果您在多个环境中运行,则可能必须以 @Bean 的形式连接建议.

So you may have to wire up the advice as a @Bean as a work-around if you are running in multiple environments.

我打开了 JIRA问题.我们很快就会在版本中得到修复.

I opened a JIRA Issue. We will get the fix in a release soon.

这篇关于不能在Spring-Integration 4.1.x中将String值转换为ExpressionEvaluatingRequestHandlerAdvice的Expression的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆