当前位置: 首页 > 知识库问答 >
问题:

@上下文注入在Jersey ContainerRequestFilter(Dropwizard)中不工作

穆招
2023-03-14
public class ApplicationIPAuthFilter implements ContainerRequestFilter {

    private static final Logger LOGGER = LoggerFactory.getLogger(ApplicationIPAuthFilter.class);
    private HerculesRestAccessor restAccessor;
    private String applicationName;

    @Context
    private HttpServletRequest httpServletRequest;

    public ApplicationIPAuthFilter(){
    }

    public ApplicationIPAuthFilter(HerculesRestAccessor accessor, String applicationName) {
        restAccessor = accessor;
        this.applicationName = applicationName;
    }

    @Override
    public void filter(ContainerRequestContext requestContext) throws IOException {
        // need remote Ip
        String remoteIp = this.httpServletRequest.getRemoteAddr();
        ....
    }
}


@Provider
public class ApplicationIPAuthFeature implements DynamicFeature {

    private final HerculesRestAccessor accessor;
    private final String applicationName;

    public ApplicationIPAuthFeature(HerculesRestAccessor accessor, String applicationName) {

        this.accessor = accessor;
        this.applicationName = applicationName;
    }

    @Override
    public void configure(ResourceInfo resourceInfo, FeatureContext context) {
        if (resourceInfo.getResourceMethod().getAnnotation(ApplicationIPAuthRequired.class) != null) {

            // not working
            context.register(new ApplicationIPAuthFilter(accessor, applicationName));

             //@Context injection works in ContainerRequestFilter for classes
            //context.register(ApplicationIPAuthFilter.class);
        }
    }
}

我怎么解决这个...需要帮助吗?

共有1个答案

柳鸿信
2023-03-14

这是DynamicFeature的一个已知问题。注册为对象时,注射不起作用。

你可以做的一件事是手动注入它,就像在这篇文章中提到的。

您可以做的另一件事是使HerculesRestAccessorApplicationName可插入。或者使应用程序名称可注入,您可以使其成为配置属性并注入配置。如果您这样做了,那么您就可以将过滤器注册为类,并且所有的注入都应该工作。

 类似资料:
  • 给定以下web.xml: 如何告诉DropWizard将“模块”servlet上下文参数设置为“com.foo.MainModule”? 始终返回空列表。我们应该扩展这个类吗?

  • 我正在测试一个(Eclipse 4)应用程序(我不是在谈论单元测试,而是更多的集成和系统测试)。 我有一个反复出现的问题需要解决。我必须将测试中的上下文“注入”(@inject)到被测试的类中。换句话说,我需要测试做应用程序通常做的事情。 我所做的是创建一个私有方法: 我(错误地)期望刚才在这里创建的上下文可以在测试中的一个类中使用。例如。: 肯定少了些什么!我也创建了activator(为简洁起

  • 下面是我的表格: 截取方法如下: 我添加了以下bean:

  • 那么如何解决这个问题呢?为什么为空。

  • 我目前正在构建一个基于Dropwizard Guice泽西岛的应用程序,其中数据库访问暂时由JDBI处理。 我试图实现的是使用典型的企业架构,其中资源访问服务类访问DAO类,DAO类反过来访问数据库。以适当的DI方式将所有这些连接起来会很好,尽管我想如果其他方法都失败,我可以在应用程序的run()方法中构建对象图。 所以,我遇到了之前提到过的问题:获取DBIFactory需要环境和配置,它们需要在

  • 试图创建一个自定义的,我可以通过Jersey注入到我的资源中。 这在本问题的Java中有涉及。我已经阅读了有关这方面的文档,这些文档也是用Java编写的。最后,GitHub中的一些代码涵盖了相同的主题(通过Dropwizard完成)。 这将全部编译,但在运行时失败,出现以下异常 我不知道是我在向Scala的转换中犯了错误,还是我在注册绑定器时做了错误的事情。