Как разрешить исключение NotSerializableException при модульном тестировании простой реализации LinearState - PullRequest
0 голосов
/ 03 апреля 2019

У меня есть простая реализация "LinearState", где единственным параметром является UniqueIdentifier. У меня есть простой контракт с ним.

Однако, когда я пытаюсь пройти через модульное тестирование, я получаю «NotSerializabeException».

Я использую Java-шаблон Corda v4. Настройка тестирования с Gradle Runner на IntelliJ.

Я пытался аннотировать класс с помощью @CordaSerializable, а конструктор - с помощью @ ConstructorForDeserialization

@CordaSerializable
public class InvestorState implements LinearState {

    private final UniqueIdentifier linearId;

    @ConstructorForDeserialization
    public InvestorState(UniqueIdentifier id) {
        this.linearId = id;
    }
...
}
Error log:
data(net.corda.core.contracts.ContractState) -> Trying to build an object serializer for com.mycordapp.states.InvestorState, but it is not constructible from its public properties, and so requires a custom serialiser.

java.io.NotSerializableException: data(net.corda.core.contracts.ContractState) -> Trying to build an object serializer for com.mycordapp.states.InvestorState, but it is not constructible from its public properties, and so requires a custom serialiser.

at net.corda.serialization.internal.amqp.ObjectSerializer$Companion.make(ObjectSerializer.kt:18)
at net.corda.serialization.internal.amqp.DefaultLocalSerializerFactory.makeNonCustomSerializer(LocalSerializerFactory.kt:240)
...

1 Ответ

0 голосов
/ 04 апреля 2019

Я обнаружил, что аргументы, перечисленные в конструкторе, должны быть идентичны объявленным переменным.

Мой исправленный код:

@BelongsToContract(InvestorContract.class) // note this is required for Corda v4
@CordaSerializable // not strictly necessary as this class implements LinearState
public class InvestorState implements LinearState {

    private final UniqueIdentifier linearId;

    @ConstructorForDeserialization // only necessary if there are multiple constructors
    public InvestorState(UniqueIdentifier linearId) {
        this.linearId = linearId;
    }
...
}

В моем случае изменение аргумента конструктора 'id'to' linearId ', как он был объявлен впервые, решил проблему

...