-1

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

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

爪哇 ::

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

4

2 回答 2

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()

这里有一些关于如何java.lang.Class在 JRuby 中正确引用对象的更多信息。

综上所述,我认为这将解决您的问题,但也许有一种更简单的方法可以做到这一点......

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

你可以在这里阅读更多关于它的信息,但我认为这对你来说会容易得多:
https ://github.com/intridea/oauth2

或者特别是对于 Facebook,考虑使用 Koala:
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 库的理由是什么?

于 2013-05-05T22:46:52.743 回答
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
于 2013-05-04T01:17:48.453 回答