Your config will cause Spring to want to call:
new com.example.Consumer("#{provider.inputStream}","#{provider.outputStream}");
... that is, Consumer(String,String)
. But that constructor doesn't exist, so it fails.
Your error message Could not convert constructor argument value of type [java.lang.String] to required type [java.io.InputStream]
says that. "The constructor takes InputStream
but you gave me String
".
You need to ask Spring to create your Provider, then call that object's methods to create the InputStream and OutputStream has Spring beans. Then use those in your Consumer:
<bean id="provider"
class="com.example.Provider" />
<bean id="inputStream"
factory-bean="provider"
factory-method="getInputStream"/>
<bean id="outputStream"
factory-bean="provider"
factory-method="getOutputStream"/>
<bean id="consumer" class="com.example.Consumer">
<constructor-arg ref="inputStream" />
<constructor-arg ref="outputStream" />
</bean>
You can also do this inline, e.g.
<bean id="consumer" class="com.example.Consumer">
<constructor-arg>
<bean factory-bean="provider" factory-method="getInputStream"/>
</constructor-arg>
<constructor-arg>
<bean factory-bean="provider" factory-method="getOutputStream"/>
</constructor-arg>
</bean>
Based on the Spring Expression Language docs (I haven't tested), the following may also work:
<bean id="consumer" class="com.example.Consumer">
<constructor-arg value="#{provider.getInputStream()}" />
<constructor-arg value="#{provider.getOutputStream()}" />
</bean>
... possibly helping it along with:
<constructor-arg type="java.io.InputStream" value="#{provider.getInputStream()}" />