Skip to content

Commit 99a6e7d

Browse files
committed
use spring data domain event.
1 parent 6f3a02c commit 99a6e7d

File tree

8 files changed

+83
-54
lines changed

8 files changed

+83
-54
lines changed

src/main/java/org/springframework/data/ebean/domain/AbstractEntity.java

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,17 @@
1616

1717
package org.springframework.data.ebean.domain;
1818

19+
import java.util.ArrayList;
20+
import java.util.Collection;
21+
import java.util.Collections;
22+
import java.util.List;
1923
import javax.persistence.Id;
2024
import javax.persistence.MappedSuperclass;
2125
import javax.persistence.Transient;
26+
import org.springframework.data.domain.AfterDomainEventPublication;
27+
import org.springframework.data.domain.DomainEvents;
2228
import org.springframework.data.domain.Persistable;
29+
import org.springframework.util.Assert;
2330
import org.springframework.util.ClassUtils;
2431

2532
/**
@@ -32,10 +39,43 @@
3239
public abstract class AbstractEntity implements Persistable<Long> {
3340

3441
private static final long serialVersionUID = -5554308939380869754L;
35-
42+
@Transient
43+
private transient final @org.springframework.data.annotation.Transient
44+
List<Object> domainEvents = new ArrayList<>();
3645
@Id
3746
protected Long id;
3847

48+
/**
49+
* Registers the given event object for publication on a call to a Spring Data repository's save methods.
50+
*
51+
* @param event must not be {@literal null}.
52+
* @return the event that has been added.
53+
*/
54+
protected <T> T registerEvent(T event) {
55+
56+
Assert.notNull(event, "Domain event must not be null!");
57+
58+
this.domainEvents.add(event);
59+
return event;
60+
}
61+
62+
/**
63+
* Clears all domain events currently held. Usually invoked by the infrastructure in place in Spring Data
64+
* repositories.
65+
*/
66+
@AfterDomainEventPublication
67+
protected void clearDomainEvents() {
68+
this.domainEvents.clear();
69+
}
70+
71+
/**
72+
* All domain events currently captured by the aggregate.
73+
*/
74+
@DomainEvents
75+
protected Collection<Object> domainEvents() {
76+
return Collections.unmodifiableList(domainEvents);
77+
}
78+
3979
/*
4080
* (non-Javadoc)
4181
*

src/main/java/org/springframework/data/ebean/domain/AggregateRoot.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,5 +19,5 @@
1919
* Get the String representation of the aggregate's type. Optional. This defaults to the simple name of the
2020
* annotated class.
2121
*/
22-
String type() default "";
22+
String value() default "";
2323
}
Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,15 @@
11
package org.springframework.data.ebean.domain;
22

3-
import java.util.Date;
3+
import org.springframework.context.ApplicationEvent;
44

55
/**
6-
* DomainEvent interface.
7-
*
6+
* Domain event.
87
* @author Xuegui Yuan
98
*/
10-
public interface DomainEvent {
11-
/**
12-
* Occurred date.
13-
*
14-
* @return Occurred date
15-
*/
16-
Date occurredOn();
17-
}
9+
public class DomainEvent extends ApplicationEvent {
10+
11+
public DomainEvent(Object source) {
12+
super(source);
13+
}
14+
15+
}

src/main/java/org/springframework/data/ebean/domain/DomainEventPublisher.java

Lines changed: 0 additions & 30 deletions
This file was deleted.

src/test/java/org/springframework/data/ebean/sample/config/SampleConfig.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import org.springframework.context.annotation.Primary;
1212
import org.springframework.data.ebean.querychannel.EbeanQueryChannelService;
1313
import org.springframework.data.ebean.repository.config.EnableEbeanRepositories;
14+
import org.springframework.data.ebean.sample.domain.UserDomainService;
1415
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
1516
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
1617
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
@@ -70,4 +71,9 @@ public DataSource dataSource() {
7071
public EbeanServer defaultEbeanServer(ServerConfig defaultEbeanServerConfig) {
7172
return EbeanServerFactory.create(defaultEbeanServerConfig);
7273
}
74+
75+
@Bean
76+
public UserDomainService userDomainService() {
77+
return new UserDomainService();
78+
}
7379
}

src/test/java/org/springframework/data/ebean/sample/domain/User.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,15 @@
3434
import lombok.Getter;
3535
import lombok.Setter;
3636
import org.springframework.data.ebean.domain.AbstractAuditableEntity;
37+
import org.springframework.data.ebean.domain.AggregateRoot;
3738

3839
/**
3940
* Domain class representing a person emphasizing the use of {@code AbstractEntity}. No declaration of an id is
4041
* required. The id is typed by the parameterizable superclass.
4142
*
4243
* @author Xuegui Yuan
4344
*/
45+
@AggregateRoot
4446
@Entity
4547
@Table(name = "user")
4648
@Getter
@@ -102,6 +104,8 @@ public User(String firstName, String lastName, String emailAddress, Role... role
102104

103105
public void changeEmail(String emailAddress) {
104106
this.emailAddress = emailAddress;
107+
UserEmailChangedEvent emailChangedEvent = new UserEmailChangedEvent(this);
108+
this.registerEvent(emailChangedEvent);
105109
}
106110

107111
/**
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package org.springframework.data.ebean.sample.domain;
2+
3+
import org.springframework.data.ebean.domain.DomainService;
4+
import org.springframework.scheduling.annotation.Async;
5+
import org.springframework.transaction.event.TransactionalEventListener;
6+
7+
/**
8+
* @author Xuegui Yuan
9+
*/
10+
@DomainService
11+
public class UserDomainService {
12+
13+
@Async
14+
@TransactionalEventListener
15+
public UserEmailChangedEvent handleUserEmailChanged(UserEmailChangedEvent emailChangedEvent) {
16+
System.out.println("UserEmailChangedEvent:" + emailChangedEvent.getSource());
17+
return null;
18+
}
19+
}
Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,14 @@
11
package org.springframework.data.ebean.sample.domain;
22

3-
import java.util.Date;
4-
import lombok.AllArgsConstructor;
53
import lombok.Data;
64
import org.springframework.data.ebean.domain.DomainEvent;
75

86
/**
97
* @author Xuegui Yuan
108
*/
119
@Data
12-
@AllArgsConstructor
13-
public class UserEmailChangedEvent implements DomainEvent {
14-
private Long userId;
15-
private String email;
16-
private Date createdTime;
17-
18-
@Override
19-
public Date occurredOn() {
20-
return createdTime;
10+
public class UserEmailChangedEvent extends DomainEvent {
11+
public UserEmailChangedEvent(Object source) {
12+
super(source);
2113
}
2214
}

0 commit comments

Comments
 (0)