2017-07-19 52 views
0

我对轴突框架的工作还不熟悉。在AXON 3.0中实现快照:聚合类型在此snapShotter中未知

我想实现我的应用程序使用MongoDB的快照和我不断收到一个错误说

AbstractSnapshotter:尝试创建和存储快照导致异常异常摘要:聚合类型在这个快照中未知:com.myworklife.contacts.domain.contact.Contact

这是我的java配置文件的一部分。

@Bean 
public AggregateSnapshotter snapShotter(EventStore eventStore, AggregateFactory<Contact> contactAggregateFactory) { 
    return new AggregateSnapshotter(eventStore); 
} 


@Bean 
public SnapshotTriggerDefinition snapshotTriggerDefinition(Snapshotter snapShotter) throws Exception { 
    return new EventCountSnapshotTriggerDefinition(snapShotter, 1); 
} 

@Bean 
public EventStore eventStore(EventStorageEngine eventStorageEngine) { 
    return new EmbeddedEventStore(eventStorageEngine); 
} 

@Bean 
public Repository<Contact> contactAggregateRepository(EventStore eventStore, SnapshotTriggerDefinition snapshotTriggerDefinition) { 
    return new ContactRepository(eventStore, snapshotTriggerDefinition); 
} 

而我的存储库。

@Repository("ContactRepository") 
public class ContactRepository extends EventSourcingRepository<Contact> { 

    @Autowired 
    public ContactRepository(EventStore eventStore, SnapshotTriggerDefinition snapshotTriggerDefinition) { 
     super(Contact.class, eventStore, snapshotTriggerDefinition); 
    } 

    public Contact findContact(ContactId contactId) { 
     return load(contactId.toString()).getWrappedAggregate().getAggregateRoot(); 
    } 
} 

我的聚合。

@Aggregate(repository="contactAggregateRepository") 
public class Contact { 

    @AggregateIdentifier 
    private ContactId id; 
    private String name; 
    private String mobileNumber; 

    public Contact() { 
     // do nothing, Axon requires default constructor 
    } 

    @CommandHandler 
    public Contact(CreateContactCommand createContactCommand) { 
     apply(new ContactHasBeenCreatedEvent(createContactCommand.getContactId(), createContactCommand.getName(), 
       createContactCommand.getMobileNumber())); 
    } 
} 

有什么我做错了吗? 。

,因为我得到一个错误说“试图创建和存储快照导致异常异常摘要:聚合类型在这个snapshotter未知:com.myworklife.contacts.domain.contact.Contact

任何帮助将不胜感激。

感谢, 帕特

回答

0

您需要的contactAggregateFactory添加到AggregateSnapshotter的构造函数中snapShotter豆:

@Bean 
public AggregateSnapshotter snapShotter(EventStore eventStore, AggregateFactory<Contact> contactAggregateFactory) { 
    return new AggregateSnapshotter(eventStore, contactAggregateFactory); 
} 
0

1.depencity罐子

<dependency> 
    <groupId>org.axonframework</groupId> 
    <artifactId>axon-spring-boot-autoconfigure</artifactId> 
    <version>${axon.version}</version> 
</dependency> 

2.At首先,您应该配置您的application.ymp或bootstrap.yml,如下所示:spring: data: mongodb: host: localhost port: 27017 database: axonframework events: domainevents snapshots: snapshotevents

3.config您的MongoDB:

@Bean(name = "axonMongoTemplate") 
public MongoTemplate axonMongoTemplate() { 
    MongoTemplate template = new DefaultMongoTemplate(mongoClient(), mongoDbName, eventsCollectionName, snapshotCollectionName); 
    return template; 
} 

@Bean 
public MongoClient mongoClient(){ 
    MongoFactory mongoFactory = new MongoFactory(); 
    mongoFactory.setMongoAddresses(Arrays.asList(new ServerAddress(mongoHost))); 
    return mongoFactory.createMongo(); 
} 

@Bean 
public EventStorageEngine eventStorageEngine(Serializer serializer){ 
    return new MongoEventStorageEngine(
      serializer,null, axonMongoTemplate(), new DocumentPerEventStorageStrategy()); 

为您汇总4.config库,例如,我配置一个元素Aggreaget的仓库

@Configuration 
public class ElementConfiguration { 

    @Autowired 
    private EventStore eventStore; 
    @Bean 
    @Scope("prototype") 
    public Element elementAggregate() { 
     return new Element(); 
    } 

    @Bean 
    public AggregateFactory<Element> elementAggregateAggregateFactory() { 

     SpringPrototypeAggregateFactory<Element> aggregateFactory = new SpringPrototypeAggregateFactory<>(); 
     aggregateFactory.setPrototypeBeanName("elementAggregate"); 
     return aggregateFactory; 
    } 
    @Bean 
    public SpringAggregateSnapshotterFactoryBean springAggregateSnapshotterFactoryBean(){ 

     SpringAggregateSnapshotterFactoryBean factory = new SpringAggregateSnapshotterFactoryBean(); 
     return factory; 
    } 
    @Bean 
    public Repository<Element> elementAggregateRepository(Snapshotter snapshotter) { 

     EventCountSnapshotTriggerDefinition eventCountSnapshotTriggerDefinition = new EventCountSnapshotTriggerDefinition(snapshotter, 3); 


     EventSourcingRepository<Element> repository = new EventSourcingRepository<Element>(
      elementAggregateAggregateFactory(), 
      eventStore, 
      eventCountSnapshotTriggerDefinition 
     ); 
     return repository; 
    } 

5.enjoy