2017-10-15 12 views
0

J'essaie d'obtenir les propriétés d'un fichier application.properties en utilisant l'injection cdi. Ma méthode de production n'est jamais appelée lorsque mes champs sont utilisés. Donc ils sont toujours nuls. Qu'est-ce qui me manque?cdi produire la méthode ignorée

Voici ma classe de producteur:

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!"); 
     } 
    } 
} 

mon interface

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; 
    } 
} 

et voici comment je suis injecté propriétés trhough champs

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; 
    } 
} 

et mon HomeManager où je reçois référence à l'appelant la classe

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

Pourquoi 'propertyProducer' implémente-t-il' property'? Ce n'est pas nécessaire. Pour donner plus d'informations, pouvez-vous donner un exemple de la façon dont vous injectez ce champ? et obtenir une référence à cette classe? –

+0

@JohnAment Réservoir vous pour votre réponse, il n'y a pas de propriété propriété de l'implémentation propertyProducer spéciale. Est-ce juste pour tester si elle a un effet ou pas. J'ai édité ma question afin que vous puissiez voir comment mes champs sont utilisés. – kino

+0

Quelle est la signification d'avoir une interface "propriété" (minuscule) autour de votre interface de qualificatif "Propriété" (majuscule)? Cela semble inhabituel. J'essaierais d'éliminer cela et de voir quel effet cela a. – mtj

Répondre

0

Le problème est que vous instancier manuellement votre classe. Vous devez garder une référence à caller dans vos haricots.

Si vous utilisez CDI 1.1 et devez effectuer une recherche statique, vous pouvez utiliser CDI.current().select(callerInterface.class).get() pour obtenir une référence. Sinon,

+0

grâce à l'aide d'injecter référence de l'appelant '@' Inject' appelant protégés callerWS, ' a fait l'affaire – kino