问题:在聚合状态下,Axon SpringBoot应用程序@AggregateIdentifier
类型为UUID
,而PostgreSQL数据库列类型为UUID
。在持久化时,成功地存储了create-commands-identifier。当发送update-command时,警告将上升,并且命令不会传递给聚合处理程序,因为@targetAggregateIdentifier
需要字符串类型,如下Axon所述:
IllegalArgumentException:为类....MyAggregate提供了错误类型的id。需要:类java.util.uuid,得到类java.lang.String
研究:
@Converter
public class UuidJpaConverter implements AttributeConverter<String, UUID> {
@Override
public UUID convertToDatabaseColumn(String uuid) {
return fromString(uuid);
}
@Override
public String convertToEntityAttribute(UUID uuid) {
return uuid.toString();
}
}
...
@Aggregate
@Entity
@IdClass(UuidKey.class)
public class MyAggregate implements Serializable {
@AggregateIdentifier
@Id
private String uuid;
...
}
public class UuidKey implements Serializable {
@Column(name = "uuid", nullable = false, updatable = false)
@Convert(converter = UuidJpaConverter.class)
private String uuid;
}
o.h.engine.jdbc.spi.sqlExceptionHelper:错误:列“uuid”类型为uuid,但表达式类型为bytea
使用Axon标识符转换器,但它需要为每个聚合定制GenericJpaRepository,并且实际上从不在断点上调用identifierConverter处理程序:
@Configuration
public class IdentifierConverter {
@Bean
public GenericJpaRepository<MyAggregate> aggregateJpaRepository(
EntityManagerProvider provider,
@Qualifier("eventBus") EventBus simpleEventBus) {
GenericJpaRepository<MyAggregate> repository = GenericJpaRepository
.builder(MyAggregate.class)
-> .identifierConverter(name -> UUID.fromString(name))
.entityManagerProvider(provider)
.eventBus(simpleEventBus)
.build();
return repository;
}
}
并导致:
final Class<?> aggregateIdentifierType = Stream.of( aggregateType.getDeclaredFields( ) )
.filter( field -> field.isAnnotationPresent( AggregateIdentifier.class ) )
.map( field -> field.getType( ) )
.findFirst( )
.orElseThrow( ( ) -> new IllegalStateException( "The aggregate '" + aggregate + "' does not have an identifier." ) );
aggregateConf.configureRepository(
c -> GenericJpaRepository.builder( aggregateType )
.identifierConverter( string -> {
if ( aggregateType == String.class ) {
return string;
} else {
try {
final ConversionService conversionService = beanFactory.getBean( ConversionService.class );
return conversionService.convert( string, aggregateIdentifierType );
} catch ( final NoSuchBeanDefinitionException ex ) {
throw new IllegalStateException( "Unable to convert String to aggregate identifier of type '" + aggregateIdentifierType.getName( ) + "'. A conversion service is missing." );
}
}
} )
...
@Named
final class MyIdConverter implements Converter<String, MyId> {
...
@Override
public MyId convert( final String source ) {
return MyId.fromString( source );
}
}
老实说,你在这件事上已经说得很深了@Zon。我不确定我是否能给你足够的帮助,但无论如何我都会试一试。
研究要点1显然是目前让事情运转起来的最务实的解决方案。如果您要注意到String
与UUID
相比的“无效性”,那么我就很难理解了。因此,如果这是一个绝对的不不,调查应该继续进行。否则,它当然可以完成工作。
当谈到研究点2和3时,我相信您在PostgreSQL所使用的方言方面遇到了一个问题,尽管我不是100%确定。特别是PostgreSQL展示了几个“很棒”的类型,但这些类型并不总是在所有场景中自动工作。我在这里的“猜测”是基于强制PostgreSQL使用bytea
而不是oid
,以防您希望降低Postgres的TOAST功能。如果您选择将Postgres用于事件存储并希望能够实际查看事件的内容,那么这将变得特别方便。例如,这篇博客文章指定了如何处理这个问题。更重要的是,这篇博客文章展示了如何调整所使用的方言。也许这可以在解决方案2和3中为您服务?
我试图使用带有标签工具的Azure表单识别器来训练和提取图像中的文本。根据留档: 首先,确保所有的培训文档都具有相同的格式。如果您有多种格式的表单,请根据通用格式将它们组织到子文件夹中。当您进行培训时,您需要将应用编程接口引导到子文件夹中。(https://docs.microsoft.com/en-us/azure/cognitive-services/form-recognizer/quick
我不知道如何恰当地问这个问题,但它是这样的: 我在特定事件上开始了传奇,然后我调度命令,该命令应该创建一些聚合,然后发送另一个事件,该事件将由传奇处理,以继续逻辑。 但是,每次我重新启动应用程序时,我都会得到一个错误,说序列x处的聚合事件已经插入,我想这是因为这个传奇还没有完成,当我重新启动它时,它会通过尝试创建新的聚合来再次启动它。 谢谢
问题内容: 假设class 扩展class 。我碰巧知道 只 包含的实例。有什么方法可以将转换为吗? 看来我唯一的选择是遍历集合,一次转换一个元素,创建一个新集合。鉴于类型擦除使得这在运行时完全不必要,这似乎完全浪费了资源。 问题答案: 您可以通过无类型的List界面进行强制转换:
尝试从Web运行示例spring-integration mqtt项目。我已经在根上下文中导入了mqtt-context。部署war之后,我将运行runmqtt.java文件。但会遇到以下问题。如果在独立模式下运行,相同的文件不会产生任何问题。 mqtt-context.xml http://www.springframework.org/schema/integration http://www
问题内容: 问题 与新HashSet(Collection)等效的Scala)相关,如何将Java集合(例如)转换为Scala集合? 我实际上是在尝试将Java API调用转换为Spring的 (返回a )成Scala不可变。因此,例如: 这似乎有效。欢迎批评! 问题答案: 您的最后一条建议有效,但您也可以避免使用: 请注意,默认情况下,由于提供了此功能。
如果用户的注册事件失败,即使命令成功,我们希望为特定的事件处理程序重新运行特定的事件。 我们考虑使用跟踪事件处理器,但这似乎是从一个特定的时间点重播一组事件。然而,在我们的例子中,如果昨天有100个事件,我们只想在中间重新运行一个特定的事件。 目前,我们正在迁移到Axon,因此决定主要使用SubscriptionEventProcessors,因为它更同步(即错误在命令处理程序中传播)。我们确实了