2011-07-28 16 views
5

¿hay alguna manera simple de inyectar la clase de Propiedades cargada con un archivo desde el classpath en EJB (3.1)?inyección de archivo de propiedades EJB3.1

Algo como esto:

@Resource(name="filename.properties", loader=some.properties.loader) 
private Properties someProperties; 

Gracias,

Bozo

+1

No es fácil de JavaEE estándar Sospecho que CDI puede hacer algo como esto con @ Inject + @ Produces, pero no estoy lo suficientemente familiarizado con CDI. (Dejando este comentario con la esperanza de que alguien más pueda completar los detalles). –

Respuesta

3

Como dijo bkail, se puede lograr esto de la siguiente manera. No estoy seguro de lo que su loader=some.properties.loader en realidad quería decir, por lo omitió hacer nada con eso, sino que ya ha proporcionado opción para que en caso de que desea cargar utilizando el loader.getClass().getResourceAsStream ("filename.properties");

En primer lugar definir el tipo de inyección

@BindingType 
@Retention(RetentionPolicy.RUNTIME) 
@Target({ ElementType.TYPE, ElementType.FIELD, ElementType.METHOD, 
     ElementType.PARAMETER }) 
public @interface PropertiesResource { 

    @Nonbinding 
    public String name(); 

    @Nonbinding 
    public String loader(); 

} 

A continuación, crear una productor para que

public class PropertiesResourceLoader { 

    @Produces 
    @PropertiesResource(name = "", loader = "") 
    Properties loadProperties(InjectionPoint ip) { 
     System.out.println("-- called PropertiesResource loader"); 
     PropertiesResource annotation = ip.getAnnotated().getAnnotation(
       PropertiesResource.class); 
     String fileName = annotation.name(); 
     String loader = annotation.loader(); 
     Properties props = null; 
     // Load the properties from file 
     URL url = null; 
     url = Thread.currentThread().getContextClassLoader() 
       .getResource(fileName); 
     if (url != null) { 
      props = new Properties(); 
      try { 
       props.load(url.openStream()); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 

     return props; 
    } 
} 

a continuación, la inyección en el componente con nombre.

@Inject 
@PropertiesResource(name = "filename.properties", loader = "") 
private Properties props; 

lo hice mirar en la documentación de soldadura, donde se le da la @HttpParam como ejemplo here. Esto es de acuerdo a la soldadura 1.1.0, 1.0.0 en la soldadura, la anotación conseguir se puede hacer como esto

PropertiesResource annotation = ip.getAnnotation(PropertiesResource.class); 
0

Si el servidor de aplicaciones que está utilizando tiene SOLDADURA como la implementación CDI (3.x Glassfish o JBoss 7.xo Weblogic 12 son ejemplos), entonces usted desea utilizar una soldadura extensión que se explica en la documentación SOLDADURA here

Es tan simple como añadir esto a su POM

<dependency> 
    <groupId>org.jboss.weld</groupId> 
    <artifactId>weld-extensions</artifactId> 
    <version>${weld.extensions.version}</version> 
    <type>pom</type> 
    <scope>import</scope> 
</dependency> 
Cuestiones relacionadas