【问题标题】:Jersey 3.0 not picking up NameBinding response filterJersey 3.0 没有选择 NameBinding 响应过滤器
【发布时间】: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) 作为参考。任何帮助将非常感激。谢谢

【问题讨论】:

    标签: java eclipse rest jersey


    【解决方案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,可以发表评论以帮助我自己和其他人理解。谢谢

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-01
      • 1970-01-01
      • 2018-02-21
      相关资源
      最近更新 更多