gpt4 book ai didi

java - Jackson 解析异常-(虽然至少有一个 Creator 存在): no String-argument constructor/factory method to deserialize from String value

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:12:07 25 4
gpt4 key购买 nike

  • Spring Boot 版本:1.5.10
  • jackson 版本:2.9.5
  • Lombok 版本:1.18.0

我有一个使用 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;
}

对于上面的 pojo,我创建了一个单元测试,我在其中传递一个字符串并尝试将其从字符串转换为对象,该对象可以正常工作

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

下面还给出了 jackson 映射器配置。

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 类类型。在我的测试用例中,我放置了记录器语句以查看我收到的值。我可以看到我得到了上面测试用例中提到的完全相同的字符串值。但是在将该文本解析为所需的 MyDummyClass 类型期间,我收到错误(尽管至少存在一个 Creator):没有可从字符串值反序列化的字符串参数构造函数/工厂方法。

@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()));
}

详细错误日志: enter image description here

最佳答案

终于解决了这个问题。这个问题是由于我的发布者代码中编写了错误的代码,首先我通过将输入的有效负载转换为 json 对象(使用 jackson)来加密我的有效负载,后来我再次将该 json 有效负载存储在带有 header 的对象中并尝试将该对象转换为字符串(再次使用 jackson 转换器)。在此过程中,我将整个有效负载转换为字符串两次,因此我将额外的 \r\n 引入了我通过 kafka 发送的有效负载中。从 json 转换回对象时,这个额外的 \r\n 导致了我之前粘贴的问题。

作为解决方案,我将已转换的 json 对象存储到另一个带有 jackson 注释的对象中 @JsonRawData 。这可以防止添加额外的 \r\n

关于java - Jackson 解析异常-(虽然至少有一个 Creator 存在): no String-argument constructor/factory method to deserialize from String value,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50831335/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com