Java/Jersey在执行任何操作之前运行所有资源

Java/Jersey在执行任何操作之前运行所有资源,java,jakarta-ee,jersey,jax-rs,jersey-2.0,Java,Jakarta Ee,Jersey,Jax Rs,Jersey 2.0,我正在用Java/Jersey开发一个rest应用程序,该应用程序的行为出现了一些问题 问题是。。。我有一个文件夹,我把我的资源放在那里,它们扩展了一个名为API的父类,该类执行基于令牌的身份验证 问题是,当我访问任何应用程序端点时,父类中的验证方法会在访问我的模型之前运行多次。 谁能告诉我为什么会这样 我的父类Api @Provider public class Api extends GensonContextResolver implements ContainerRequestFilte

我正在用Java/Jersey开发一个rest应用程序,该应用程序的行为出现了一些问题

问题是。。。我有一个文件夹,我把我的资源放在那里,它们扩展了一个名为API的父类,该类执行基于令牌的身份验证

问题是,当我访问任何应用程序端点时,父类中的验证方法会在访问我的模型之前运行多次。 谁能告诉我为什么会这样

我的父类Api

@Provider
public class Api extends GensonContextResolver implements ContainerRequestFilter {

    @Context
    private UriInfo info;

    public static final String AUTHENTICATION_TOKEN = "token";

    protected ObjectResponse objectResponse;
    protected UsuariosModel userInfo;

    public Api() {

    }

    @Override
    public void filter(ContainerRequestContext containerRequest) throws WebApplicationException {

        this.objectResponse = new ObjectResponse();
        this.userInfo = new UsuariosModel();

        UriInfo info = containerRequest.getUriInfo();

        // não realiza a valização se o  endpoint for o de validação de acesso
        if(info.getPath().equals("autenticacao/valida-acesso")) {
            return;
        }

        try {

            String token = containerRequest.getHeaderString(AUTHENTICATION_TOKEN);

            AutenticacaoController autenticacaoControler = new AutenticacaoController();
            this.objectResponse = autenticacaoControler.validaToken(token);

            UsuariosController usuariosController = new UsuariosController();
            this.userInfo = usuariosController.selecionaDadosUsuario(token);


        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NamingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        if (this.objectResponse.getMessage() != null) {
            Response response = Response.status(this.objectResponse.getCode()).entity(this.objectResponse).build();
            containerRequest.abortWith(response);   
        }

    }
}
资源示例

@Path("/descontos")
public class DescontosResource extends Api{

    public DescontosResource() {

    }

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Response doGet() throws SQLException, NamingException {
        DescontosController descontosController = new DescontosController();
        this.objectResponse = descontosController.selecionaDescontos();
        return Response.status(this.objectResponse.getCode()).entity(this.objectResponse).build();
    }

    @POST
    @Path("clientes")
    @Produces(MediaType.APPLICATION_JSON)
    @Consumes(MediaType.APPLICATION_JSON)
    public Response doPostClientes(DescontosModel descontos) throws SQLException, NamingException {
        DescontosController descontosController = new DescontosController();
        this.objectResponse = descontosController.cadastraDescontosClientes(descontos);
        return Response.status(this.objectResponse.getCode()).entity(this.objectResponse).build();
    }
}

我在这两个链接上找到了答案:

我已经从Api类中删除了代码,并将过滤器移到了其他地方。并最终将my web.xml更新为:

<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
      <param-name>jersey.config.server.provider.packages</param-name>
      <param-value>com.sib.resources; com.sib.filters</param-value>
    </init-param>
    <init-param>
        <param-name>com.sun.jersey.spi.container.ContainerRequestFilters</param-name>
        <param-value>com.sib.filters.AutenticacaoFilter</param-value>
    </init-param>
org.glassfish.jersey.servlet.ServletContainer
jersey.config.server.provider.packages
com.sib.resources;com.sib.filters
com.sun.jersey.spi.container.ContainerRequestFilters
com.sib.filters.AutenticacaoFilter