Jersey 3.0 没有选择 NameBinding 响应过滤器
Posted
技术标签:
【中文标题】Jersey 3.0 没有选择 NameBinding 响应过滤器【英文标题】:Jersey 3.0 not picking up NameBinding response filter 【发布时间】:2021-11-04 21:17:48 【问题描述】:我正在使用 Jersey 3.0.2 在 Eclipse 中编写 Java Web 服务。我可以在 Postman 中看到 json 主体。我需要添加一个 Access-Control-Allow-Origin 标头,但它没有通过。
这是我的基类:
package net.codejava.ws;
import java.util.logging.Logger;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.MediaType;
@Path("/myhello")
public class HelloResource
@GET
@Produces(MediaType.APPLICATION_JSON)
@CORSFilterNameBinding
public CelToFar getHelloJSON()
Logger log = Logger.getGlobal();
log.severe("INSIDE HelloResource.getHelloJSON!");
return new CelToFar();
我有一个名称绑定类:
package net.codejava.ws;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import jakarta.ws.rs.NameBinding;
@NameBinding
@Retention(RetentionPolicy.RUNTIME)
public @interface CORSFilterNameBinding
这是它所指的过滤器类:
package net.codejava.ws;
import java.io.IOException;
import java.util.logging.Logger;
import jakarta.ws.rs.container.ContainerRequestContext;
import jakarta.ws.rs.container.ContainerResponseContext;
import jakarta.ws.rs.container.ContainerResponseFilter;
@CORSFilterNameBinding
public class CORSFilter implements ContainerResponseFilter
@Override
public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext)
throws IOException
Logger log = Logger.getGlobal();
log.severe("INSIDE FILTER!");
responseContext.getHeaders().add("Access-Control-Allow-Origin", "*");
responseContext.getHeaders().add("X-Powered-By", "Jersey :-)");
我看到“INSIDE HelloResource.getHelloJSON!”在 Eclipse 服务器控制台中就好了,但没有看到内部过滤器的日志字符串。我使用官方文档 (https://eclipse-ee4j.github.io/jersey.github.io/documentation/latest3x/filters-and-interceptors.html) 作为参考。任何帮助将非常感激。谢谢
【问题讨论】:
【参考方案1】:我通过添加 @Provider 注释来修复。请注意,官方文档 (https://eclipse-ee4j.github.io/jersey.github.io/documentation/latest3x/filters-and-interceptors.html) 对此要求一无所知。
package net.codejava.ws;
import java.io.IOException;
import java.util.logging.Logger;
import jakarta.ws.rs.container.ContainerRequestContext;
import jakarta.ws.rs.container.ContainerResponseContext;
import jakarta.ws.rs.container.ContainerResponseFilter;
import jakarta.ws.rs.ext.Provider;
@CORSFilterNameBinding
@Provider
public class CORSFilter implements ContainerResponseFilter
@Override
public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext)
throws IOException
Logger log = Logger.getGlobal();
log.severe("INSIDE FILTER!");
responseContext.getHeaders().add("Access-Control-Allow-Origin", "*");
responseContext.getHeaders().add("X-Powered-By", "Jersey :-)");
另外,鉴于包在 web.xml 中被列为提供程序(并且过滤器类在包中),你不会认为这是必需的......:
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>net.codejava.ws</param-value>
</init-param>
如果其他人知道为什么需要@Provider,可以发表评论以帮助我自己和其他人理解。谢谢
【讨论】:
以上是关于Jersey 3.0 没有选择 NameBinding 响应过滤器的主要内容,如果未能解决你的问题,请参考以下文章
如何将 Jersey+Grizzly jar 部署到 AWS