2011-09-17 13 views
8

Estoy trabajando en un proyecto empresarial que tiene un módulo EJB y un proyecto web ejecutándose en GlassFish v3.1, Weld v1.1 y Jersey. En el EJB he definido una clase de entidad Manufacturer y he generado una sesión de fachada ManufacturerFacade.Jersey (REST) ​​Sub-recurso CDI

En el proyecto web deseo exponer Manufacturer instancias a través de REST. Para hacerlo, creé los siguientes recursos:

El ManufacturersResource es un recurso contenedor que devuelve una lista de todos los fabricantes almacenados en la base de datos. Lo hace inyectando el ManufacturerFacade y llamando al método findAll(). código abreviado:

@RequestScoped 
@Path("/manufacturer") 
public class ManufacturersResource { 

    @Inject 
    private ManufacturerFacade manufacturerFacade; 

    @GET 
    @Produces("application/xml") 
    public List<Manufacturer> getManufacturers() { 
     return manufacturerFacade.findAll(); 
    } 
} 

Este recurso también tiene un sub-recursos:

@Path("{id}") 
public ManufacturerResource getManufacturer(@PathParam("id") String id) { 
    return ManufacturerResource.getInstance(id, manufacturerFacade); 
} 

El ManufacturerFacade es el siguiente:

public class ManufacturerResource { 

    @Inject 
    private ManufacturerFacade manufacturerFacade; 

    private long id; 

    private ManufacturerResource(String id) { 
     this.id = Long.parseLong(id); 
    } 

    public static ManufacturerResource getInstance(String id,) { 
     return new ManufacturerResource(id); 
    } 

    @GET 
    @Produces("application/xml") 
    public Manufacturer getManufacturer() { 
     return manufacturerFacade.find(id); 
    } 

}

Estamos en una clase diferente sin embargo, y el marco ManufacturerResource no está siendo instanciado por nosotros no tenemos el ManufacturerFacade inyectado.

Sé que puedo simplemente pasan a la fachada del recurso contenedor (ManufacturersResource) al recurso material (ManufacturerResource) a través del constructor pero ¿es posible conseguir de alguna manera DI trabajando en ellos tan bien o está pasándolo a través del constructor de una solución perfectamente bien aquí?

Gracias!

+0

Siento que la clase 'ManufacturersResource' sería más clara nombrada como' ManufacturersResourceController'. – stratwine

+0

Tienes razón. Me estoy mojando los pies en REST, así que aún no he estado refabricando, pero lo haré. ¡Gracias por la sugerencia! – Laurens

Respuesta

14

Debería poder usar ResourceContext para esto y pasar la identificación usando un setter. Por favor, presente un error si no funciona (http://java.net/jira/browse/JERSEY).

@Context 
private ResourceContext resourceContext; 

@Path("{id}") 
public ManufacturerResource getManufacturer(@PathParam("id") String id) { 
    ManufacturerResource r = resourceContext.getResource(ManufacturerResource.class); 
    r.setId(id); 
    return r; 
} 
+0

Hola Martin, ¡gracias un millón! Eso está funcionando sin problemas. Debo añadir que el artículo ('ManufacturerResource') tenía que ser' @ RequestScoped' para que funcione, ¡pero ahora sí! – Laurens

Cuestiones relacionadas