java - 通过 web xml 进行 Jersey 过滤器注册不起作用

标签 java rest jersey jax-rs web.xml

我有一个过滤器,如果发送到的资源带有 IdValidation 注释,则该过滤器应该验证传入请求的 ID。 我尝试在 web xml 中添加此过滤器,如 this 中所述。教程。但是,当使用 IdValidation 注释测试方法时,不会调用过滤器。

@Provider
@IdValidation
public class IdValidationFilter implements ContainerRequestFilter {
    @Override
    public void filter(ContainerRequestContext requestContext) throws IOException {
        this.requestContext = requestContext;
        MultivaluedMap<String, String> map = requestContext.getUriInfo().getPathParameters();
        if (map.containsKey("someId")) {
            // Do some validation and abort if nessecary
        }
    }
}

我用来添加此过滤器的界面。

@NameBinding
@Retention(RetentionPolicy.RUNTIME)
public @interface IdValidation {}

网络 XML。我一开始尝试不使用提供程序类名,因为我认为这是不必要的,因为过滤器位于同一个包中,但这也不起作用。

<servlet>
    <servlet-name>Jersey Web Application</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>jersey.config.server.provider.packages</param-name>
        <param-value>my.package</param-value>
    </init-param>

    <init-param>
        <param-name>jersey.config.server.provider.classnames</param-name>
        <param-value>my.package.IdValidationFilter</param-value>
    </init-param>
</servlet>

最佳答案

尝试这个代码 -

import java.io.IOException;
import java.lang.annotation.Annotation;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.ext.Provider;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerRequestFilter;
import javax.ws.rs.container.ResourceInfo;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.Response;

@Provider
public class IdValidationFilter implements ContainerRequestFilter {

    @Context
    private ResourceInfo resourceInfo;

    @Context
    private HttpServletRequest request;

    @Override
    public void filter(final ContainerRequestContext requestContext) throws IOException {


        for (Annotation annotation : resourceInfo.getResourceMethod().getDeclaredAnnotations()) {

            if (IdValidation.class == annotation.annotationType()) {
                 this.requestContext = requestContext;
            MultivaluedMap<String, String> map = requestContext.getUriInfo().getPathParameters();
            if (map.containsKey("someId")) {
                    // Do some validation and abort if nessecary
            }
            }
        }
    }

}

关于java - 通过 web xml 进行 Jersey 过滤器注册不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36978130/

相关文章:

java - 如果 id 不存在,http put 请求应该返回什么?

java - Jersey 客户端 - 设置 IP 地址

java - 如何访问 TreeMap 中的特定元素?

rest - REST API 和 Web 客户端的服务器配置

python - 具有一对一关系的 SQLAlchemy 聚合

java - 将 Jersey 服务实例发布到 Grizzly

java - 无法将 Web 应用程序部署到上下文路径中的服务器?

java - 如何解释以下 Spring EL

java - 共享列表上的多线程

java - 如何从一个文件夹中单独获取 .png 文件