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 响应过滤器的主要内容,如果未能解决你的问题,请参考以下文章

可以在没有 DI 容器的情况下使用 Jersey 吗?

Jersey

3.0之前版本的Android操作栏批量选择

如何将 Jersey+Grizzly jar 部署到 AWS

jersey 2.2 和 Spring Security 3 依赖项?

IntelliJ IDEA + Maven + Tomcat + Jersey搭建RESTful服务