我正在尝试创建一个在构造函数中传递文件和布尔值的简单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可用。
我在这里缺少什么?
答案 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>