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
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? –
@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
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