Невозможно запустить мой пользовательский поток из-за java .io.NotSerializableException - PullRequest
0 голосов
/ 30 марта 2020

У меня возникает эта ошибка, когда я вызываю свой пользовательский поток через мой RPCClient.

@PostMapping(value="/flows/issue")
private fun issuance(@RequestBody note : Money){
    val matchingParties = proxy.partiesFromName(note.owner, false)
    if(matchingParties.size != 1)
        throw IllegalArgumentException("Enter a valid Party name")
    val recipient = matchingParties.single()
    proxy.startFlow(::IssueMoney, note.currency, note.amount, recipient)
}

Мой пользовательский поток - это другой класс с classpath net .corda.server.flows. Я аннотировал его как @CordaSerializable и добавил «-параметры» в компиляторе java.

Ошибка на консоли на моем узле была

Сериализация не удалось направить = " Десериализация ", type =" java .lang.Class ", msg =" Невозможно создать экземпляр net .corda.server.flows.IssueMoney - не на пути к классам ", corda ClassChain =" java .util.List <*> -> net .corda.server.flows.IssueMoney "

Ошибка на моем веб-сервере:

java .io.NotSerializableException: net. corda.server.flows.IssueMoney не был найден узлом, проверьте узел, содержащий CorDapp, который реализует net .corda.server.flows.IssueMoney загружен и в Classpath

1 Ответ

0 голосов
/ 30 марта 2020
  1. CordaSerializable - это аннотация, которую вы помещаете в класс, который отправляется / принимается вашим потоком; например, у вас есть некоторый пользовательский класс MyClass, который ваш инициатор отправляет респонденту; Вы отмечаете MyClass с @CordaSerializable; таким образом, когда ваш инициатор вызывает send, он получает контрольные точки (т.е. все его данные записываются на диск), часть этих данных - ваша MyClass, которая с помощью этой аннотации позволяет Corda сериализовать его (когда поток проверяется) и десериализовать (когда потоки возобновятся). Итак, в заключение, удалите аннотацию из потока.
  2. Я предполагаю, что ошибка произошла, потому что где-то в вашем потоке вы используете java.util.List (это то, что показано в вашем сообщении об ошибке); List - это интерфейс, поэтому Corda не будет знать, как его сериализовать / десериализовать, вместо этого вам придется использовать реализацию интерфейса List, такую ​​как ArrayList или LinkedList.
...