消费者消息 (kafka)。 CustomSerde 反序列化器在 base64

时间:2021-05-19 18:42:47

标签: spring-cloud-contract

我正在尝试对 kafka 主题进行合同测试。我让我的制作人在工作,并生成了一个 stubs.jar,其中只包含我的常规合同。

在使用 stubs.jar (@AutoConfigureStubRunner(ids = "nl.contract:contract-service:+:stubs", stubsMode = StubRunnerProperties.StubsMode.LOCAL))

对我的消费者进行测试期间

我遇到了以下情况。

我的 CustomDeserializer 类以 base64 格式获取数据,这迫使我首先解码然后反序列化为自定义 java pojo。

Groovy 合同

import org.springframework.cloud.contract.spec.Contract

Contract.make {
    label("trigger")
    input {
        triggeredBy("trigger()")
    }
    outputMessage {
        sentTo('test-topic')        
        body(
                '''{"specversion":"1.0","type":"event-create.0","source":"/contact/service/","datacontenttype":"application/json","data":{"contact":{"naam":"MedeWerker","telefoon":"0612345678","email":"mede.werker@gmail.nl"}}}'''
        )      
    }
}

CustomDeserializer java

..... serialize code left out .....

@Override
    public Deserializer<CloudEventMessage<Contact>> deserializer() {
        return (s, bytes) -> {
            if (bytes == null || bytes.length == 0) {
                return null;
            }
            //remove extra quotes at start and end -> "<json>"
            String s1 = new String(bytes, StandardCharsets.UTF_8).replaceAll("\"", "");
            bytes = Base64.getDecoder().decode(s1);            
            try {
                ObjectMapper mapper = new ObjectMapper();
                return mapper.readValue(bytes, new TypeReference<>() {});
            } catch (final IOException e) {
                throw new RuntimeException(e.getMessage());
            }
        };
    }

所以基本上我通过 groovy 合同(在 stubs.jar 中)发送一个简单的 json。我期待字节到达时没有任何 base64 编码,其次字节包含一个额外的引号“...json..” 我必须删除否则我在 base64 解码期间得到无效字符 22

有关导致此问题的原因以及如何解决此问题的任何想法?

0 个答案:

没有答案