Spring Boot Camel无法在封送数据期间进行序列化/反序列化

mzmfm0qo  于 2023-03-29  发布在  Spring
关注(0)|答案(1)|浏览(155)

正如我所说的,我创建了这样的路线:

@Component
class AccountantPartnerRouteConfig {

    @Bean
    RoutesBuilder accountantPartnerRoute() {
        return new RouteBuilder() {
            @Override
            public void configure() {
                from(ACCOUNTANT_PARTNER.getInternalQueue())
                        .routeId(ACCOUNTANT_PARTNER.getInternalQueue())
                        .bean(BeanProcessor.of(Function.identity()))
                        .log("Publish partner event, idEvent: ${body.eventUuid}")
                        .marshal()
                        .json(JsonLibrary.Jackson)
                        .to(ACCOUNTANT_PARTNER.getQueue());
            }
        };
    }

}

为了测试的目的,我发送对象:

@Data
@NoArgsConstructor
@AllArgsConstructor
public class BaseEvent {

    private UUID eventUuid = randomUUID();
    private ZonedDateTime eventCreatedDate = ZonedDateTime.now();
}

但是当我试图将事件发送到目标队列时,我收到异常:

2023-02-22 09:29:36.922  INFO [,,] 90471 --- [#1 - seda://accountant-partner] seda:accountant-partner:166 : Publish partner event, idEvent: 60d19eb6-6790-460e-b416-edc5823e2e2a
2023-02-22 09:29:36.931 ERROR [,,] 90471 --- [#1 - seda://accountant-partner] org.apache.camel.processor.errorhandler.DefaultErrorHandler:205 : Failed delivery for (MessageId: 7EB96068202A615-0000000000000001 on ExchangeId: 7EB96068202A615-0000000000000001). Exhausted after delivery attempt: 1 caught: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Java 8 date/time type `java.time.ZonedDateTime` not supported by default: add Module "com.fasterxml.jackson.datatype:jackson-datatype-jsr310" to enable handling (through reference chain: pl.fenige.mms.domain.model.event.PublishEventServiceImpl$Test["eventCreatedDate"])

Message History (source location and message history is disabled)
---------------------------------------------------------------------------------------------------------------------------------------
Source                                   ID                             Processor                                          Elapsed (ms)
                                         seda:accountant-partner/seda:a from[seda://accountant-partner]                         3914961
    ...
                                         seda:accountant-partner/marsha marshal[org.apache.camel.model.dataformat.JsonData            0

Stacktrace
---------------------------------------------------------------------------------------------------------------------------------------

com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Java 8 date/time type `java.time.ZonedDateTime` not supported by default: add Module "com.fasterxml.jackson.datatype:jackson-datatype-jsr310" to enable handling (through reference chain: pl.fenige.mms.domain.model.event.PublishEventServiceImpl$Test["eventCreatedDate"])
    at com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:77)
    at com.fasterxml.jackson.databind.SerializerProvider.reportBadDefinition(SerializerProvider.java:1300)
    at com.fasterxml.jackson.databind.ser.impl.UnsupportedTypeSerializer.serialize(UnsupportedTypeSerializer.java:35)
    at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:728)
    at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:774)
    at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:178)
    at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider._serialize(DefaultSerializerProvider.java:480)
    at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:319)
    at com.fasterxml.jackson.databind.ObjectWriter$Prefetch.serialize(ObjectWriter.java:1518)
    at com.fasterxml.jackson.databind.ObjectWriter._writeValueAndClose(ObjectWriter.java:1219)
    at com.fasterxml.jackson.databind.ObjectWriter.writeValue(ObjectWriter.java:1044)
    at org.apache.camel.component.jackson.AbstractJacksonDataFormat.marshal(AbstractJacksonDataFormat.java:155)
    at org.apache.camel.support.processor.MarshalProcessor.process(MarshalProcessor.java:64)
    at org.apache.camel.processor.errorhandler.RedeliveryErrorHandler$SimpleTask.run(RedeliveryErrorHandler.java:477)
    at org.apache.camel.impl.engine.DefaultReactiveExecutor$Worker.schedule(DefaultReactiveExecutor.java:181)
    at org.apache.camel.impl.engine.DefaultReactiveExecutor.scheduleMain(DefaultReactiveExecutor.java:59)
    at org.apache.camel.processor.Pipeline.process(Pipeline.java:165)
    at org.apache.camel.impl.engine.CamelInternalProcessor.process(CamelInternalProcessor.java:392)
    at org.apache.camel.component.seda.SedaConsumer.sendToConsumers(SedaConsumer.java:269)
    at org.apache.camel.component.seda.SedaConsumer.doRun(SedaConsumer.java:187)
    at org.apache.camel.component.seda.SedaConsumer.run(SedaConsumer.java:130)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
    at java.base/java.lang.Thread.run(Thread.java:833)

2023-02-22 09:29:36.933  WARN [,,] 90471 --- [#1 - seda://accountant-partner] org.apache.camel.component.seda.SedaConsumer:214 : Error processing exchange. Exchange[7EB96068202A615-0000000000000001]. Caused by: [com.fasterxml.jackson.databind.exc.InvalidDefinitionException - Java 8 date/time type `java.time.ZonedDateTime` not supported by default: add Module "com.fasterxml.jackson.datatype:jackson-datatype-jsr310" to enable handling (through reference chain: pl.fenige.mms.domain.model.event.PublishEventServiceImpl$Test["eventCreatedDate"])]

com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Java 8 date/time type `java.time.ZonedDateTime` not supported by default: add Module "com.fasterxml.jackson.datatype:jackson-datatype-jsr310" to enable handling (through reference chain: pl.fenige.mms.domain.model.event.PublishEventServiceImpl$Test["eventCreatedDate"])
    at com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:77)
    at com.fasterxml.jackson.databind.SerializerProvider.reportBadDefinition(SerializerProvider.java:1300)
    at com.fasterxml.jackson.databind.ser.impl.UnsupportedTypeSerializer.serialize(UnsupportedTypeSerializer.java:35)
    at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:728)
    at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:774)
    at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:178)
    at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider._serialize(DefaultSerializerProvider.java:480)
    at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:319)
    at com.fasterxml.jackson.databind.ObjectWriter$Prefetch.serialize(ObjectWriter.java:1518)
    at com.fasterxml.jackson.databind.ObjectWriter._writeValueAndClose(ObjectWriter.java:1219)
    at com.fasterxml.jackson.databind.ObjectWriter.writeValue(ObjectWriter.java:1044)
    at org.apache.camel.component.jackson.AbstractJacksonDataFormat.marshal(AbstractJacksonDataFormat.java:155)
    at org.apache.camel.support.processor.MarshalProcessor.process(MarshalProcessor.java:64)
    at org.apache.camel.processor.errorhandler.RedeliveryErrorHandler$SimpleTask.run(RedeliveryErrorHandler.java:477)
    at org.apache.camel.impl.engine.DefaultReactiveExecutor$Worker.schedule(DefaultReactiveExecutor.java:181)
    at org.apache.camel.impl.engine.DefaultReactiveExecutor.scheduleMain(DefaultReactiveExecutor.java:59)
    at org.apache.camel.processor.Pipeline.process(Pipeline.java:165)
    at org.apache.camel.impl.engine.CamelInternalProcessor.process(CamelInternalProcessor.java:392)
    at org.apache.camel.component.seda.SedaConsumer.sendToConsumers(SedaConsumer.java:269)
    at org.apache.camel.component.seda.SedaConsumer.doRun(SedaConsumer.java:187)
    at org.apache.camel.component.seda.SedaConsumer.run(SedaConsumer.java:130)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
    at java.base/java.lang.Thread.run(Thread.java:833)

看起来缺少工件“com.fasterxml.Jackson.datatype:jackson-datatype-jsr 310”,但它已经添加。
我也尝试过创建类似的bean:

@Bean
    ObjectMapper objectMapper() {
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.registerModule(new JavaTimeModule());
        return objectMapper;
    }

但也无济于事。
有人知道我必须做什么来处理这个ZonedDateTime而不使用自定义序列化器/反序列化器吗?
下面是我的pom.xml(只是没有一些元数据):

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <properties>
        <java.version>17</java.version>
        <flyway.version>8.5.13</flyway.version>
        <lombok.version>1.18.26</lombok.version>
        <querydsl.version>5.0.0</querydsl.version>
        <lombok.version>1.18.26</lombok.version>
        <quartz-scheduler.version>2.3.2</quartz-scheduler.version>
        <spock-groovy.version>2.4-M1-groovy-4.0</spock-groovy.version>
        <spring-cloud.version>2021.0.3</spring-cloud.version>
        <micrometer.version>1.9.1</micrometer.version>
        <logback.version>1.2.9</logback.version>
        <logstash.logback.encoder>5.2</logstash.logback.encoder>
        <sdnotify.version>1.3</sdnotify.version>
        <sentry.version>1.7.30</sentry.version>
        <camel.version>3.20.2</camel.version>
    </properties>
    <dependencies>
        <!--   Spring   -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jdbc</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-sleuth</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
        </dependency>

        <dependency>
            <groupId>org.apache.camel.springboot</groupId>
            <artifactId>camel-spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <!--   Spring   -->

        <!--   Datasource   -->
        <dependency>
            <groupId>org.flywaydb</groupId>
            <artifactId>flyway-core</artifactId>
            <version>${flyway.version}</version>
        </dependency>

        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <scope>runtime</scope>
        </dependency>

        <dependency>
            <groupId>com.querydsl</groupId>
            <artifactId>querydsl-jpa</artifactId>
            <version>${querydsl.version}</version>
        </dependency>

        <dependency>
            <groupId>com.querydsl</groupId>
            <artifactId>querydsl-apt</artifactId>
            <version>${querydsl.version}</version>
            <scope>provided</scope>
        </dependency>
        <!--   Datasource   -->

        <!--   Commons   -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>${lombok.version}</version>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>com.neovisionaries</groupId>
            <artifactId>nv-i18n</artifactId>
            <version>1.29</version>
            <scope>compile</scope>
        </dependency>

        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.9.0</version>
            <scope>compile</scope>
        </dependency>
        <!--   Commons   -->

        <!--   Quartz   -->
        <dependency>
            <groupId>org.quartz-scheduler</groupId>
            <artifactId>quartz</artifactId>
            <version>${quartz-scheduler.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
        </dependency>
        <!--   Quartz   -->

        <!--   Integrations   -->
        <dependency>
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-rabbitmq</artifactId>
            <version>${camel.version}</version>
        </dependency>

        <dependency>
            <groupId>org.apache.camel.springboot</groupId>
            <artifactId>camel-jackson-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>com.fasterxml.jackson.datatype</groupId>
            <artifactId>jackson-datatype-jsr310</artifactId>
        </dependency>
        <!--   Integrations   -->

        <!--   Logback   -->
        <dependency>
            <groupId>io.micrometer</groupId>
            <artifactId>micrometer-registry-prometheus</artifactId>
            <version>${micrometer.version}</version>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-core</artifactId>
            <version>${logback.version}</version>
        </dependency>

        <dependency>
            <groupId>net.logstash.logback</groupId>
            <artifactId>logstash-logback-encoder</artifactId>
            <version>${logstash.logback.encoder}</version>
        </dependency>
        <dependency>
            <groupId>io.sentry</groupId>
            <artifactId>sentry-logback</artifactId>
            <version>${sentry.version}</version>
        </dependency>
        <dependency>
            <groupId>io.sentry</groupId>
            <artifactId>sentry-spring</artifactId>
            <version>${sentry.version}</version>
        </dependency>
        <dependency>
            <groupId>info.faljse</groupId>
            <artifactId>SDNotify</artifactId>
            <version>${sdnotify.version}</version>
        </dependency>
        <!--   Logback   -->

        <!--   Test   -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.spockframework</groupId>
            <artifactId>spock-core</artifactId>
            <version>${spock-groovy.version}</version>
            <scope>test</scope>
        </dependency>
        <!--   Test   -->

    </dependencies>

    <dependencyManagement>
        <dependencies>

            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <dependency>
                <groupId>org.apache.camel.springboot</groupId>
                <artifactId>camel-spring-boot-bom</artifactId>
                <version>${camel.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>

    </dependencyManagement>

    <build>
        <finalName>test</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
            <plugin>
                <groupId>com.mysema.maven</groupId>
                <artifactId>apt-maven-plugin</artifactId>
                <version>1.1.3</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>process</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>target/generated-sources/java</outputDirectory>
                            <processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>3.0.0-M7</version>
                <configuration>
                    <includes>
                        <include>**/*ApiTest*.java</include>
                        <include>**/*Test*.java</include>
                        <include>**/*ItTest*.java</include>
                        <include>**/*UnitTest*.java</include>
                        <include>**/*Spec.java</include>
                        <include>**/*SpecTest.java</include>
                    </includes>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.codehaus.gmavenplus</groupId>
                <artifactId>gmavenplus-plugin</artifactId>
                <version>1.13.1</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>addTestSources</goal>
                            <goal>compile</goal>
                            <goal>compileTests</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <targetBytecode>17</targetBytecode>
                    <testSources>
                        <testSource>
                            <directory>${project.basedir}/src/test</directory>
                            <includes>
                                <include>**/*.groovy</include>
                            </includes>
                        </testSource>
                    </testSources>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>
lymnna71

lymnna711#

我也遇到了同样的问题,我创建了一个ObjectMapper bean,并将camel.dataformat.Jackson.auto-discover-object-mapper=true添加到应用程序属性中。

@Bean
public ObjectMapper objectMapper() {
    return new ObjectMapper().registerModule(new JavaTimeModule());
}

... in application.yaml...

camel:
  dataformat:
    jackson:
      auto-discover-object-mapper: true

该属性在IDEA中标记了一个错误,但它仍然工作。

相关问题