在Spring Data REST中将值对象序列化为字符串

时间:2017-05-29 12:45:46

标签: json jackson spring-data-rest

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

现在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并试图提供我的自定义jackson模块来处理序列化

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默认加载它并编写一个litte测试以查看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在某些时候无法序列化我的模型。

2 个答案:

答案 0 :(得分:0)

class RouterId继承String

怎么样?

答案 1 :(得分:0)

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