Spring没有在构造函数中使用boolean创建bean

时间:2018-05-14 16:43:35

标签: java spring dependency-injection

我正在尝试创建一个在构造函数中传递文件和布尔值的简单bean,如下所示:

@Service
public class FileBasedSink implements Sink {
 protected File outputDirectory;
 protected boolean useCompression;

 public FileBasedSink(File outputDirectory, boolean useCompression) {
    this.outputDirectory = outputDirectory;
    this.useCompression = useCompression;

}


}

和spring-context文件:

<context:component-scan base-package="org.aksw.simba.squirrel" />

    <!-- 
        <bean id="workerImpl" class="org.aksw.simba.squirrel.worker.impl.WorkerImpl"></bean>
     -->
    <!-- Output folder for FileBasedSink -->
    <bean id="outputFolder" class="java.io.File">
        <constructor-arg index="0" value="{systemProperties['OUTPUT_FOLDER']}" />
    </bean>

    <!-- File Based Sink implementation -->
    <bean id="fileSink" class="org.aksw.simba.squirrel.sink.impl.file.FileBasedSink">
        <constructor-arg name="outputDirectory" ref="outputFolder" />
        <constructor-arg name="useCompression" value="true"/>
    </bean>

这应该很简单,但不知何故,spring throws NoSuchBeanDefinitionException :没有'boolean'类型的限定bean可用。

我在这里缺少什么?

3 个答案:

答案 0 :(得分:2)

您正在混合使用组件扫描和XML bean定义。

方法1:

使用@Service - 注释,然后将@Autowired添加到构造函数中。从XML中删除FileBasedSink - bean的定义。 如果它是一个常量布尔bean,那么@Value("true")到布尔参数。 或者,正如@Obi Wan - PallavJha所建议的那样,您可以在上下文中的某处声明boolean bean,并使用@Qualifier("booleanBean") - 注释作为布尔参数。

方法2:

使用<constructor-arg's>通过XML定义bean,但随后删除@Service - 注释。

答案 1 :(得分:0)

您可以创建一个布尔类型的bean:

<bean id="booleanBean" class="java.lang.Boolean">
    <constructor-arg value="true"/>
</bean>

然后将其用作创建fileSink对象的参考,例如

<bean id="fileSink" class="org.aksw.simba.squirrel.sink.impl.file.FileBasedSink">
    <constructor-arg name="outputDirectory" ref="outputFolder" />
    <constructor-arg name="useCompression" ref="booleanBean"/>
</bean>

答案 2 :(得分:0)

you need to provide the type of the variable useCompression

<constructor-arg type="boolean">
   <value>true</value>
</constructor-arg>