Java 为什么VersionOne不能识别资产类型?

Java 为什么VersionOne不能识别资产类型?,java,http,versionone,Java,Http,Versionone,更新:问题(见下面的“原始问题”)仍然有效,但我还有其他数据。通过将访问令牌作为字符串放入源代码中,在services字段被实例化的地方,我能够成功地检索资产。也就是说,这是有效的: String token = "[mysecrettoken]"; try{ connector = V1Connector .withInstanceUrl(V1_LOC) .withUserAgentHeader(APPLICATION_NAME, APPLICATION

更新:问题(见下面的“原始问题”)仍然有效,但我还有其他数据。通过将访问令牌作为字符串放入源代码中,在
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
返回的解密字符串(看起来是正确的)与直接包含在源代码中的字符串不同

原始问题:

我遇到了与类似的问题,但我使用的是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
除了通常的搜索之外,我还回顾了的源代码,以及;我没有找到任何答案。有人有什么建议吗

(关于二进制比较的建议,请参见帽子提示。)


事实证明,问题与令牌的加密方式有关:由于令牌长度为30个字符,并且密码算法(本例中为AES)要求32个字节,因此在加密过程中添加了两个空白字节。我修改了解密周期,将整数值为0的字符从字符串末尾剥离,然后wallah!它起作用了

Bill当您对字符串文字与解密字符串进行差异时会发生什么?StringUtils.差异(“标记”,标记);尝试使用该方法或其他方法进行二进制区分。这可能会暴露原始令牌字符串和保存反序列化令牌的var之间的一些细微差异。我不是Java大师,但我在想,因为字符串文字与字符串对象相同(存储区域设置除外),问题可能在于多余的字符。我也在想同样的事情,可能与相应字符串的字符集有关。我会到处看看,告诉你我发现了什么。