Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用@Required和@Autowired时创建bean时出错_Java_Spring - Fatal编程技术网

Java 使用@Required和@Autowired时创建bean时出错

Java 使用@Required和@Autowired时创建bean时出错,java,spring,Java,Spring,我是spring的新手。我试图在我的代码中使用@Required和@Autowired,但它给了我org.springframework.beans.factory.BeanCreationException。下面是我的代码。 1) StudentAuto.java public class StudentAuto { @Autowired private String name; @Autowired private String city; public String getCity()

我是spring的新手。我试图在我的代码中使用
@Required
@Autowired
,但它给了我
org.springframework.beans.factory.BeanCreationException
。下面是我的代码。
1) StudentAuto.java

public class StudentAuto
{

@Autowired
private String name;
@Autowired
private  String city;
public String getCity() {
    return city;
}
@Required
public void setCity(String city) {
    this.city = city;
}
public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
}
2) spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
                        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<context:annotation-config></context:annotation-config>
<bean id='stu' class='com.bean.StudentAuto' >
</bean>

<bean name='name' class='java.lang.String'>
 <constructor-arg value="nm"></constructor-arg> 
 </bean> 

<bean name='city' class='java.lang.String'>
<constructor-arg value="ci"></constructor-arg>
</bean>
</beans>
下面是错误堆栈跟踪

Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'stu' defined in class path resource [spring.xml]: Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanInitializationException: Property 'city' is required for bean 'stu'
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:527)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
    at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1079)
    at com.bean.TestApp.main(TestApp.java:14)
Caused by: org.springframework.beans.factory.BeanInitializationException: Property 'city' is required for bean 'stu'
    at org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor.postProcessPropertyValues(RequiredAnnotationBeanPostProcessor.java:149)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1074)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517)
    ... 7 more

请在这个问题上帮助我。

javadoc for
@Required
状态

将方法(通常是JavaBean setter方法)标记为 “必需”:即,必须将setter方法配置为 注入值的依赖项

请注意,带注释的方法不一定是setter,但它通常就是setter

@Required
方法由
RequiredAnnotationBeanPostProcessor
处理,该处理器声明

这很好地将此类检查的责任推到了容器上 (可以说是属于该公司的),并且(部分)不需要 开发人员编写一个方法,只需检查所有必需的 属性实际上已经设置好了

因此,其目的是通过检查容器是否实际调用了该方法来确保设置属性

典型的模式是

class Foo {
    private String value;
    @Required
    public void setValue(String value) {
        this.value = value;
    }
}
使用bean定义

<bean class="Foo" id="fooBean">
    <property name="value" value="some value"/>
</bean>

如果您没有添加
,容器会抱怨并抛出异常,就像您的配置一样

<bean id='stu' class='com.bean.StudentAuto' >
</bean>


这里,容器没有使用
@Required
方法来设置属性。由于
@Autowired
,它直接在
字段上使用反射。因此,
@必需的
注释未经验证。

1。文件:

此注释仅指示受影响的bean属性必须在配置时通过
bean定义中的显式属性值或通过
自动连接来填充


2。请注意:
@Required
注释用于验证检查,而不是依赖项注入。


3。修复方法:

如错误日志所示:
属性'city'是bean'stu'所必需的。
。因此,您应该手动将propery标记添加到
stu
bean-inject
city

<bean id="stu" class="com.bean.StudentAuto">
    <property name="city" value="London"/>
</bean>


属性'city'是bean'stu'所必需的。
为什么指定
@required
,为什么将其放在与
@Autowired
不同的成员上
@Autowired
默认为必需;只需删除
@Required
注释即可。另外,如果您是Spring新手,我建议您学习JavaConfig系统而不是XML配置。在我看来,它更干净、更容易使用。同时使用
@Required
@Autowired
没有任何意义:
@Autowired
如果无法设置属性,将导致异常。添加
@Required
只会为另一个独立的机制做更多的工作,该机制会遍历bean并检查需求是否满足。如果使用
@Autowired
,则属性设置为“完全停止”。您不需要检查它是否已设置,因为它肯定是通过一个
@Autowired
属性设置的。您能告诉我如何从配置注释java类中的Bean注释方法中设置所需的注释参数吗(java方式相当于给定的解决方案)。谢谢
<bean id="stu" class="com.bean.StudentAuto">
    <property name="city" value="London"/>
</bean>