Skip to content

Commit 4a8a6d6

Browse files
committed
DATACOUCH-626 - Handle reading into entity with only all-args constructor; version primative type
The version arg - which is not in the document - will be passed into the constructor as a null which will fail if it is a primitive type. This change will pre-populated the converted object with the version/cas, so that it is not null.
1 parent 3cccf1f commit 4a8a6d6

File tree

4 files changed

+86
-32
lines changed

4 files changed

+86
-32
lines changed

src/main/java/org/springframework/data/couchbase/core/CouchbaseTemplateSupport.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,10 +75,13 @@ public CouchbaseDocument encodeEntity(final Object entityToEncode) {
7575
public <T> T decodeEntity(String id, String source, long cas, Class<T> entityClass) {
7676
final CouchbaseDocument converted = new CouchbaseDocument(id);
7777
converted.setId(id);
78+
CouchbasePersistentEntity<?> persistentEntity = mappingContext.getRequiredPersistentEntity(entityClass);
79+
if (cas != 0 && persistentEntity.getVersionProperty() != null) {
80+
converted.put(persistentEntity.getVersionProperty().getName(), cas);
81+
}
7882

7983
T readEntity = converter.read(entityClass, (CouchbaseDocument) translationService.decode(source, converted));
8084
final ConvertingPropertyAccessor<T> accessor = getPropertyAccessor(readEntity);
81-
CouchbasePersistentEntity<?> persistentEntity = mappingContext.getRequiredPersistentEntity(readEntity.getClass());
8285

8386
if (persistentEntity.getVersionProperty() != null) {
8487
accessor.setProperty(persistentEntity.getVersionProperty(), cas);
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package org.springframework.data.couchbase.domain;
2+
3+
import lombok.EqualsAndHashCode;
4+
import lombok.Getter;
5+
import lombok.ToString;
6+
import org.springframework.data.annotation.Id;
7+
import org.springframework.data.annotation.Version;
8+
import org.springframework.data.couchbase.core.mapping.Document;
9+
import org.springframework.data.couchbase.core.mapping.Field;
10+
import org.springframework.data.couchbase.core.mapping.id.GeneratedValue;
11+
import org.springframework.data.couchbase.core.mapping.id.GenerationStrategy;
12+
13+
@Getter
14+
@ToString
15+
@EqualsAndHashCode
16+
@Document
17+
public class SubscriptionToken {
18+
private @Id
19+
@GeneratedValue(strategy = GenerationStrategy.UNIQUE)
20+
String id;
21+
private @Version
22+
long version;
23+
private @Field
24+
String subscriptionType;
25+
private @Field
26+
String userName;
27+
private @Field
28+
String appId;
29+
private @Field
30+
String deviceId;
31+
private @Field
32+
long subscriptionDate;
33+
34+
public SubscriptionToken(
35+
String id,
36+
long version,
37+
String subscriptionType,
38+
String userName,
39+
String appId,
40+
String deviceId,
41+
long subscriptionDate) {
42+
this.id = id;
43+
this.version = version;
44+
this.subscriptionType = subscriptionType;
45+
this.userName = userName;
46+
this.appId = appId;
47+
this.deviceId = deviceId;
48+
this.subscriptionDate = subscriptionDate;
49+
}
50+
51+
public void setType(String type) {
52+
type = type;
53+
}
54+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package org.springframework.data.couchbase.domain;
2+
3+
import org.springframework.data.repository.PagingAndSortingRepository;
4+
import org.springframework.stereotype.Repository;
5+
6+
7+
/**
8+
* User Repository for tests
9+
*
10+
* @author Michael Nitschinger
11+
* @author Michael Reiche
12+
*/
13+
@Repository
14+
public interface SubscriptionTokenRepository extends PagingAndSortingRepository<SubscriptionToken, String> {
15+
16+
}

src/test/java/org/springframework/data/couchbase/repository/CouchbaseRepositoryKeyValueIntegrationTests.java

Lines changed: 12 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
import static org.junit.jupiter.api.Assertions.*;
2020

2121
import java.util.ArrayList;
22-
import java.util.Arrays;
2322
import java.util.List;
2423
import java.util.Optional;
2524
import java.util.UUID;
@@ -28,14 +27,12 @@
2827
import org.springframework.beans.factory.annotation.Autowired;
2928
import org.springframework.context.annotation.Configuration;
3029
import org.springframework.data.couchbase.config.AbstractCouchbaseConfiguration;
31-
import org.springframework.data.couchbase.domain.Course;
3230
import org.springframework.data.couchbase.domain.Library;
3331
import org.springframework.data.couchbase.domain.LibraryRepository;
34-
import org.springframework.data.couchbase.domain.Submission;
32+
import org.springframework.data.couchbase.domain.SubscriptionToken;
33+
import org.springframework.data.couchbase.domain.SubscriptionTokenRepository;
3534
import org.springframework.data.couchbase.domain.User;
3635
import org.springframework.data.couchbase.domain.UserRepository;
37-
import org.springframework.data.couchbase.domain.UserSubmission;
38-
import org.springframework.data.couchbase.domain.UserSubmissionRepository;
3936
import org.springframework.data.couchbase.repository.config.EnableCouchbaseRepositories;
4037
import org.springframework.data.couchbase.util.ClusterAwareIntegrationTests;
4138
import org.springframework.data.couchbase.util.ClusterType;
@@ -54,7 +51,16 @@ public class CouchbaseRepositoryKeyValueIntegrationTests extends ClusterAwareInt
5451

5552
@Autowired UserRepository userRepository;
5653
@Autowired LibraryRepository libraryRepository;
57-
@Autowired UserSubmissionRepository userSubmissionRepository;
54+
@Autowired SubscriptionTokenRepository subscriptionTokenRepository;
55+
56+
@Test
57+
void subscriptionToken(){
58+
SubscriptionToken st = new SubscriptionToken("id", 0, "type", "Dave Smith",
59+
"app123", "dev123", 0);
60+
st = subscriptionTokenRepository.save(st);
61+
st = subscriptionTokenRepository.findById(st.getId()).get();
62+
assertNotNull(st);
63+
}
5864

5965
@Test
6066
@IgnoreWhen(clusterTypes = ClusterType.MOCKED)
@@ -95,31 +101,6 @@ void saveAndFindByIdWithList() {
95101
assertFalse(userRepository.existsById(library.getId()));
96102
}
97103

98-
@Test
99-
@IgnoreWhen(clusterTypes = ClusterType.MOCKED)
100-
void saveAndFindByWithNestedId() {
101-
UserSubmission user = new UserSubmission();
102-
user.setId(UUID.randomUUID().toString());
103-
user.setSubmissions(
104-
Arrays.asList(new Submission(UUID.randomUUID().toString(), user.getId(), "tid", "status", 123)));
105-
user.setCourses(Arrays.asList(new Course(UUID.randomUUID().toString(), user.getId(), "581")));
106-
107-
// this currently fails when using mocked in integration.properties with status "UNKNOWN"
108-
assertFalse(userRepository.existsById(user.getId()));
109-
110-
userSubmissionRepository.save(user);
111-
112-
Optional<UserSubmission> found = userSubmissionRepository.findById(user.getId());
113-
assertTrue(found.isPresent());
114-
found.ifPresent(u -> assertEquals(user, u));
115-
116-
assertTrue(userRepository.existsById(user.getId()));
117-
assertEquals(user.getSubmissions().get(0).getId(), found.get().getSubmissions().get(0).getId());
118-
assertEquals(user.getCourses().get(0).getId(), found.get().getCourses().get(0).getId());
119-
assertEquals(user, found.get());
120-
userSubmissionRepository.delete(user);
121-
}
122-
123104
@Configuration
124105
@EnableCouchbaseRepositories("org.springframework.data.couchbase")
125106
static class Config extends AbstractCouchbaseConfiguration {

0 commit comments

Comments
 (0)