Spring 集成 JdbcMessageStore 转换错误

Spring Integration JdbcMessageStore casting error

我正在尝试创建将从远程服务器读取一些数据并使用 Spring 集成处理它们的服务。

我有 class 扩展 ArrayList,因为我需要保留指向其他页面的指针,以便在下一次远程调用时读取它。我设置发布策略来收集所有这些页面,直到没有指向下一页的指针。 这是 class 的定义:

public class CustomList extends ArrayList<DataInfo>
{

    private String nextCursor;

    // Methods omitted for readability
}

一切正常,直到我在聚合器中设置 JdbcMessageStore,这样我才能在服务关闭时保留消息。 我遇到的问题是,在我的发布策略 class 中,我将我的列表 class 投射到相同的 class (因为消息组没有定义类型),引发了这个异常:

java.lang.ClassCastException: com.example.CustomList cannot be cast to com.example.CustomList

这是我的发布攻略class:

@Component
public class CursorReleaseStrategy implements ReleaseStrategy
{
    @Override
    public boolean canRelease(MessageGroup group)
    {
        return group.getMessages().stream()
                .anyMatch(message -> ((CustomList) message.getPayload()).getNextCursor() == null);
    }
}

如果我删除消息存储,一切正常,但问题是我需要消息存储。

我正在使用 spring 引导 2.1.6 和 Spring 集成 DSL 来创建此流程。 根据我的阅读,此错误是由于不同的 class 加载程序而发生的,但这是我在同一个应用程序中执行的。 我还需要配置什么才能让它工作吗_

几乎可以肯定是 class 加载器问题;您可以通过将组件注入 bean 并调用 getClass().getClassLoader().

来找到哪个 class 加载器加载每个组件(消息存储、发布策略)

当应用程序被打包成jar时,出现了这样的错误。 因此,为了解决这个问题,我根据配置文件创建了两个 bean。 例如:

@Profile("!prod")
@Bean
public MessageGroupStore messageStore(DataSource dataSource)
{
    JdbcMessageStore jdbcMessageStore = new JdbcMessageStore(dataSource);
    jdbcMessageStore.setDeserializer(inputStream -> {
        ConfigurableObjectInputStream objectInputStream = new ConfigurableObjectInputStream(inputStream, Thread.currentThread().getContextClassLoader());

        try {
            return (Message<?>) objectInputStream.readObject();

        } catch (ClassNotFoundException var4) {
            throw new NestedIOException("Failed to deserialize object type", var4);
        }
    });
    return jdbcMessageStore;
}

@Profile("prod")
@Bean
public MessageGroupStore prodMessageStore(DataSource dataSource)
{
    return new JdbcMessageStore(dataSource);
}