无法编写JSON:未为类net.i2p.crypto.eddsa.math.ed25519.Ed25519LittleEndianEncoding找到序列化程序

时间:2018-06-26 08:10:16

标签: spring-boot corda

我尝试将spring Web服务器实现为cordapp,但不断出现相同的序列化错误。

{
"timestamp": 1529999846743,
"status": 500,
"error": "Internal Server Error",
"exception": "org.springframework.http.converter.HttpMessageNotWritableException",
"message": "org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: No serializer found for class net.i2p.crypto.eddsa.math.ed25519.Ed25519LittleEndianEncoding and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS); nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class net.i2p.crypto.eddsa.math.ed25519.Ed25519LittleEndianEncoding and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: java.util.ArrayList[0]->java.util.Collections$SingletonMap[\"state\"]->java.util.Collections$SingletonMap[\"data\"]->java.util.LinkedHashMap[\"exitKeys\"]->java.util.LinkedHashSet[0]->net.i2p.crypto.eddsa.EdDSAPublicKey[\"params\"]->net.i2p.crypto.eddsa.spec.EdDSANamedCurveSpec[\"curve\"]->net.i2p.crypto.eddsa.math.Curve[\"field\"]->net.i2p.crypto.eddsa.math.Field[\"encoding\"])",
"path": "/api/obligation/cash"

}

5 个答案:

答案 0 :(得分:2)

基本上,您正在尝试序列化类net.i2p.crypto.eddsa.math.ed25519.Ed25519LittleEndianEncoding的对象,并且您可以在sources中看到,该类没有字段,这会导致序列化失败。

您应将此行添加到您的映射器配置中:

mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);

然后查看输出是否是您想要的。

编辑:根据Spring Boot documentation,您可以通过添加

将此配置添加到默认映射器中
spring.jackson.serialization.FAIL_ON_EMPTY_BEANS=false

到您的application.properties文件。

答案 1 :(得分:2)

在@Configuration类中创建一个ObjectMapper,如下所示:

@Configuration
class Plugin {

   @Bean
   fun registerModule(): ObjectMapper {
      return JacksonSupport.createNonRpcMapper()
   }
}

你很好!

答案 2 :(得分:1)

当Jackson尝试将PublicKey类序列化为JSON format时,抛出此错误。 Corda为某些内部类提供了Jackson support,您必须在Spring中注册该模块:

  1. 在您的spring项目中添加corda-jackson依赖项。
      

    net.corda:corda-jackson:3.1-corda

  2. 为您的春季项目注册Corda Jackson支持Module。您可以使用java config进行操作,如下所示:

@Bean public Module registerModule() { return JacksonSupport.INSTANCE.getCordaModule(); }

答案 3 :(得分:0)

请在类级别使用该bean:

pip

答案 4 :(得分:0)

这应该是由于缺乏JacksonSupport或Corda-Jackson的配置不正确。

就我而言: 我已经有:

implementation("com.fasterxml.jackson.module:jackson-module-kotlin")

但是错误仍然存​​在。

  1. 我在build.gradle.kts中添加了corda-jackson。
implementation( "net.corda:corda-jackson:4.3")
  1. 我在@SpringBootApplication文件中添加了以下Bean JacksonSupport。
@Bean
  @Primary
  fun objectMapper(builder: Jackson2ObjectMapperBuilder): ObjectMapper? {
      return JacksonSupport.createNonRpcMapper().findAndRegisterModules()
  }

错误仍然存​​在。

  1. 然后,我在build.gradle.kts
  2. 中添加了以下行
extra["jackson.version"] = "2.10.2"
  1. 终于奏效了:)