【问题标题】:CDI cannot retrieve servlet responde using @Context annotationCDI 无法使用 @Context 注释检索 servlet 响应
【发布时间】:2012-06-15 14:42:21
【问题描述】:

我有一个返回 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;
    }

但是响应总是空的,我可能会遗漏什么吗?

【问题讨论】:

  • 不确定这是否是您的问题的原因,但是将您的类注释为带有 RequestScoped 的 CDI bean 和带有 Stateful 注释的 EJB 绝不是一个好主意...如果您的类不包含任何其他有状态属性,我建议将其标记为无状态,并删除 RequestScoped 注释

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


【解决方案1】:

@Stateful 与 @RequestScoped 冲突。 @RequestScoped 意味着为每个请求创建一个新的资源实例,而 @Stateful 将导致在请求之间共享同一个实例。如果@Stateful 优先,您正在尝试将请求范围的变量 (HttpServletRequest) 注入到单例范围的资源中,这可能不起作用。您可以尝试将其作为方法参数 (public List&lt;Grupo&gt; 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();
}

【讨论】:

    猜你喜欢
    • 2016-03-25
    • 2011-12-19
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多