CDI无法使用@Context注释检索servlet响应

时间:2012-06-15 14:42:22

标签: web-services java-ee dependency-injection jax-rs cdi

我有一个返回json的jax-rs web服务,我想添加cors头文件。

所以我有以下课程:

[...]
import javax.enterprise.context.RequestScoped;
import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.Path;
[...]

@Stateful
@Path("/grupo")
@RequestScoped
@TransactionAttribute
public class GrupoEndpoint
{

   @Context
   private HttpServletResponse response;

    @GET
    public List<Grupo> listAll()
    {
        @SuppressWarnings("unchecked")
        final List<Grupo> results = em.createQuery("SELECT x FROM Grupo x").getResultList();
        // here response is null!!!
        response.addHeader("Access-Control-Allow-Origin", "*");
        response.addHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
        return results;
    }

但是响应总是空的,我可能会遗漏一些东西吗?

1 个答案:

答案 0 :(得分:2)

@Stateful与@RequestScoped冲突。 @RequestScoped表示为每个请求创建了一个新的资源实例,而@Stateful将导致在请求之间共享同一个实例。如果@Stateful优先,则您尝试将请求范围的变量(HttpServletRequest)注入单例范围的资源,这可能不起作用。您可以尝试将其作为方法参数(public List<Grupo> listAll(@Context HttpServletRequest request))注入listAll()。

但是你不应该通过HttpServletResponse添加标题 - 而是应该按如下方式声明你的方法:

@GET
public Response listAll()
{
    @SuppressWarnings("unchecked")
    final List<Grupo> results = em.createQuery("SELECT x FROM Grupo x").getResultList();
    return Response.ok(new GenericEntity<List<Grupo>>(results) {})
            .header("Access-Control-Allow-Origin", "*")
            .header("Access-Control-Allow-Methods", "GET, POST, OPTIONS")
            .build();
}