【问题标题】:How can I pass a shared object to a ResourceConfig in Jetty?如何将共享对象传递给 Jetty 中的 ResourceConfig?
【发布时间】:2019-09-30 21:47:14
【问题描述】:

我正在编写一个小型嵌入式 Jetty Web 服务器,但我有一个结构昂贵的共享对象,我不希望对 servlet 的每个请求都必须重新构建该对象。不幸的是,我在 Jetty 中添加资源的方式是通过 ResourceConfig 构造函数,但这不允许我做任何事情,除了添加类名:

 // instantiate this expensive object
 MyExpensiveSharedObjectClass myExpensiveSharedObject = new MyExpensiveSharedObjectClass();
 String result = myExpensiveSharedObject.search("alpha");

 // set up the service
 final ResourceConfig resourceConfig = new ResourceConfig(MyService.class);

然后MyService.java 包含您的标准声明,例如:

    @GET
    @Path("/doSomething")
    @Produces(MediaType.APPLICATION_JSON)
    public String doSomething() {
        // do stuff with myExpensiveSharedObject....except how do I get to it??
        // String result = myExpensiveSharedObject.search("alpha");

理想情况下,我想要一种方式,每次请求进入/doSomething 时,我都可以对我之前创建的myExpensiveSharedObject 对象执行方法。

我想这很简单,但我找不到完成此任务的简单方法。

或者 - 有没有办法在 Jetty servlet 中拥有某种形式的共享内存空间?我注意到每一个请求似乎都实例化了一个新的 servlet 实例,因此我不能在对象内建立一个可以被类的所有实例重用的共享内存映射。我确信这是可能的,但我不知道该怎么做。

基本上,我只是想找到一种方法来构建一个昂贵的对象,在构造函数方法中或传递给 servlet 本身是理想的,但在这些 servlet 的上下文中,构造函数是调用每一个请求,所以我不能走那条路。

【问题讨论】:

    标签: jersey jetty embedded-jetty


    【解决方案1】:

    我认为您遇到的是球衣问题,而不是码头问题(但您也可能同时遇到这两个问题!)。看看Dependency injection with Jersey 2.0 是否可以帮助您了解如何将依赖项注入到您的资源类中。如果是这样,那么你应该能够做到

    bind(myExpensiveSharedObject).to(MyExpensiveSharedObjectClass.class)
    

    在 AbstractBinder 实现中,然后您可以通过执行

    向球衣的ResourceConfig 注册
    resourceConfig.register(binder)
    

    【讨论】:

    • 哈哈,是的,我完全迷失了……那个例子指向了很多 XML 配置(我没有)。你知道嵌入式码头服务器的简单完整示例吗?
    • 我相信,XML 只是用于通过 servlet 配置机制设置 ResourceConfig。由于您以编程方式执行此操作,您应该能够忽略该部分,创建一个绑定昂贵对象的AbstractBinder 子类,并将其注册到resourceConfig。 jetty/jersey 最好的完整示例可能是 dropwizard 源,但我不会说它很简单。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    相关资源
    最近更新 更多