Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.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
Corda查询抛出“com.fasterxml.jackson.databind.JsonMappingException:对象不是声明类的实例”_Json_Spring_Spring Boot_Corda_Fasterxml - Fatal编程技术网

Corda查询抛出“com.fasterxml.jackson.databind.JsonMappingException:对象不是声明类的实例”

Corda查询抛出“com.fasterxml.jackson.databind.JsonMappingException:对象不是声明类的实例”,json,spring,spring-boot,corda,fasterxml,Json,Spring,Spring Boot,Corda,Fasterxml,我正在使用示例cordapp项目作为参考来开发cordapp。我已经能够将事务提交到分类账,甚至可以在节点上运行queryas来查看它是否真的存在。然而,当我试图从我的Spring启动应用程序运行查询时,我得到了这个错误 Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is

我正在使用示例cordapp项目作为参考来开发cordapp。我已经能够将事务提交到分类账,甚至可以在节点上运行queryas来查看它是否真的存在。然而,当我试图从我的Spring启动应用程序运行查询时,我得到了这个错误

Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request 
processing failed; nested exception is 
org.springframework.http.converter.HttpMessageConversionException: JSON mapping problem: 
java.util.Collections$UnmodifiableRandomAccessList[0]->net.corda.core.contracts.StateAndRef["state"]- 
>net.corda.core.contracts.TransactionState["data"]- 
>com.mypackage.states.MyState["party"]; nested exception is 
com.fasterxml.jackson.databind.JsonMappingException: object is not an instance of declaring class 
(through reference chain: java.util.Collections$UnmodifiableRandomAccessList[0]- 
>net.corda.core.contracts.StateAndRef["state"]->net.corda.core.contracts.TransactionState["data"]- 
>com.mypackage.states.MyState["party"])] with root cause

java.lang.IllegalArgumentException: object is not an instance of declaring class
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_251]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_251]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~ 
[na:1.8.0_251]
at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_251]
这是申请代码

 @GetMapping(value = [ "/api/v1/states" ], produces = [MediaType.APPLICATION_JSON_VALUE])
fun getMyIOUs(): ResponseEntity<List<StateAndRef<MyState>>>  {
    val myStates = proxy.vaultQueryBy<MyState>().states
    return ResponseEntity.ok(myStates)
}
这是州代码

@BelongsToContract(com.sentinel.contract.SharingInformationContract::class)
class SharingInformationState(
    val party: Party,
    val dataOwnerId: Long,
    val dataBuyerId: Long,
    override val linearId: UniqueIdentifier = UniqueIdentifier()) : LinearState, QueryableState {

override val participants: List<AbstractParty> = listOf(party)


override fun generateMappedObject(schema: MappedSchema): PersistentState {
    return when (schema) {
        SharingInformationSchemaV1 -> SharingInformationSchemaV1.PersistentSharingInformation(
                party,
                dataOwnerId,
                dataBuyerId,
                linearId.id
        )
        else -> throw IllegalArgumentException("Unrecognised schema $schema")
    }
}

override fun supportedSchemas(): Iterable<MappedSchema> = listOf(SharingInformationSchemaV1)
}


互联网上几乎没有关于这个问题的信息。有人建议它连接到类路径,在那里有重复的东西,但我不知道如何检查。此外,此错误未连接到参与方类型。我曾试图在一个聚会上添加@JsonIgnore,但随后它又在另一个字段上抛出。这个字段在映射模式中的持久性也无关紧要。我试着坚持和不坚持,它改变不了什么。提前谢谢

我认为这是因为您缺少将Corda对象转换为json所需的Corda Jackson支持库

将其添加到build.gradle中的依赖项中

compile "net.corda:corda-jackson:$corda_release_version"
另外,确保配置了MappingJackson2HttpMessageConverter bean

@豆子

异常java.lang.IllegalArgumentException:object不是声明类的实例,如果方法被错误类型的对象上的反射调用,则会发生这种情况

与jackson一起可能会发生这种情况,因为一个普通人在欺骗你。以下是一个例子:

A类val x:字符串 B类值y:字符串 C类val z:列表 ObjectMapper.WriteValueAsTringcListOfBx as列表 这会导致编译警告,但由于类型擦除,它会编译并最初运行。然而,我们在实际需要列表的地方强制注入了一个列表。虽然类型擦除确实删除了相当多的信息,但它并没有完全删除。反射仍然可以用来确定C.z实际上是List类型。Jackson使用此信息并尝试序列化类型A的对象,但在列表中找到类型B的对象,并在给定消息中失败


检查您的数据结构是否实际包含所需的类型

谢谢你的建议!我真的很想念那颗豆子。尽管,不幸的是,它仍然不起作用。我使用Kotlin插件版本1.3.71开发IDEA 2019。这会导致问题吗?据我所知,Corda依赖于1.2.71,我不确定Kotlin插件是否有问题。您可以尝试查看这是否适用于您:。这是我在回答中提到的示例的kotlin版本。如果上述操作有效,您可以确定kotlin插件不是问题,并且您可能希望将其作为验证代码的参考。我决定检查是否从节点获得了任何信息以及获得的信息。因此,节点返回它应该返回的所有内容,但是由于某些原因,返回的类型没有被识别为它们应该返回的类型。例如,我尝试强制转换接收到的状态,结果是:java.lang.ClassCastException:com.mypackage.states.sharingInformation状态无法强制转换为com.mypackagel.states.sharingInformation状态在您提供的示例中,Kotlin的版本为1.2.71。撇开插件不谈,这个版本是渐变的。cordapp示例适用于最新插件,但版本为1.2.71
public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter(){
    ObjectMapper mapper =  JacksonSupport.createDefaultMapper(partyAProxy());
    MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
    converter.setObjectMapper(mapper);
    return converter;
}