Принимает ли метод цепного кода Hyperledger Fabri c аргументы типа объекта из CLI? - PullRequest
0 голосов
/ 29 января 2020

Я изменил пример 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)

Это правильный подход или я что-то упустил ..? Я в основном хотел добавить аргументы по умолчанию к классу автомобилей, например, цена автомобиля может быть необязательным полем, пытаясь реализовать эту функциональность.

...