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

JRuby でオブジェクトを正しく参照する方法について、さらに詳しい情報があります。java.lang.Class

そうは言っても、それで問題は解決すると思いますが、もっと簡単な方法があるかもしれません...

ここで oauth コンシューマーを作成しようとしているようです。好奇心から、JRuby と完全に連携する Ruby oauth2 gem を使用してみませんか?

詳細についてはこちらを
ご覧ください。

または、特に 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 ライブラリを利用する代わりに、Ruby から Java でこれを実行しようとする理由は何ですか?

于 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 に答える