Hyperledger结构GetHistoryForKey在java上获取空指针异常

Hyperledger结构GetHistoryForKey在java上获取空指针异常,java,hyperledger-fabric,Java,Hyperledger Fabric,我有织物样品项目。我修改了其中一个例子进行实验。我启用了couchDB并尝试获取事务的历史记录。在core.yaml中,我启用了历史记录 @Transaction(intent = Transaction.TYPE.EVALUATE) public ArrayList<String> GetAssetHistory(final Context ctx, final String assetID) { ChaincodeStub stub = ctx.getStub();

我有织物样品项目。我修改了其中一个例子进行实验。我启用了couchDB并尝试获取事务的历史记录。在core.yaml中,我启用了历史记录

   @Transaction(intent = Transaction.TYPE.EVALUATE)
public ArrayList<String> GetAssetHistory(final Context ctx, final String assetID) {
    ChaincodeStub stub = ctx.getStub();
    ArrayList<String> results = new ArrayList<>();
    try {
        QueryResultsIterator<KeyModification> history = stub.getHistoryForKey(assetID);

        Iterator<KeyModification> iter = history.iterator();
        while(iter.hasNext()){
                results.add(iter.next().getStringValue());
        }
    }
    catch(Exception e){
        results.add(e.getMessage());
        results.add(e.getCause().getMessage());
        results.add(e.getStackTrace().toString());
    }
    return results;
}

似乎历史还没有保存在任何地方。或者它试图与某个不存在的对等方通信。

我遇到了同样的问题,并最终通过更改函数的返回值(在您的例子中)来解决它

public ArrayList<String> GetAssetHistory(final Context ctx, final String assetID)
如果查看位于的此类
org.hyperledger.fabric.contract.execution.JSONTransactionSerializer
,可以找到函数
toBuffer
将类型转换为json

以下是一个精简版本:

public byte[]toBuffer(最终对象值,最终类型架构ts){
最终字符串类型=ts.getType();
if(type!=null){
开关(类型){
案例“数组”:
...
大小写“字符串”:
...
案例“编号”:
案例“整数”:
案例“布尔”:
违约:
...
}
}否则{
//此时,我们可以断言该值为
//表示复杂的数据类型
//所以我们可以从
//输入注册表,并获取propertyNames列表
//它应该有
final DataTypeDefinition dtd=this.typeRegistry.getDataType(ts);
最终设置keySet=dtd.getProperties().keySet();
...
}
}
在我的代码中,我没有使用
ArrayList
,而是使用了一个自定义类型,因此它将直接转到
else
。但是在您的代码中,我不知道
ArrayList
是作为数组进入
if
还是被解释为自定义类型。我想它可能会转到
其他
。因此,在
else
中,
ArrayList
未通过
@DataType()
注册为自定义类型,它将生成
NullPointerException

所以在这里我建议你只要使用
String
就行了

public ArrayList<String> GetAssetHistory(final Context ctx, final String assetID)
public String GetAssetHistory(final Context ctx, final String assetID)