1

我正在尝试在我的网站中包含贝宝处理。我正在使用 java sdk 生成付款,但是每当我尝试进行身份验证时,都会收到以下错误消息:

java.io.IOException:找不到资源“sdk_config.properties”

我正在执行的代码如下:

String clientID = properties.getProperty("clientID");
String clientSecret = properties.getProperty("clientSecret");
return new OAuthTokenCredential(clientID, clientSecret).getAccessToken();

我知道文档说你需要 maven,但我没有在我的项目中使用 maven...我只是使用 maven 来构建 sdk,然后在我的项目中包含必要的 jar 和文件。我的 sdk_config.properties 文件位于我的 WEB-INF 文件夹下,我在获取 clientID 和 clientSecret 之前将其加载到属性对象中,但是每当我尝试创建 OAuthTokenCredential 时,代码都会对我产生影响。我找不到 OAuthTokenCredential 对象的来源来找到愚蠢的东西,所以我有点卡在这里......该死!提前感谢您的帮助:)

4

3 回答 3

6

好吧,在喝了几杯啤酒和头痛之后,我能够解决自己的问题。我找到了被 OAuthTokenCredential 对象调用以加载 sdk_config.properties 文件的贝宝核心的 ResourceLoader 对象的源代码。我将 ResourceLoader 代码复制并粘贴到我的代码中并运行它以查看它在做什么。所以基本上 ResourceLoader 对象在类路径上查找 sdk_config.properties 文件——我使用这个术语很松散,因为它实际上并没有检查项目的类路径,这就是它找不到文件的原因-- 但它也会在项目的基础包中查找 .properties 文件。所以我通过将 sdk_config.properties 文件移动到项目的基础包中解决了这个问题(意思是我把它直接放在 src 文件夹下)。现在可以了!!!

愚蠢的Paypal代码... Y会以如此松散的方式对付款处理如此重要的东西进行硬编码。如果有 paypal 开发人员在监听,我建议更新代码以允许将 .properties 文件的位置传递给 OAuthTokenCredential 构造函数,然后将该位置传递给 getResourceAsStream() 方法。将它放在下一个版本中,因为我确信它会导致很多人头痛,而且他们中的很多人可能只是放弃并使用其他东西。另外,修复 searchClasspath() 方法......它不是在搜索项目的类路径。

于 2013-06-13T15:10:02.710 回答
3

如果您正确地捆绑了 WAR,那么您应该说像 <>.getResourceAsStream("/sdk_config.properties"); 它应该适合你。

请下载 GitHub 中提供的示例并查看。所有 PayPal 示例都可以开箱即用,因此您还可以将示例代码库与您的代码库进行比较。

https://github.com/paypal/rest-api-sdk-java/tree/master/rest-api-sample

如果您仍有问题,请随时更新此线程。

于 2013-06-13T04:23:23.500 回答
2

在 0.7.1 版本中,您可以使用第二个构造函数,它以configurationMap作为参数。所以你不需要任何sdk_config.properties

public OAuthTokenCredential(String clientID, String clientSecret,Map<String, String> configurationMap)

如果你想在没有 sdk_config.properties 的情况下使用APIContext,你必须调用 setter 来设置配置映射。该映射包含与sdk_config.properties中相同的键:值对。(键区分大小写)

例子:

Map<String, String> configurationMap = getConfigurationMap();
String accessToken = new OAuthTokenCredential(clientId, clientSecret, configurationMap).getAccessToken();
APIContext apiContext = new APIContext(accessToken);
apiContext.setConfigurationMap(configurationMap);
于 2013-09-18T08:51:03.017 回答