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);
}
我正在尝试创建将从远程服务器读取一些数据并使用 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()
.
当应用程序被打包成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);
}