我创建了一个服务并使用@Service(“amazonService”)加载它。 我的应用程序上下文是使用加载此服务 我正在使用
配置属性<bean id="propsHolder"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="ignoreResourceNotFound" value="true" />
<property name="locations">
<list>
<value>classpath:/applicationConfig.properties</value>
</list>
</property>
</bean>
在我的亚马逊服务中,我这样做:
public class AmazonServiceImpl implements FileStorageService {
private AmazonS3 amazonClient;
@Value("${abcxyz}")
public String bucketName ;
我的道具文件有一个属性abcxyz = my-bucket
但是,由于以下异常,这种情况严重失败:
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: public java.lang.String com.flipswap.service.impl.AmazonServiceImpl.bucketName; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [java.lang.String] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Value(value=${abczyz})}
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:508)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:84)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:285)
... 50 more
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [java.lang.String] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Value(value=${abczyz})}
at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:924)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:793)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:707)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:480)
... 52 more
Everyone is able to do this successfully and even i succeeded it in a plain java sample. But running in MVC fails.
Any idea?
答案 0 :(得分:0)
这很奇怪。即使以某种方式未加载属性,@Value
注释也应解析为括号内的字符串。
因此尝试升级到3.1(最近发布),或降级到3.0.5(我确信这有效)。另外,请确保您没有更改xml中的默认自动装配策略。
答案 1 :(得分:0)
<context:property-placeholder location="classpath:/applicationConfig.properties"/>
代替。
请确保Spring配置文件确实已加载:在其中添加一些语法错误,如果应用程序像以前一样运行,则问题是该文件未按预期使用。
答案 2 :(得分:0)
确保PropertyPlaceholderConfigurer bean在与控制器相同的应用程序上下文中声明。 BeanFactoryPostProcessors(如PPC)不会跨父/子应用程序上下文边界继承。可能是您的PPC在“根”应用程序上下文中声明,但您的组件扫描指令在子(调度程序servlet)上下文中声明。这将无效,并会呈现您报告的结果。
答案 3 :(得分:0)
我明白了!实际上,App已将其在web.xml中的自定义XMLWebapplication上下文配置为其弹簧上下文加载器侦听器。
这并没有传递对super方法的调用,而super方法实际上负责注册@Value注释处理器。