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;
    }

しかし、応答は常に null です。不足している可能性があるものはありますか?

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 に答える