更新:问题(如下;见“原始问题”)仍然有效,但我有其他数据。通过将access token作为字符串放入源代码中,并在其中实例化services
字段,我成功地检索了一个资产。也就是说,这是有效的:
String token = "[mysecrettoken]";
try{
connector = V1Connector
.withInstanceUrl(V1_LOC)
.withUserAgentHeader(APPLICATION_NAME, APPLICATION_VERSION)
.withAccessToken(token)
.build();
}
但是,当我使用创建的类从加密文本文件中检索令牌时,它将失败,并出现下面指定的错误。
String token = TokenUtils.getAccessToken();
我使用
System.out.println
来直观地验证令牌是否被完全解密。为什么TokenUtils
返回的解密字符串(看起来是正确的)与直接包含在源代码中的字符串不同?原题:
我有一个与Griffin's类似的问题,但是我使用的是java,到目前为止我还无法找出根本原因。值得注意的是,此程序的早期版本能够成功连接到versionone并检索资产,但当我检索到该提交并使用当前访问令牌(该令牌自提交以来已更改)再次尝试时,我得到的错误与下面相同。
以下是相关的方法;
services
变量是包含类的字段:private Asset findTeam(String teamName){
assert teamName != null;
Asset result = null;
IAssetType assetType = services.getMeta().getAssetType("Team");
Query query = new Query(assetType);
IAttributeDefinition nameAttr =
assetType.getAttributeDefinition("Name");
query.getSelection().add(nameAttr);
try{
QueryResult queryResult = services.retrieve(query);
for (Asset team: queryResult.getAssets()){
String str = team.getAttribute(nameAttr).getValue().toString();
assert str != null;
if (teamName.equals(str)){
result = team;
break;
}
}
}
catch(Exception e){
assert false;
e.printStackTrace();
}
return result;
}
下面是产生的错误:
com.versionone.apiclient.exceptions.ConnectionException:
HTTP/1.1 400 Bad Request error code: 400 VersionOne could not process the request.
at com.versionone.apiclient.V1Connector.manageErrors(V1Connector.java:420)
at com.versionone.apiclient.V1Connector.getData(V1Connector.java:368)
at com.versionone.apiclient.MetaModel.createDocument(MetaModel.java:252)
at com.versionone.apiclient.MetaModel.hookupAssetType(MetaModel.java:185)
at com.versionone.apiclient.MetaModel.findAssetType(MetaModel.java:140)
at com.versionone.apiclient.MetaModel.getAssetType(MetaModel.java:85)
at com.billhorvath.v1mods.TeamModder.addToTeam(TeamModder.java:63)
at com.billhorvath.v1mods.TeamModder.main(TeamModder.java:38)
com.versionone.apiclient.exceptions.MetaException: Error creating Document: Team
at com.versionone.apiclient.MetaModel.createDocument(MetaModel.java:259)
at com.versionone.apiclient.MetaModel.hookupAssetType(MetaModel.java:185)
at com.versionone.apiclient.MetaModel.findAssetType(MetaModel.java:140)
at com.versionone.apiclient.MetaModel.getAssetType(MetaModel.java:85)
at com.billhorvath.v1mods.TeamModder.addToTeam(TeamModder.java:63)
at com.billhorvath.v1mods.TeamModder.main(TeamModder.java:38)
Caused by: com.versionone.apiclient.exceptions.ConnectionException:
HTTP/1.1 400 Bad Request error code: 400 VersionOne could not process the request.
at com.versionone.apiclient.V1Connector.manageErrors(V1Connector.java:420)
at com.versionone.apiclient.V1Connector.getData(V1Connector.java:368)
at com.versionone.apiclient.MetaModel.createDocument(MetaModel.java:252)
... 5 more
Exception in thread "main" com.versionone.apiclient.exceptions.MetaException: Unknown AssetType: Team
at com.versionone.apiclient.MetaModel.getAssetType(MetaModel.java:88)
at com.billhorvath.v1mods.TeamModder.addToTeam(TeamModder.java:63)
at com.billhorvath.v1mods.TeamModder.main(TeamModder.java:38)
Caused by: com.versionone.apiclient.exceptions.MetaException: Error creating Document: Team
at com.versionone.apiclient.MetaModel.createDocument(MetaModel.java:259)
at com.versionone.apiclient.MetaModel.hookupAssetType(MetaModel.java:185)
at com.versionone.apiclient.MetaModel.findAssetType(MetaModel.java:140)
at com.versionone.apiclient.MetaModel.getAssetType(MetaModel.java:85)
... 2 more
Caused by: com.versionone.apiclient.exceptions.ConnectionException:
HTTP/1.1 400 Bad Request error code: 400 VersionOne could not process the request.
at com.versionone.apiclient.V1Connector.manageErrors(V1Connector.java:420)
at com.versionone.apiclient.V1Connector.getData(V1Connector.java:368)
at com.versionone.apiclient.MetaModel.createDocument(MetaModel.java:252)
... 5 more
除了通常的搜索,我还查看了VersionOne Java API的源代码,以及RFC for the 400 error code;我没有找到任何答案。有人有什么建议吗?
最佳答案
(对于二进制比较建议,hat tip toMark Irvin。)
结果发现,这个问题与令牌的加密方式有关:由于令牌的长度为30个字符,并且密码算法(本例中为aes)的要求为32个字节,所以在加密过程中追加了两个空白字节。我修改了解密循环,将整数值为0的字符从字符串末尾去掉,然后wallah!它起作用了。
关于java - 为什么VersionOne无法识别 Assets 类型?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31461932/