如何在JRuby中实现接口并初始化像java这样的对象?

时间:2013-05-01 10:17:34

标签: java ruby interface jruby

我不知道如何使用JRuby中的JAVA类初始化接口对象。

在下面的代码中 OAuthService是接口 ServiceBuilder是类

Java ::

OAuthService service = new ServiceBuilder()
System.out.println(">>>>>>>" + service.getClass());
Output >> class org.scribe.oauth.OAuth20ServiceImpl

但是在JRuby中,我不知道在哪里编写OAuthService接口来初始化对象。

JRuby ::

service = ServiceBuilder.new()
puts service.java_class
Output >> class org.scribe.builder.ServiceBuilder

当我在JAVA

中执行时,以下代码执行并完美运行
      OAuthService service = ServiceBuilder.new()
                                  .provider(FacebookApi.class)
                                  .apiKey(apiKey)
                                  .apiSecret(apiSecret)
                                  .callback("http://localhost:3000/oauth_callback/")
                                  .build()

但是在Ruby中它会给出错误

错误::

irb(main):015:0> service = ServiceBuilder.new()
                                  .provider(FacebookApi.class)
                                  .apiKey(apiKey)
                                  .apiSecret(apiSecret)
                                  .callback("http://localhost:3000/oauth_callback/")
                                  .build()

NoMethodError: undefined method `createService' for Class:Class
    from org/jruby/gen/InterfaceImpl1679303904.gen:13:in `createService'
    from (irb):15:in `evaluate'
    from org/jruby/RubyKernel.java:1066:in `eval'
    from org/jruby/RubyKernel.java:1409:in `loop'
    from org/jruby/RubyKernel.java:1174:in `catch'
    from org/jruby/RubyKernel.java:1174:in `catch'
    from /home/krunal/.rvm/gems/jruby-1.7.3@integration_hub/gems/railties-3.2.13/lib/rails/commands/console.rb:47:in `start'
    from /home/krunal/.rvm/gems/jruby-1.7.3@integration_hub/gems/railties-3.2.13/lib/rails/commands/console.rb:8:in `start'
    from /home/krunal/.rvm/gems/jruby-1.7.3@integration_hub/gems/railties-3.2.13/lib/rails/commands.rb:41:in `(root)'
    from org/jruby/RubyKernel.java:1027:in `require'
    from script/rails:6:in `(root)'
irb(main):016:0> 

https://github.com/fernandezpablo85/scribe-java

https://github.com/fernandezpablo85/scribe-java/blob/master/src/test/java/org/scribe/examples/FacebookExample.java

2 个答案:

答案 0 :(得分:2)

我很确定您提供的java示例不会打印class org.scribe.oauth.OAuth20ServiceImpl。原因是java语句new ServiceBuilder()必须返回ServiceBuilder的实例。

如果您从您提供的链接复制了代码,那么产生输出的java代码确实是

 OAuthService service = new ServiceBuilder()
                              .provider(FacebookApi.class)
                              .apiKey(apiKey)
                              .apiSecret(apiSecret)
                              .callback("http://www.example.com/oauth_callback/")
                              .build();
 System.out.println(">>>>>>>" + service.getClass());

现在应该明白为什么ruby代码打印出不同的东西,ruby代码应该读取,

 service = ServiceBuilder.new().provider(FacebookApi.class)
                               .apiKey(apiKey)
                               .apiSecret(apiSecret)
                               .callback("http://www.example.com/oauth_callback/")
                               .build()
 puts service.java_class

答案 1 :(得分:2)

我认为您的问题是您需要使用java_class来拨打提供商:

service = ServiceBuilder.new().provider(FacebookApi.java_class)
                              .api_key(api_key)
                              .api_secret(api_secret)
                              .callback("http://localhost:3000/oauth_callback/")
                              .build()

还有一些关于如何在JRuby中正确引用java.lang.Class个对象的信息here

所有这一切,我认为这将解决您的问题,但也许我们可以更容易地做到这一点......

看起来你正试图在这里创建一个oauth消费者。出于好奇,为什么不使用与JRuby完美配合的Ruby oauth2 gem?

你可以在这里阅读更多相关内容,但我认为这对你来说要容易得多:
https://github.com/intridea/oauth2

或者特别是Facebook,考虑使用考拉:
https://github.com/arsduo/koala

@graph = Koala::Facebook::API.new(oauth_access_token)

profile = @graph.get_object("me")
friends = @graph.get_connections("me", "friends")
@graph.put_connections("me", "feed", :message => "I am writing on my wall!")

尝试使用Ruby在Java中执行此操作而不是利用可用的Ruby库是什么原因?