我正在将Spring Boot从版本2迁移到版本3.

在我以前的实现中,我是以v2.8.4 documentation为基础的,一切都运行得很好.

目前,ListenerUtils.byteArrayToDeserializationException已被删除,我必须使用SerializationUtils.byteArrayToDeserializationException.

对于这一点,我以v3.1.x documentation为基础,但我有问题.

文档中给出的示例,确切地说就是这一部分,不能编译:

DeserializationException deserEx = SerializationUtils.byteArrayToDeserializationException(this.logger,
                    headers.get(i).get(SerializationUtils.VALUE_DESERIALIZER_EXCEPTION_HEADER));

从理论上讲,传递的是一个byte[],但该方法只接受一个头.所以我们需要一个石膏.使用ListenerUtils,我将其转换为byte[].但现在,我强制转换为Header或RecordHeader,我得到以下错误->外来反序列化异常标题被忽略;可能的攻击?类似于以下内容:

DeserializationException exception = SerializationUtils.byteArrayToDeserializationException(
            new LogAccessor(IndexingService.class),
            new RecordHeader(SerializationUtils.KEY_DESERIALIZER_EXCEPTION_HEADER,
                (byte[]) headersOfNullItem.get(SerializationUtils.VALUE_DESERIALIZER_EXCEPTION_HEADER)));

我曾try 创建一个DesializationExceptionHeader,但它是包保护的.

我是不是遗漏了什么?我如何避免这个问题,以便处理反序列化中的错误?

Edit (as Artem Bilan mentioned):

而不是

@Header(KafkaHeaders.BATCH_CONVERTED_HEADERS) List<Map<String, Object>> headers

我用

@Header(KafkaHeaders.BATCH_CONVERTED_HEADERS) Headers headers

我测试它是这样的:

    private byte[] header(DeserializationException deserEx)
        {
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            try
            {
                new ObjectOutputStream(baos).writeObject(deserEx);
            }
            catch (IOException e)
            {
                throw new UncheckedIOException(e);
            }
            return baos.toByteArray();
            }
       }
    
@Test
...
    Headers headers = new RecordHeaders();
    myObjects.forEach(myObject -> headers.add("traceparent", "00-f569e0cc279ef4a0-5d47674154157a2d-01".getBytes(StandardCharsets.UTF_8)));
    myObjects.add(null);
    DeserializationException deserializationException = new DeserializationException("aDeserializationException", null, false, null);
    Header header = new RecordHeader(SerializationUtils.KEY_DESERIALIZER_EXCEPTION_HEADER, header(deserializationException));
    headers.add(header);
    
classUnderTest.myMethod(myObjects, headers)
...

但我仍然收到相同的错误.

此外,当我运行该应用程序时,我收到以下错误:

org.springframework.core.convert.ConverterNotFoundException: No converter found capable of converting from type [java.util.HashMap<?, ?>] to type [@org.springframework.messaging.handler.annotation.Header org.apache.kafka.common.header.Headers]

推荐答案

我发现,给予以下几点是有效的:

List<ConsumerRecord<String, my_object>> my_method()

这与文档中给出的不同,我没有成功地使用它.

Java相关问答推荐

找到允许的最大底片

JsonPath在多个线程中返回错误的值

Java取消任务运行Oracle查询通过JDBC—连接中断,因为SQLSTATE(08006),错误代码(17002)IO错误:套接字读取中断

Jooq外键关系

Jlink选项&-strie-ative-Commands";的作用是什么?

为什么一个Test的instance?& gt;在构造函数中接受非空对象?

在Java中,在单个逻辑行中连接列表和单个元素的正确方法是什么?

如何正确创建序列图?

使用GridBagLayout正确渲染

如何获取Instant#of EpochSecond(?)的最大值

使用UTC时区将startDatetime转换为本地时间

未找到适用于响应类型[类java.io.InputStream]和内容类型[Text/CSV]的HttpMessageConverter

如何将其他属性引用到log4j2 yaml配置中?

Groovy/Java:匹配带引号的命令选项

Android Studio模拟器没有互联网

Java集合:NPE,即使没有添加空值

OAuth:登录后无法查看Google邮箱地址

始终使用Spring Boot连接mongodb上的测试数据库

将Optionals/null安全添加到嵌套的flatMap/流

Hibernate 命名策略导致 Java Spring Boot 应用程序中出现未知列错误