我不知道如何使用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>
答案 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库是什么原因?