为什么自动布线不适用于这个 Spring MVC 字符串 bean 属性?


@Autowired
private String defaultLanguage;

当我尝试@Autowire时,CountryBean类的defaultLanguage字段如下:

<beans:bean id="countryBean" class="geoapp.CountryBean">
    <beans:property name="defaultLanguage" value="English" />
</beans:bean>

我得到这个错误:

Error creating bean with name 'CountryBean': 
Injection of autowired dependencies failed; 
nested exception is 
org.springframework.beans.factory.BeanCreationException: 
Could not autowire field: 
private java.lang.String geoapp.CountryBean.defaultLanguage; 
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.Autowired(required=true)}:

当它说No matching bean of type [java.lang.String] found for dependency时,我想知道是否还有别的东西我需要说让它知道English的值是String ?

由于您是通过xml显式指定属性值,因此不需要AutoWired注释。

您没有正确使用自动连接功能。

  • 在XML中使用<beans:property ... />并在类
  • 中为属性添加setter
  • 使用@Autowired注释,自动在Spring上下文中查找具有您的属性(在您的示例中为String)
  • 的现有bean。

其他答案都是正确的,但是要澄清一点,要在处理任何@类型注释之前处理*.xml文件中定义的那些bean。因此,对于您的示例,在处理属性"defaultLanguage"之前处理bean"CountryBean",使依赖项为空。

又是一个'其他答案是正确的',但这里有另一个花语给你——Spring会自动为你设置枚举,所以如果你有一个语言的枚举,你的bean定义有类似的东西,你会得到一个类型安全的枚举在那里,而不是一个字符串。

如果您想自动装配您的属性,您需要为defaultLanguage String创建一个新的bean。然后将bean的名称与字段的名称相等。

最新更新