cdi产生方法被忽略了

时间:2017-10-15 23:24:56

标签: java cdi

我正在尝试使用cdi注入从application.properties文件中获取属性。使用我的字段时,从不调用我的生产者方法。所以他们总是空的。我错过了什么,做错了什么?

这是我的制作人类:

propertyProducer

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import javax.annotation.PostConstruct;
import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.inject.Produces;
import javax.enterprise.inject.spi.InjectionPoint;
import org.apache.log4j.Logger;

@ApplicationScoped
public class propertyProducer implements property{

    final static Logger logger = Logger.getLogger(propertyProducer.class);
    private Properties properties;

    @Property
    @Produces
    public String produceString(final InjectionPoint ip) {
        return this.properties.getProperty(getKey(ip));
    }

    @Property
    @Produces
    public int produceInt(final InjectionPoint ip) {
        return Integer.valueOf(this.properties.getProperty(getKey(ip)));
    }

    @Property
    @Produces
    public boolean produceBoolean(final InjectionPoint ip) {
        return Boolean.valueOf(this.properties.getProperty(getKey(ip)));
    }

    private String getKey(final InjectionPoint ip) {

        return (ip.getAnnotated().isAnnotationPresent(Property.class) && 
                !ip.getAnnotated().getAnnotation(Property.class).value().isEmpty()) ?
                ip.getAnnotated().getAnnotation(Property.class).value():ip.getMember().getName();

    }
    @PostConstruct

    public void init() {    
        this.properties = new Properties();
        final InputStream stream = propertyProducer.class.getResourceAsStream("/application.properties");  
        if (stream == null) {
            throw new RuntimeException("No properties!!!");
        }    
        try { 
            this.properties.load(stream);    
        } catch (final IOException e) { 
            throw new RuntimeException("Configuration could not be loaded!");   
        }   
    } 
}

我的界面

import javax.enterprise.util.Nonbinding;
import javax.inject.Qualifier;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.PARAMETER;
import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

public interface property {
@Qualifier
@Retention(RUNTIME)
@Target({TYPE, METHOD, FIELD, PARAMETER})
public @interface Property {
    @Nonbinding String value() default "";
    @Nonbinding boolean required() default true;
    }
}

以下是我如何注入属性trhough fields

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathFactory;
import org.apache.log4j.Logger;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import com.kino.jax.property.Property;
import com.kino.jax.urlReader.URLReader;

@RequestScoped
public class caller implements callerInterface{

    @Inject
    @Property("appId")
    private String appId;

    @Inject
    @Property("devId")
    private String devId;

    @Inject
    @Property("certId")
    private String certId;

    @Inject
    @Property("ebayWsBaseUrl")
    private String ebayWsBaseUrl;

    @Inject
    @Property("ebayFindAndGetWsExtension")
    private String ebayFindAndGetWsExtension;

    @Inject
    @Property("ebayFindAndGetWsParam")
    private String ebayFindAndGetWsParam;


    final static Logger logger = Logger.getLogger(caller.class);
    //private int maxResults;
    private final int REQUEST_DELAY=500;

    @Override
    public void run(String search) throws Exception {
        logger.info("inside caller class");
        String address = createAddress(search);
        logger.info("sending request to :: "+ address);
        String response = URLReader.read(address);
        logger.info("response :: "+ response);
        processResponse(response); 
        //Honor rate limits - wait between results
        Thread.sleep(REQUEST_DELAY);
    }
    private String createAddress(String search){
    //substitute token
    logger.info("preparing ws URL ");
    try{
        String address = ebayWsBaseUrl+ebayFindAndGetWsExtension+ebayFindAndGetWsParam;
        address.replace("[appName]", appId);
        address.replace("[keyWords]",search);

        return address;
    }
    catch(Exception e){
        logger.fatal("could not get service property "+e);
        return null;
    }
}

和我的homeManager,我在那里引用了调用者类

//some code
public void callWS(String search){
    callerInterface call = new caller();
        try {
               call.run(search);
            } catch (Exception e) {
                e.printStackTrace();
            }
       }
//some code

1 个答案:

答案 0 :(得分:0)

问题在于您手动实例化您的课程。您需要在bean中保留对caller的引用。

如果您正在使用CDI 1.1并需要进行静态查找,则可以使用CDI.current().select(callerInterface.class).get()来获取参考。否则你会@Inject callerInterface c