Как решить - NotSerializableException в bootcamp-cordapp.При тестировании контракта - PullRequest
1 голос
/ 20 сентября 2019

Я пытаюсь запустить тестовый пример corda-bootcamp для Контракта.Я следую как указано в видео, но при попытке запустить тестовый контракт - я получаю ошибку

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

Может кто-то помочь, как решить эту проблему?Я нашел похожую проблему - здесь , но это не сработало.

Ниже используется Tokenstate,

package bootcamp;

import com.google.common.collect.ImmutableList;
import net.corda.core.contracts.BelongsToContract;
import net.corda.core.contracts.ContractState;
import net.corda.core.identity.AbstractParty;
import net.corda.core.identity.Party;

import java.util.ArrayList;
import java.util.List;

/* Our state, defining a shared fact on the ledger.
 * See src/main/java/examples/ArtState.java for an example. */
@BelongsToContract(TokenContract.class)
public class TokenState implements ContractState {

    private Party issuer;
    private Party owner;
    private int amount;

    public TokenState(Party issuer, Party owner, int amount) {
        this.issuer = issuer;
        this.owner = owner;
        this.amount = amount;
    }

    public Party getIssuer() {
        return issuer;
    }

    public Party getOwner() {
        return owner;
    }

    public int getAmount() {
        return amount;
    }

    public List<AbstractParty> getParticipants() {
        List<AbstractParty> participants = new ArrayList<>();
        participants.add(issuer);
        participants.add(owner);
        return participants;
    }
}

Тестовый пример, который выдает ошибку,

private final TestIdentity alice = new TestIdentity(new CordaX500Name("Alice", "", "GB"));
    private final TestIdentity bob = new TestIdentity(new CordaX500Name("Bob", "", "GB"));
    private MockServices ledgerServices = new MockServices(new TestIdentity(new CordaX500Name("TestId", "", "GB")));

    private TokenState tokenState = new TokenState(alice.getParty(), bob.getParty(), 1);

@Test
public void tokenContractRequiresZeroInputsInTheTransaction() {
        transaction(ledgerServices, tx -> {
            // Has an input, will fail.
            tx.input(TokenContract.ID, tokenState);
            tx.output(TokenContract.ID, tokenState);
            tx.command(Arrays.asList(alice.getPublicKey(), bob.getPublicKey()), new TokenContract.Commands.Issue());
            tx.fails();
            return null;
        });

        transaction(ledgerServices, tx -> {
            // Has no input, will verify.
            tx.output(TokenContract.ID, tokenState);
            tx.command(Arrays.asList(alice.getPublicKey(), bob.getPublicKey()), new TokenContract.Commands.Issue());
            tx.verifies();
            return null;
        });
    }

1 Ответ

0 голосов
/ 22 сентября 2019

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

Для этого для работы с IntelliJ выполните следующие действия:

  1. Открыть настройки:

    • Windows: Файл -> Настройки
    • osX / Ubuntu: IntelliJ IDEA -> Настройки
  2. Перейдите в раздел «Сборка, выполнение, развертывание -> Компилятор -> Параметры записи Java-компилятора» в поле «Дополнительные параметры командной строки»

enter image description here

Полностью перестроить проект (Build -> Rebuild Project)

enter image description here

...