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

GuiceRequestScope:我需要为servlet过滤器中的种子值绑定Provider吗?

子车煌
2023-03-14

我在遵循Guice wiki文档使用request scope(https://code . Google . com/p/Google-Guice/wiki/servlet module # Using _ request scope)时遇到了一些问题。

我试图建立一个应用程序,其中我有一个请求范围的ExecutorService。我的用例是根据文档中的例子设计的——为了完整起见,我试图包含其他相关的类。

主要区别在于我在Filter中实例化了一个ExecutorService实例,而不是从请求参数中提取文字值:

@Singleton
public class ExecutorServiceScopingFilter implements Filter {

    public ExecutorService getExecutor() {
        return Executors.newFixedThreadPool(10, ThreadManager.currentRequestThreadFactory());

    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
        ExecutorService executor = getExecutor();

        HttpServletRequest httpRequest = (HttpServletRequest) req;
        httpRequest.setAttribute(Key.get(ExecutorService.class).toString(), executor);

        chain.doFilter(req, resp);
    }

    ...
}

在servlet模块中,我绑定了过滤器:

public class MyServletModule extends ServletModule {
    @Override
    protected void configureServlets() {
        filter("/*").through(ExecutorServiceScopingFilter.class);
        ...
    }
}

我像往常一样在我的servlet上下文监听器中安装模块(我已经设置了web.xml来使用guice过滤器和下面的监听器):

public class MyServletContextListener extends GuiceServletContextListener {
    @Override
    protected Injector getInjector() {
        Injector injector = Guice.createInjector(
            Stage.PRODUCTION,
            new MyServletModule(),
            new MyExampleModule(),
            ...
        );
    }
}

我在无作用域的 POJO 中声明提供程序:

class MyExampleImpl implements IMyExample
{
    @Inject
    protected Provider<ExecutorService> executorProvider;

    ...
}

我将它绑定在一个模块中(它是上面我的监听器中createInjector调用的一个参数):

public class MyExampleModule extends AbstractModule {

   @Override
   protected void configure() {
        bind(IMyExample.class).to(MyExampleImpl.class);
   }
}

当我启动web应用程序时,我会遇到以下异常:

com . Google . inject . creation异常:Guice创建错误:

1) java.util.concurrent没有实现。ExecutorService已绑定。查找com.google.inject时。com.example.IxampleModule.configure(ExampleModule.java:23)的com.exaample.MyExampleImpl.executorProvider(MyExample Impl.java:12)字段的提供程序

1个错误

我发现了一个相关问题,表明使用了虚假绑定(Guice:无法在请求范围内注入带注释的类型)。给出的示例是:

bind(String.class)
.annotatedWith(Names.named("name"))
.toProvider(Providers.<String>of(null));

我尝试绑定ExecutorService并为提供程序获取null(因此注入器返回声明的绑定,而不是使用过滤器定义的绑定)。官方留档中从未提及使用虚假绑定。

所以有几个问题试图解决这个问题,并更多地了解Guice是如何运作的:

>

  • 除了设置属性之外,我是否需要显式绑定(与Guice文档相反)?

    如果是,我是否需要使用@RequestScope注释绑定任何内容?

    我需要创建一个实现provider的Provider吗?

    在检查@Inject Injector对象时,我没有在绑定映射中看到ExecutorService的请求范围绑定。我应该看看这个装订吗?

    在运行时检查ServletScope类中的requestScopeContexthtml" target="_blank">线程局部变量,我确实看到了ExecutorService绑定。这表明绑定正在工作,所以我没有做任何事情(或者做了一些不正确的事情)来访问它。

  • 共有1个答案

    司马飞
    2023-03-14

    您不需要请求中的任何值来创建执行器服务,因此不需要过滤器。只需在一个模块中创建一个提供者方法

    @Provides @RequestScoped
    ExecutorService provideExecutor() {
        return Executors.newFixedThreadPool(
            10, ThreadManager.currentRequestThreadFactory());
    }
    
     类似资料:
    • 我尝试过滤包含值的所有“描述”键的JSON文件;自版本”来打印它们的路径和包含在该值中的版本。我在bash脚本中完成所有这些。 我过滤的JSON来自一个API,在不同的路径上有“description”键。 这是服务器JSON的摘录 到目前为止,我使用curl从服务器获取JSON,并应用以下过滤器将其传输到jq,以获得包含描述中的值的所有路径的列表:

    • 问题内容: 我正在尝试找到一种方法,可将请求从过滤器重定向到登录页面,但我不知道如何从servlet重定向。我搜索了,但发现的是方法。我在过滤器的响应对象上找不到此方法。是什么原因 我该如何解决? 问题答案: 在Filter中,响应是而不是。因此将强制转换为。 如果使用上下文路径: 也不要忘记在最后打电话。

    • 问题内容: Servlet和Filter有什么区别?您建议使用什么来授权页面? 问题答案: 当你要根据特定条件过滤和/或修改请求时,请使用。使用时要控制,预处理和/或后处理请求。 在Java EE的教程中提到有关筛选如下: 筛选器是可以转换请求或响应的标头和内容(或两者)的对象。过滤器与Web组件的不同之处在于,过滤器本身通常不会创建响应。相反,过滤器提供的功能可以“附加”到任何类型的Web资源。

    • Servlet 过滤器可以动态地拦截请求和响应,以变换或使用包含在请求或响应中的信息。 可以将一个或多个 Servlet 过滤器附加到一个 Servlet 或一组 Servlet。Servlet 过滤器也可以附加到 JavaServer Pages (JSP) 文件和 HTML 页面。调用 Servlet 前调用所有附加的 Servlet 过滤器。 Servlet 过滤器是可用于 Servlet

    • 问题内容: 现在可以将Spring中的 s配置为仅使用来在某些URL上调用。 Servlet过滤器可以实现相同的功能(日志记录,安全性等)。那么应该使用哪一个呢? 我认为使用Interceptor,可以使用对象与模型一起使用,因此它具有更多的优势。谁能提出过滤器或拦截器比其他方法更具优势的方案? 问题答案: 该接口的JavaDoc本身有两个段落讨论这个问题: HandlerInterceptor基

    • 问题内容: 我有一个模板绑定,使用Angular的日期过滤器显示名为“ date”的模型属性,该属性是一个日期。 到目前为止,一切都很好。但是,目前,如果日期字段中没有值,则绑定不显示任何内容。但是,如果没有日期,我希望显示字符串“ Various”。 我可以使用二进制运算符获取基本逻辑: 但是我无法使其与日期过滤器一起使用: 如何在日期过滤器旁边使用二元运算符? 问题答案: 原来我要做的就是将表