我正在尝试对 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。
有关导致此问题的原因以及如何解决此问题的任何想法?