Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何解决bootcamp cordapp中的-NotSerializableException。测试合同时_Java_Corda_Bootcamp - Fatal编程技术网

Java 如何解决bootcamp cordapp中的-NotSerializableException。测试合同时

Java 如何解决bootcamp cordapp中的-NotSerializableException。测试合同时,java,corda,bootcamp,Java,Corda,Bootcamp,我正在尝试为合同运行corda训练营测试用例。我正在按照视频中给出的步骤进行操作,但是当尝试运行契约测试时,我发现了错误 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 publi

我正在尝试为合同运行corda训练营测试用例。我正在按照视频中给出的步骤进行操作,但是当尝试运行契约测试时,我发现了错误

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.
有人能帮忙吗,怎么解决这个问题?我发现了一个类似的问题-,但这不起作用

下面是使用的令牌状态

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;
    }
}

Corda使用自己的序列化框架,该框架要求Java编译器在生成字节码时保留参数名称,以便以后可以正确地重新创建对象

要使用IntelliJ,请执行以下操作:

  • 打开设置:

    • Windows:文件->设置
    • osX/Ubuntu:IntelliJ IDEA->首选项
  • 转到构建、执行、部署->编译器->Java编译器 在附加命令行参数字段中写入参数

  • 完全重建项目(构建->重建项目)

  • 当构造函数中的参数名称与ContractState的字段名称不匹配时,这通常是一个问题。您能在问题中包含您的合同状态代码吗?@AshutoshMeher,用合同状态代码更新了问题。谢谢@AshutoshMeher的帮助。另外,我做了一些初始设置错误,这有帮助-
    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;
            });
        }