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

Jersey:如何访问全局应用程序对象?

葛骏
2023-03-14

我正在使用Java、Tomcat和泽西创建一个REST Web应用程序。我正在使用注释(没有web.xml!)我最终使用了这个应用程序配置:

package com.my_own.server;

import java.util.Properties;
import javax.ws.rs.ApplicationPath;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import com.my_own.db.PostgreSQLDb;

@ApplicationPath("/api")
public class Application extends javax.ws.rs.core.Application {
    private static Logger logger = LogManager.getLogger(Application.class);
    public static Application application = null;

    public final Properties properties;
    public final PostgreSQLDb adminDb;

    public Application() throws Exception {
        logger.debug("Loading properties from ",
                    getClass().getClassLoader().getResource("config.properties"));
        properties = new Properties();
        properties.load(getClass().getClassLoader().getResourceAsStream("config.properties"));
        adminDb = new PostgreSQLDb(properties, "admin");
        application = this; // Setting the global application object here
    }

}

这是我的问题。Web容器有一个全局应用程序对象。我正在将其从应用程序构造函数保存到静态字段中。稍后我需要从其他类访问它(它包含全局配置、全局数据库连接工厂,可能还有其他东西。)

我这样做对吗?我怀疑一定有更好的方法:在处理注释时保存对应用程序的引用。但我不知道怎么做。我是否可以确保应用程序的构造函数将被精确调用一次,并且应用程序将被调用。以后可以从任何REST调用访问应用程序引用?

共有2个答案

贺正祥
2023-03-14

让我分享一下我的观点:您当然可以使用一个著名的单例模式来存储“全局”静态对象,然而,现在它实际上是一个反模式。

如果这不是一个家庭作业或其他事情,那么存储全局“静态”对象在设计方面总是一个坏主意。如果您想知道为什么有许多来源可以回答这个问题,例如下面的讨论

所以我建议考虑使用依赖注入容器,有很多非常好的容器:Spring、Guice等等。

这些容器可以将这些对象存储为bean,如果您的“部分”功能也由这些容器管理,您将能够将应用程序bean“注入”到控制器中。

它有效地解决了singleton模式引入的所有问题。

鲁文昌
2023-03-14

在jersey中使用依赖项注入,在初始化时绑定应用程序

public class MyApplication extends ResourceConfig {
    public MyApplication() {
        super(MyApplication.class);

        register(new MyBinder());
        packages(true, "location.of.my.jersey.classes");
    }

    /* Bind is used to let jersey know what can be injected */
    private static class MyBinder extends AbstractBinder {
        @Override
        protected void configure() {
            bind(MyApplication.class).to(MyApplication.class);
        }
    }
}

然后在代码中:

@Path("myapi")
@Produces(MediaType.APPLICATION_JSON)
public class ServerRoutes {
    @Inject
    MyApplication application;

//... your rest code here
}

现在,您可以从代码中访问MyApplication,而不需要任何静态或单例,jersey会处理它。

 类似资料:
  • 问题内容: 我正在使用flask,并尝试执行以下操作。 我已经定义了一个main.py文件,通过它我可以运行我的应用程序,即 我定义了一个名为view的程序包,在其中将声明不同的view模块,每个模块都有自己的路由。 因此,我需要在main.py中具有用于运行服务器的全局应用程序对象,以及在包的视图类中用于注册路由的全局对象。那么,如何创建全局应用程序对象并在所有类之间共享呢? 问题答案: 可以从

  • 问题内容: 如何在其他.go包/文件中的main.go中访问已声明/初始化的变量?不断告诉我变量未定义(我知道全局变量不好,但这只是用作时间戳记) 在main.go中 尝试访问其他.go文件中的StartTime,但保持未定义StartTime 问题答案: 我将改为“注入” starttime变量,否则在软件包之间会有循环依赖关系。 main.go otherpackage.go

  • 我正在做一个spring boot应用程序。我有下面的实用程序类,它执行从字符串到Json对象的转换。 在我的一个类中,我使用它如下所示 但我被告知上述方法不是一个很好的做法, jackson Objectmapper的最佳实践建议只应在应用程序中创建映射器的一个实例。spring的一部分使用jackson反序列化和序列化附加到请求的请求体,因此它已经有了一个。为了遵循jackson的最佳实践,s

  • 问题内容: 我知道我可以使用localstorage或SQLite,但是我不确定如何准确地做到这一点。 在我的应用程序中,我在登录控制器中获取会话令牌,在该控制器中,我向服务器发出发布请求,并获得会话令牌。 我不确定如何使此令牌在全局范围内可访问。 PS:我是AngularJs的新手。 问题答案: 从服务器获取令牌后,在控制器中 你可以说 然后,当您想获取令牌(例如在另一个控制器中)时,您所要做的

  • 我的问题很简单,也很直观,但几个星期都解决不了。 我在Windows8上使用Docker。(当然是Docker工具箱+VirtualBox)。我把图像推到Docker Hub并使用Kitematic部署R shiny应用程序。 上面的图片显示它正在运行,但我无法通过给定的Docker机器IP 192.168.99.100:32772访问它

  • 谷歌正在取消不太安全的应用程序访问功能。我正在为我的网站的联系人页面使用smtp电子邮件服务。但在2022年5月30日之后,这项服务可能无法工作。 有没有其他方法可以让第三方不太安全的应用程序访问我的Gmail帐户。。? 应用程序密码能解决这个问题吗...?我怀疑设置应用程序密码也不会提供访问权限,因为谷歌表示这可能不适用于不太安全的应用程序。 那么有什么方法可以解决这个问题,以便smtp电子邮件