【问题标题】:Serialize Value Object to String in Spring Data REST在 Spring Data REST 中将值对象序列化为字符串
【发布时间】:2017-10-29 18:51:00
【问题描述】:

目前我正在为应用程序设计域模型。我创建了一个简单的值对象,它基本上只是一个用一些业务逻辑增强的字符串的包装器。

现在jackson的默认行为是像这样渲染对象

"routerId": {
    "routerId": "aa:aa:aa:aa:aa:aa"
}

@Embeddable
data class RouterId(val routerId: String) {

    init {
        val octets = routerId.split(":")

        if (octets.size != 6) {
            throw IllegalArgumentException("$routerId does not consist of 6 octets")
        }

        for (octet in octets) {
            Integer.parseInt(octet, 16)
        }
    }
}

我遇到了http://docs.spring.io/spring-data/rest/docs/2.6.3.RELEASE/reference/html/#_adding_custom_de_serializers_to_jackson_s_objectmapper,并试图提供我的自定义杰克逊模块来处理序列化

class NicemediaModule : SimpleModule("NicemediaModule") {

    override fun setupModule(context: SetupContext?) {
        val serializers = SimpleSerializers()
        serializers.addSerializer(RouterId::class.java, RouterIdSerializer())

        context?.addSerializers(serializers)
    }
}

private class RouterIdSerializer : StdSerializer<RouterId>(RouterId::class.java) {

    override fun serialize(value: RouterId?, gen: JsonGenerator?, provider: SerializerProvider?) {
        gen?.writeString(value?.routerId)
    }
}

@Configuration
open class SpringDataRestConfiguration : RepositoryRestConfigurerAdapter() {

    override fun configureJacksonObjectMapper(objectMapper: ObjectMapper?) {
        objectMapper?.registerModule(NicemediaModule())
    }
}

但这只会导致

"routerId": {
    "content": "aa:aa:aa:aa:aa:aa"
}

谁能指出我需要做什么才能将RouterId 序列化为像"routerId": "aa:aa:aa:aa:aa:aa" 这样的普通字符串?

编辑: 我将@Component 添加到我的SimpleModule 中,以便Spring Boot 默认加载它并编写一个小测试以查看ObjectMapper 是否有效。

@SpringBootTest
@RunWith(SpringRunner::class)
class JsonSerializationTest {

    @Autowired
    private lateinit var mapper: ObjectMapper

    @Test
    fun serializeRouterId() {
        val routerId: String = "11:11:11:11:11:11"
        assertEquals("\"$routerId\"", mapper.writeValueAsString(RouterId(routerId)))
    }
}

工作得很好。这可能表明我的代码一直在工作,但 Spring Data REST 在某些时候无法序列化我的模型。

【问题讨论】:

    标签: json jackson spring-data-rest


    【解决方案1】:

    class RouterId 继承自String 怎么样?

    【讨论】:

    • 是的,我已经考虑过了。虽然这可能会解决这个简单情况下的问题,但很高兴知道我将如何用复杂的对象解决这个问题。
    • 下一个问题是,String 不是open ;-)
    【解决方案2】:

    尝试按照this 答案中的建议实施自定义BackendIdConverter SPI。像魅力一样工作!

    【讨论】:

      猜你喜欢
      • 2011-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-31
      • 2010-09-13
      相关资源
      最近更新 更多