2017-07-19 4 views
0

Je suis encore novice dans le domaine des axones.Implémentation de Snapshot dans AXON 3.0: Le type d'agrégation est inconnu dans ce snapShotter

Je suis en train de mettre en œuvre d'instantanés à l'aide mongodb dans ma demande et je continue à obtenir une erreur en disant

"AbstractSnapshotter: Une tentative de créer et stocker un instantané a donné lieu à une exception sommaire d'exception:. Type d'agrégat est inconnu dans cet instantané: com.myworklife.contacts.domain.contact.Contact "

Ceci est une partie de mon fichier de configuration 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); 
} 

Et mon référentiel.

@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(); 
    } 
} 

Mon agrégat.

@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())); 
    } 
} 

Y at-il quelque chose que je fais mal? .

depuis que je reçois une erreur "Une tentative de créer et de stocker un instantané a donné lieu à une exception sommaire d'exception: Type d'agrégat est inconnue dans ce Snapshotter: com.myworklife.contacts.domain.contact.Contact "

Toute aide sera grandement appréciée.

Merci, Pat

Répondre

0

Vous devez ajouter le contactAggregateFactory au constructeur du AggregateSnapshotter dans la fève Snapshotter:

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

pot 1.depencity

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

2.At d'abord, vous devez configurer votre application.ymp ou bootstrap.yml, comme ceci: spring: data: mongodb: host: localhost port: 27017 database: axonframework events: domainevents snapshots: snapshotevents

3.config votre 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()); 

dépôt 4.config pour votre ensemble, par exemple, i config référentiel d'un élément 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