Setting reference through blueprint xml

866 Views Asked by At

I am trying to pass reference of an interface as a property in a class (inheriting another class), I am getting an error. I tried same thing in a class which does not inherit anything and it works fine. I don't know if I am missing anything here. Any help is appreciated. Thanks :)

Class :

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.Hashtable;
import java.util.StringTokenizer;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;

import org.apache.camel.Endpoint;
import org.apache.camel.Exchange;
import org.apache.camel.Processor;
import org.apache.camel.impl.ScheduledPollConsumer;

import com.walmart.utils.storeConfig.api.IStoreConfigService;


public class WalPipeConsumer extends ScheduledPollConsumer
{
    final static private String CLASS_NAME = WalPipeConsumer.class.getName();

    final static private Logger logger = Logger.getLogger(CLASS_NAME);

    protected Hashtable pipeBuffers;

    private Vector msgs = new Vector();

    private int arrrayLength = 0, headerLength = 0;

    private final Endpoint endpoint;

    private final String pipe;

    private IStoreConfigService storeConfigService;

public WalPipeConsumer(Endpoint endpoint, Processor processor, String pipe)
        throws Exception
{
    super(endpoint, processor);
    logger.finest("inside the wal pipe consumer constructor");
    this.pipe = pipe;
    this.endpoint = endpoint;
    this.countryCode = countryCode;
    logger.finest("before starting the thread");
    new Thread(new WalPipeInputRunner(), "WalCamel Pipe Consumer[" + pipe
            + "]").start();
    logger.finest("after starting the thread");
}

// There are some more functions 
/**
 * @param storeConfigServicethe storeConfigService to set
 */
public void setStoreConfigService(IStoreConfigService storeConfigService) {
    this.storeConfigService = storeConfigService;
}

Blueprint.xml:

<reference id="storeConfigService"
    interface="com.walmart.utils.storeConfig.api.IStoreConfigService" />

<bean id="storeConfigAdapter" class="com.tgcs.walpipe.endpoint.StoreConfigAdapter" init-method="init">
    <property name="storeConfigService" ref="storeConfigService" />
</bean>

<bean id="WalPipeConsumer" class="com.tgcs.walpipe.endpoint.WalPipeConsumer">
    <property name="storeConfigService" ref="storeConfigService" /> 
</bean>

Error:

[2017.09.15-10:34:00.788] [SEVERE] 
[org.apache.aries.blueprint.container.BlueprintContainerImpl] 
[org.apache.aries.blueprint.container.BlueprintContainerImpl.doRun] - Unable 
to start blueprint container for bundle com.tgcs.walpipe.endpoint
org.osgi.service.blueprint.container.ComponentDefinitionException: Unable to 
find a matching constructor on class 
com.tgcs.walpipe.endpoint.WalPipeConsumer for arguments [] when 
instanciating bean WalPipeConsumer 
1

There are 1 best solutions below

3
On

Blueprint tries to create an instance of WalPipeConsumer. You are using a property to set the storeConfigService. So blueprint will first call the empty Constructor to instantiate the class and then call the setter to set the storeConfigService.

As the class does not have an empty construtor this will fail.

To solve this you either need an empty constructor or use elements to set all parameters of the existing constructor.