0

我有以下使用 java 类的 jruby 代码javax.naming.InitialContext

if RUBY_PLATFORM == "java"
  require 'java'
  import javax.naming.InitialContext

  module JndiProperties
    def self.getProperty(name)
      begin
        env.lookup(name).to_s
      rescue
        nil
      end
    end

    def self.[](name)
      getProperty(name)
    end

    private
    def self.env
      context = InitialContext.new
      environment = context.lookup 'java:comp/env'
      environment
    end
  end
else
  module JndiProperties
    def self.getProperty(name)
      nil
    end

    def self.[](name)
      getProperty(name)
    end
  end
end

我在 database.yml 中使用这个模块来配置数据库连接。例如:

username: <%= JndiProperties['ANTARCTICLE_DB_USER'] || 'root' %>

当我尝试运行 rails 应用程序时,我得到uninitialized constant JndiProperties::InitialContext. 如果我尝试使用 irb 的这个模块,它将按预期工作。

4

1 回答 1

1

只需将导入行放入模块中:

module JndiProperties
  java_import 'javax.naming.InitialContext'
end

因为它用于const_missing手动解析或分配常量:

InitialContext = Java::JavaxNaming::InitialContext

比它甚至应该在模块之外工作

于 2013-08-12T07:20:06.213 回答