当前位置: 首页 > 知识库问答 >
问题:

轴突集合识别器型转换器

逄宁
2023-03-14

问题:在聚合状态下,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 );
     }

 }

共有1个答案

袁骏祥
2023-03-14

老实说,你在这件事上已经说得很深了@Zon。我不确定我是否能给你足够的帮助,但无论如何我都会试一试。

研究要点1显然是目前让事情运转起来的最务实的解决方案。如果您要注意到StringUUID相比的“无效性”,那么我就很难理解了。因此,如果这是一个绝对的不不,调查应该继续进行。否则,它当然可以完成工作。

当谈到研究点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,因为它更同步(即错误在命令处理程序中传播)。我们确实了