2017-05-29 49 views
1

当前我正在为应用程序设计一个域模型。我创建了一个简单的值对象,它基本上只是一个包含用某些业务逻辑增强的字符串的包装。序列化值对象在Spring数据REST中串起

现在杰克逊的默认行为是使像

"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) 
     } 
    } 
} 

我stumbeld翻过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) 
    } 
} 

and

@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"纯字符串?

编辑: 我添加@ComponentSimpleModule让春天的引导加载它在默认情况下,写了豆蔻测试,看看是否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在某些时候无法序列化我的模型。

回答

0

如何让class RouterId继承String

+0

是的,我已经为此感到高兴。虽然这可能会解决这个简单情况下的问题,但我很高兴知道如何使用复杂对象解决此问题。 – kschlesselmann

+0

接下来的问题是,'String'不是'open' ;-) – kschlesselmann