Corda Неизвестная ошибка объекта при запуске теста NodeDriver с QueryableState в java - PullRequest
0 голосов
/ 05 февраля 2020

При запуске теста NodeDriver, который использует QueryableState, я получаю сообщение об ошибке «Неизвестная сущность». Я подтвердил, что если я удалю код QueryableState из State, тесты будут успешно выполнены.

java .util.concurrent.ExecutionException: net .corda.core.CordaRuntimeException: java .lang.IllegalArgumentException: неизвестный объект: com.template.states.IOUCustomSchema $ PersistentIOU

Вот реализация QueryableState:

@BelongsToContract(IOUContract.class)
public class IOUState implements ContractState, LinearState, QueryableState {

    public final Amount<TokenType> amount;
    public final Party lender;
    public final Party borrower;
    public final Amount<TokenType> paid;
    private final UniqueIdentifier linearId;

    // Private constructor used only for copying a State object
    @ConstructorForDeserialization
    private IOUState(Amount<TokenType> amount, Party lender, Party borrower, Amount<TokenType> paid, UniqueIdentifier linearId){
        this.amount = amount;
        this.lender = lender;
        this.borrower = borrower;
        this.paid = paid;
        this.linearId = linearId;
    }

    public IOUState(Amount<TokenType> amount, Party lender, Party borrower) {
        this(amount, lender, borrower, new Amount<>(0, amount.getToken()), new UniqueIdentifier());
    }

    /** omitting boiletplate */

    /**
     *  This method will return a list of the nodes which can "use" this state in a valid transaction. In this case, the
     *  lender or the borrower.
     */
    @Override
    public List<AbstractParty> getParticipants() {
        return ImmutableList.of(lender, borrower);
    }

    @Override
    public PersistentState generateMappedObject(MappedSchema schema) {
        if (schema instanceof IOUCustomSchema) {
            return new IOUCustomSchema.PersistentIOU(linearId.getId(), lender.getName().toString(),
                    borrower.getName().toString(), amount.getQuantity());
        } else{
            throw new IllegalArgumentException("Unrecognised schema " + schema);
        }
    }

    @Override
    public Iterable<MappedSchema> supportedSchemas() {
        return ImmutableList.of(new IOUCustomSchema());
    }
}

IOUCustomSchema

public class IOUCustomSchema extends MappedSchema {

    public IOUCustomSchema() {
        super(IOUCustomSchema.class, 1, ImmutableList.of(PersistentState.class));
    }

    @Entity
    @Table
    public static class PersistentIOU extends PersistentState {
        @Column(nullable = false)
        UUID linearId;
        @Column(nullable = false) String lender;
        @Column(nullable = false) String borrower;
        @Column(nullable = false) Long amount;

        public PersistentIOU(UUID linearId, String lender, String borrower, Long amount) {
            this.linearId = linearId;
            this.lender = lender;
            this.borrower = borrower;
            this.amount = amount;
        }

        public PersistentIOU() {
            this.linearId = null;
            this.lender = null;
            this.borrower = null;
            this.amount = 0L;
        }

        public UUID getLinearId() {
            return linearId;
        }

        public String getLender() {
            return lender;
        }

        public String getBorrower() {
            return borrower;
        }

        public Long getAmount() {
            return amount;
        }
    }
}

Ответы [ 2 ]

1 голос
/ 05 февраля 2020

Вы неправильно реализовали пользовательскую схему; у вас должно быть как минимум 2 класса:

  1. IOUCustomSchema должен быть просто пустым классом, представляющим семейство схем для IOUState. Смотрите здесь: https://github.com/corda/samples/blob/release-V4/cordapp-example/contracts-java/src/main/java/com/example/schema/IOUSchema.java
  2. Затем вы создаете V1 схемы, что вы и сделали, но вы должны переименовать свой класс в IOUCustomSchemaV1; так в вашем коде:

    a. Переименуйте класс в IOUCustomSchemaV1.
    b. Переименуйте конструктор в IOUCustomSchemaV1.
    c. Сохранить super(IOUCustomSchema.class... как есть.
    d. В вашем штате также переименуйте IOUCustomSchema в IOUCustomSchemaV1 во всех случаях.

Вы можете увидеть правильную реализацию в репозитории примеров в разделе cordapp-example project:

  1. Семейство схем: https://github.com/corda/samples/blob/release-V4/cordapp-example/contracts-java/src/main/java/com/example/schema/IOUSchema.java
  2. Схема V1: https://github.com/corda/samples/blob/release-V4/cordapp-example/contracts-java/src/main/java/com/example/schema/IOUSchemaV1.java
  3. Состояние: https://github.com/corda/samples/blob/release-V4/cordapp-example/contracts-java/src/main/java/com/example/state/IOUState.java
0 голосов
/ 05 февраля 2020

Это была просто ошибка копирования и вставки. Мне нужно было изменить следующую строку, чтобы все заработало.

super(IOUCustomSchema.class, 1, ImmutableList.of(PersistentState.class));

Я использовал обобщенный c PersistentState вместо моего пользовательского PersistentIOU

super(IOUCustomSchema.class, 1, ImmutableList.of(PersistentIOU.class));
...