【问题标题】:How do I run a web app code LOCALLY?如何在本地运行 Web 应用程序代码?
【发布时间】:2016-05-25 17:06:59
【问题描述】:

我编写了一个 RESTful Web api 供我的客户端(Android 应用)使用。 我需要实现另一个应用程序,一个本地桌面应用程序,它访问已经为服务器端实现的Databases 类。

我不知道该怎么做。

具体来说,这个类用于服务器端:

public Database(String TableName, String KeyName) throws SQLException, NamingException {
  mTableName = TableName;
  mKeyName = KeyName;

  InitialContext ctx = new InitialContext();
  DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/nasdaq_companies");
}

现在抛出了一个异常 (NoInitialContextException),这非常有意义,因为我缺少 context.xml,或者特别是其中缺少此资源

<Resource name="jdbc/nasdaq_companies" auth="Container"
          type="javax.sql.DataSource" driverClassName="com.mysql.jdbc.Driver"
          url="jdbc:mysql://localhost:3306/nasdaq_companies"
          username="*****" password="*****" maxActive="20" maxIdle="10" maxWait="-1"/>

假设服务器 == localhost,如何将上下文资源添加到本地 java 应用程序? (否则,我该如何解决这个问题?)

【问题讨论】:

    标签: java mysql jdbc server


    【解决方案1】:

    如果您正在谈论运行类似于控制台应用程序的东西,我通过调用 Main 中的方法手动设置上下文来解决它,看起来像这样:

        public static void setupInitialContext() {
                try {
                    NamingManager.setInitialContextFactoryBuilder(new InitialContextFactoryBuilder() {
    
                        @Override
                        public InitialContextFactory createInitialContextFactory(Hashtable<?, ?> environment) throws NamingException {
                            return new InitialContextFactory() {
    
                                @Override
                                public Context getInitialContext(Hashtable<?, ?> environment) throws NamingException {
                                    return new InitialContext() {
    
                                        private Hashtable<String, DataSource> dataSources = new Hashtable<>();
    
                                        @Override
                                        public Object lookup(String name) throws NamingException {
    
                                            if (dataSources.isEmpty()) { //init datasources
                                                MysqlConnectionPoolDataSource ds = new MysqlConnectionPoolDataSource();
                                                ds.setURL("jdbc:mysql://localhost:3306/SomeDB");
                                                ds.setUser("dbuser");
                                                ds.setPassword("dbpass");
                                                dataSources.put("jdbc/SomeDataSourceName", ds); 
        //lets add another datasource (optional)
                                                MysqlConnectionPoolDataSource ds = new MysqlConnectionPoolDataSource();
                                                ds.setURL("jdbc:mysql://localhost:3306/OtherDB");
                                                ds.setUser("dbuser");
                                                ds.setPassword("dbpass");
                                                dataSources.put("jdbc/OtherDataSourceName", ds);    
    //you can keep adding these as you need                                         
                                            }
    
                                            if (dataSources.containsKey(name)) {
                                                return dataSources.get(name);
                                            }
    
                                            return null; //or throw exception Java style :)
                                        }
                                    };
                                }
    
                            };
                        }
    
                    });
                }
                catch (NamingException ne) {
    
                }
            }
    

    编辑:

    您首先在 Main 中调用此方法,然后获取这些数据源即可使用此方法

    public static void main( String[] args ) {
    
            setupInitialContext();
    
            Context initContext = new InitialContext();        
            DataSource dataSource = (DataSource) initContext.lookup("jdbc/SomeDB");
    
    }
    

    PS:我想我在 StackOverflow 上也找到了这种方式,但老实说不记得在哪里 :(

    【讨论】:

    • 这正是我的意思,是的。但是请注意,在您的代码中重复了 4 行,除此之外,方法查找应该返回一个对象是最后一个方法的错误,我假设如果没有找到任何内容然后返回 null,但我不确定(也可能通过?)。如果你能在你的回答中解决这个问题,我将不胜感激,我现在​​会尝试一下,非常感谢你的帮助,你可能为我节省了很多时间:)
    • 编辑返回 null 或抛出异常。至于重复的行,它们只是示例,如果您愿意,您可以放置​​多个数据源(一个就足够了)我也用评论编辑了它。
    • OK 有一个问题:在类本身上,如果我调用 initContext.lookup("jdbc/SomeDB") 那么它在本地工作但不在服务器上(它抛出 NameNotFoundException: Name [jdbc/nasdaq_companies ] 未绑定在此上下文中。无法找到 [jdbc]。)。如果我使用 ctx.lookup("java:comp/env/jdbc/nasdaq_companies") 那么它可以在服务器上工作但不能在本地工作:(我需要这个类在本地和服务器上工作:P
    • 您可以尝试将其定义为“java:comp/env/jdbc/nasdaq_companies”而不仅仅是“jdbc/nasday_companies”吗?所以你在 setupInitialContext 中的行看起来像: dataSources.put("java:comp/env/jdbc/nasday_companies", ds);
    • 非常感谢老兄!!另外,由于您在线:我对这个主题几乎一无所知(服务器容器中的上下文将是我对这个主题名称的猜测),我如何了解更多关于它的信息,这样我就不会犯愚蠢的错误? (在没有意识到自己在做什么的情况下编写代码几乎总是一个坏主意:))。再次感谢伙计! :)
    猜你喜欢
    • 2017-12-29
    • 2011-07-08
    • 1970-01-01
    • 1970-01-01
    • 2015-04-12
    • 1970-01-01
    • 2023-04-11
    • 1970-01-01
    • 2017-11-15
    相关资源
    最近更新 更多