我有一个返回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;
}
但是响应总是空的,我可能会遗漏一些东西吗?
答案 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();
}