簡體   English   中英

CDI生產方法被忽略

[英]cdi produce method ignored

我正在嘗試使用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;
    }
}

這是我如何通過字段獲得注入的屬性

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

問題是您正在手動實例化您的類。 您需要在bean中保留對caller的引用。

如果您使用的是CDI 1.1,並且需要進行靜態查找,則可以使用CDI.current().select(callerInterface.class).get()獲得參考。 否則你會@Inject callerInterface c

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM