Hyperledger结构GetHistoryForKey在java上获取空指针异常
我有织物样品项目。我修改了其中一个例子进行实验。我启用了couchDB并尝试获取事务的历史记录。在core.yaml中,我启用了历史记录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();
@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)