Я изменил пример createCar для FabCar, чтобы принимать в качестве аргумента car. Это не сработало, поэтому изменило его на строковое и пытаюсь добавить его в бухгалтерскую книгу.
@Transaction()
public Car createCar(final Context ctx, final String key, String carData) {
ChaincodeStub stub = ctx.getStub();
String carState = stub.getStringState(key);
if (!carState.isEmpty()) {
String errorMessage = String.format("Car %s already exists", key);
System.out.println(errorMessage);
throw new ChaincodeException(errorMessage, FabCarErrors.CAR_ALREADY_EXISTS.toString());
}
System.out.println(carData);
//Car car = genson.deserialize(carData, Car.class);
//Car newCar = new Car(car.make, car.model, car.color, car.owner, car.price);
//carState = genson.serialize(car);
stub.putStringState(key, carData);
return car;
}
Ниже приведен класс Car:
@DataType()
public final class Car {
@Property()
private final String make;
@Property()
private final String model;
@Property()
private final String color;
@Property()
private final String owner;
@Property()
private final int price = 500;
}
Я пытаюсь вызвать следующее Команда от CLI:
peer chaincode invoke -n fabcar -C mychannel -c '{"Args":["createCar", "CAR10", "{\"make\": \"test\", \"model\": \"test\", \"color\": \"test\", \"owner\": \"test\", \"price\": 550}"]}'
Вот исключение, которое я получаю:
23:09:12:681 INFO org.hyperledger.fabric.contract.ContractRouter processRequest Got invoke routing request
23:09:12:684 INFO org.hyperledger.fabric.contract.ContractRouter processRequest Got the invoke request for:createCar [CAR10, {"make": "test", "model": "test", "color": "test", "owner": "test", "price": 550}]
23:09:12:699 FINE org.hyperledger.fabric.contract.execution.impl.ContractInvocationRequest <init> createCar
23:09:12:700 FINE org.hyperledger.fabric.contract.execution.impl.ContractInvocationRequest <init> default createCar [[B@576e3727, [B@4e7d86d7]
23:09:12:701 INFO org.hyperledger.fabric.contract.ContractRouter processRequest Got routing:createCar:org.hyperledger.fabric.samples.fabcar.FabCar
23:09:12:702 FINE org.hyperledger.fabric.contract.execution.impl.ContractExecutionService executeR Routing RequestcreateCar @b9f5e125
23:09:12:766 FINE org.hyperledger.fabric.contract.execution.JSONTransactionSerializer _convert Schema to convert is {schema={type=string}, name=arg1}
23:09:12:767 FINE org.hyperledger.fabric.contract.execution.JSONTransactionSerializer _convert Schema to convert is {schema={type=string}, name=arg2}
23:09:12:769 SEVERE org.hyperledger.fabric.shim.ResponseUtils newErrorResponse Index: 2, Size: 2
java.lang.IndexOutOfBoundsException: Index: 2, Size: 2
at java.util.ArrayList.rangeCheck(ArrayList.java:657)
at java.util.ArrayList.get(ArrayList.java:433)
at org.hyperledger.fabric.contract.execution.impl.ContractExecutionService.convertArgs(ContractExecutionService.java:95)
at org.hyperledger.fabric.contract.execution.impl.ContractExecutionService.executeRequest(ContractExecutionService.java:53)
at org.hyperledger.fabric.contract.ContractRouter.processRequest(ContractRouter.java:96)
at org.hyperledger.fabric.contract.ContractRouter.invoke(ContractRouter.java:107)
at org.hyperledger.fabric.shim.impl.ChaincodeInnvocationTask.call(ChaincodeInnvocationTask.java:91)
at org.hyperledger.fabric.shim.impl.InnvocationTaskManager.lambda$newTask$14(InnvocationTaskManager.java:227)
at org.hyperledger.fabric.shim.impl.InnvocationTaskManager$$Lambda$159.00000000F0231220.run(Unknown Source)
at java.util.concurrent.CompletableFuture$AsyncRun.run(CompletableFuture.java:1626)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:819)
Это правильный подход или я что-то упустил ..? Я в основном хотел добавить аргументы по умолчанию к классу автомобилей, например, цена автомобиля может быть необязательным полем, пытаясь реализовать эту функциональность.