0

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

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

4

1 回答 1

2

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

但是无论如何,您都不应该通过 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();
}
于 2012-06-15T19:34:39.847 回答