我有一个使用Kafka发送有效载荷的场景。在接收到有效载荷时,我试图断言接收者和发送者端的有效载荷是否相同。
首先,我创建了一个类,它将作为有效负载传递。类的结构如下所示。使用的lombok插件版本是1.18.0。
@Builder
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
public class MyDummyClass implements Serializable{
private static final long serialVersionUID = -4181985100899233094L;
private String data;
private String id;
}
@Test
public void shouldBeAbleToConvertStringToDesiredObjectType() throws IOException {
String s = "{\r\n \"data\" : \"foo\",\r\n \"id\" : \"xyz\"\r\n}";
MyDummyClass myDummyClass = convertValue(s, MyDummyClass.class);
assertThat(myDummyClass.getData(), is("foo"));
}
private static final ObjectMapper mapper = new ObjectMapper();
static {
mapper.configure(SerializationFeature.INDENT_OUTPUT, true);
mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
mapper.disable(FAIL_ON_UNKNOWN_PROPERTIES);
mapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
mapper.enable(ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
mapper.configure(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT, true);
mapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);
// Skip the Null Values
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
mapper.disableDefaultTyping();
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); //YYYY-MM-DDThh:mm:ss.sTZD (e.g. 1997-07-16T19:20:30.45.003+01:00)
dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
mapper.setDateFormat(dateFormat);
}
现在来谈主要问题。因此,在我的另一个测试用例中,我通过kafka发送有效负载,在收到来自kafka主题的响应后,我试图将传入的String数据转换为所需的MyDummyClass类类型。在我的测试用例中,我放入了logger语句来查看我收到的值。我可以看到我得到了上面测试用例中提到的完全相同的字符串值。但是在将该文本解析为所需的MyDummyClass类型时,我得到了错误(尽管至少存在一个创建者):没有字符串参数构造函数/工厂方法可以从字符串值反序列化。
@Test
public void messageWithAnyContractObjectCanBeConvertedToSameObjectAtTheListenerEnd() throws InterruptedException, IOException, JSONException {
String correlationID = UUID.randomUUID().toString();
String id = UUID.randomUUID().toString();
MyDummyClass actualPayload = MyDummyClass.builder().data("foo").id("xyz").build();
Message message = MessageBuilder.withAnyMessage()
.withNoHeader(BaseHeader.builder().ID(id).correlationID(correlationID).sendToDestination("my-topic").build())
.payload(actualPayload)
.build();
messagePublisher.publishMessage(message, DEFAULT_PUBLISHER_OPTIONS);
String recordedString = records.poll(10, TimeUnit.SECONDS).value();
LOGGER.info("Receiving Response {}", recordedString);
MyDummyClass recordedValue = convertValue(recordedString, MyDummyClass.class);
assertThat(recordedValue.getData(), is(actualPayload.getData()));
}
最后我终于解决了这个问题。这个问题是在我的发布者代码中编写的错误代码造成的,首先,我通过将我的entried有效负载转换为json对象(使用jackson)来加密我的有效负载,然后,我再次将json有效负载存储在带有header的对象中,并试图将该对象转换为字符串(再次使用jackson转换器)。在这个过程中,我两次将整个有效负载转换为字符串,因此,我在通过Kafka发送的有效负载中引入了额外的\r\n
。当从json到object转换回object时,这个额外的\r\n
导致了我前面粘贴的问题。
作为解决方案,我将已经转换的json对象存储到另一个带有jackson注释@JSONRAWData的对象中。这样可以防止添加额外的\r\n
。
虽然这个问题听起来很简单,但我也在一个非常简单的bean上遇到了这个异常: JSON: 异常: 应用程序: JSON文件位于类路径上。 我尝试过的: 显式Lombok注释关于class
我是Spring DataJPA+REST项目的新手,我正在尝试使用OneToOne单向关系执行从reference EmployerType添加新的或编辑雇主。当我试图添加或编辑数据时,我会得到以下错误: 下面是关于这些课程的信息。 Rest控制器
我使用RestTemplate。exchange在我的Spring Boot应用程序中获得以下响应: 广告商。java: 广告商java: 但我有以下例外: 我不明白为什么id“1057343”不能反序列化。 你能帮忙吗?提前谢谢
我正在尝试反序列化以下JSON: 我已反序列化文件: 在以下对象结构中: 规则efinition.java 定义。爪哇 和JAVA 我得到了以下错误 我看到问题是因为'and-condition-1'只是一个值,我如何反序列化这些,我想知道我应该写一个自定义反序列化器(或者)有什么解决方法吗?
我正在尝试使用RestTemplate(Spring Boot)读取来自rest服务的响应: 但当响应中存在错误数组时: 我不明白为什么没有构造器/工厂方法从字符串值反序列化。 谢谢
问题内容: 使用包中的类时遇到了json解析问题,而我得到的错误是: 发生此问题的Web应用程序是使用AngularJS前端的Spring MVC应用程序,但我可以使用更小的所有Java程序来复制该问题。这是我的豆子: Shipment.java Activity.java ActivityLocation.java 地址.java 这是我可以正确映射json的代码: 调整var中的数据时,遇到了