Skip to content

Commit 49e7de0

Browse files
authored
Port to jdk17 and spring 3.0.0 (#1279)
This also allows support of repository methods that return a simple type. i.e. @ScanConsistency(query = QueryScanConsistency.REQUEST_PLUS) @query("SELECT iata, \"\" as __id, 0 as __cas from #{#n1ql.bucket} WHERE #{#n1ql.filter}") List<String> getStrings(); Closes #1278.
1 parent 9f2d7ee commit 49e7de0

25 files changed

+303
-202
lines changed

pom.xml

Lines changed: 30 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2-
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
2+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
34

45
<modelVersion>4.0.0</modelVersion>
56

67
<groupId>org.springframework.data</groupId>
78
<artifactId>spring-data-couchbase</artifactId>
8-
<version>4.3.0-SNAPSHOT</version>
9+
<version>5.0.0-SNAPSHOT</version>
910

1011
<name>Spring Data Couchbase</name>
1112
<description>Spring Data integration for Couchbase</description>
@@ -14,14 +15,17 @@
1415
<parent>
1516
<groupId>org.springframework.data.build</groupId>
1617
<artifactId>spring-data-parent</artifactId>
17-
<version>2.6.0-SNAPSHOT</version>
18+
<version>3.0.0-SNAPSHOT</version>
1819
</parent>
1920

2021
<properties>
21-
<couchbase>3.2.1</couchbase>
22-
<couchbase.osgi>3.2.1</couchbase.osgi>
23-
<springdata.commons>2.6.0-SNAPSHOT</springdata.commons>
22+
<couchbase>3.2.3</couchbase>
23+
<couchbase.osgi>3.2.3</couchbase.osgi>
24+
<springdata.commons>3.0.0-SNAPSHOT</springdata.commons>
2425
<java-module-name>spring.data.couchbase</java-module-name>
26+
<jodatime>2.10.13</jodatime>
27+
<jakarta.validation>3.0.1</jakarta.validation>
28+
<hibernate.validator>7.0.1.Final</hibernate.validator>
2529
</properties>
2630

2731
<dependencyManagement>
@@ -64,6 +68,13 @@
6468
<version>${couchbase}</version>
6569
</dependency>
6670

71+
<!-- CDI -->
72+
<dependency>
73+
<groupId>jakarta.enterprise</groupId>
74+
<artifactId>jakarta.enterprise.cdi-api</artifactId>
75+
<version>3.0.0</version>
76+
</dependency>
77+
6778
<dependency>
6879
<groupId>org.springframework</groupId>
6980
<artifactId>spring-test</artifactId>
@@ -72,9 +83,9 @@
7283
</dependency>
7384

7485
<dependency>
75-
<groupId>org.hibernate</groupId>
86+
<groupId>org.hibernate.validator</groupId>
7687
<artifactId>hibernate-validator</artifactId>
77-
<version>5.3.6.Final</version>
88+
<version>7.0.1.Final</version>
7889
<scope>test</scope>
7990
</dependency>
8091

@@ -112,24 +123,25 @@
112123

113124
<!-- JSR 303 Validation -->
114125
<dependency>
115-
<groupId>javax.validation</groupId>
116-
<artifactId>validation-api</artifactId>
126+
<groupId>jakarta.validation</groupId>
127+
<artifactId>jakarta.validation-api</artifactId>
117128
<version>${validation}</version>
118-
<optional>true</optional>
119129
</dependency>
120130

121131
<dependency>
122-
<groupId>javax.el</groupId>
123-
<artifactId>javax.el-api</artifactId>
124-
<version>3.0.0</version>
125-
<scope>test</scope>
132+
<groupId>jakarta.el</groupId>
133+
<artifactId>jakarta.el-api</artifactId>
134+
<version>4.0.0</version>
135+
<scope>provided</scope>
136+
<optional>true</optional>
126137
</dependency>
127138

128139
<dependency>
129140
<groupId>org.glassfish</groupId>
130-
<artifactId>javax.el</artifactId>
131-
<version>3.0.0</version>
132-
<scope>test</scope>
141+
<artifactId>jakarta.el</artifactId>
142+
<version>4.0.2</version>
143+
<scope>provided</scope>
144+
<optional>true</optional>
133145
</dependency>
134146

135147
<!-- CDI -->
@@ -148,21 +160,6 @@
148160
<scope>test</scope>
149161
</dependency>
150162

151-
<dependency>
152-
<groupId>javax.enterprise</groupId>
153-
<artifactId>cdi-api</artifactId>
154-
<version>${cdi}</version>
155-
<scope>provided</scope>
156-
<optional>true</optional>
157-
</dependency>
158-
159-
<dependency>
160-
<groupId>javax.annotation</groupId>
161-
<artifactId>javax.annotation-api</artifactId>
162-
<version>${javax-annotation-api}</version>
163-
<scope>test</scope>
164-
</dependency>
165-
166163
<dependency>
167164
<groupId>org.apache.openwebbeans</groupId>
168165
<artifactId>openwebbeans-se</artifactId>
@@ -279,17 +276,6 @@
279276
</execution>
280277
</executions>
281278
</plugin>
282-
<plugin>
283-
<groupId>org.apache.maven.plugins</groupId>
284-
<artifactId>maven-jar-plugin</artifactId>
285-
<configuration>
286-
<archive>
287-
<manifestEntries>
288-
<Automatic-Module-Name>${java-module-name}</Automatic-Module-Name>
289-
</manifestEntries>
290-
</archive>
291-
</configuration>
292-
</plugin>
293279
<plugin>
294280
<groupId>org.apache.maven.plugins</groupId>
295281
<artifactId>maven-assembly-plugin</artifactId>

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

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@
1717

1818
package org.springframework.data.couchbase.core;
1919

20+
import java.lang.reflect.InaccessibleObjectException;
21+
import java.util.Map;
22+
import java.util.Set;
23+
2024
import org.slf4j.Logger;
2125
import org.slf4j.LoggerFactory;
2226
import org.springframework.beans.BeansException;
@@ -40,6 +44,7 @@
4044
import org.springframework.data.mapping.context.MappingContext;
4145
import org.springframework.data.mapping.model.ConvertingPropertyAccessor;
4246
import org.springframework.util.Assert;
47+
import org.springframework.util.ClassUtils;
4348

4449
/**
4550
* Internal encode/decode support for CouchbaseTemplate.
@@ -84,7 +89,18 @@ public CouchbaseDocument encodeEntity(final Object entityToEncode) {
8489
public <T> T decodeEntity(String id, String source, long cas, Class<T> entityClass) {
8590
final CouchbaseDocument converted = new CouchbaseDocument(id);
8691
converted.setId(id);
87-
CouchbasePersistentEntity<?> persistentEntity = mappingContext.getRequiredPersistentEntity(entityClass);
92+
CouchbasePersistentEntity persistentEntity = couldBePersistentEntity(entityClass);
93+
94+
if (persistentEntity == null) { // method could return a Long, Boolean, String etc.
95+
// QueryExecutionConverters.unwrapWrapperTypes will recursively unwrap until there is nothing left
96+
// to unwrap. This results in List<String[]> being unwrapped past String[] to String, so this may also be a
97+
// Collection (or Array) of entityClass. We have no way of knowing - so just assume it is what we are told.
98+
// if this is a Collection or array, only the first element will be returned.
99+
Set<Map.Entry<String, Object>> set = ((CouchbaseDocument) translationService.decode(source, converted))
100+
.getContent().entrySet();
101+
return (T) set.iterator().next().getValue();
102+
}
103+
88104
if (cas != 0 && persistentEntity.getVersionProperty() != null) {
89105
converted.put(persistentEntity.getVersionProperty().getName(), cas);
90106
}
@@ -98,6 +114,17 @@ public <T> T decodeEntity(String id, String source, long cas, Class<T> entityCla
98114
N1qlJoinResolver.handleProperties(persistentEntity, accessor, template.reactive(), id);
99115
return accessor.getBean();
100116
}
117+
CouchbasePersistentEntity couldBePersistentEntity(Class<?> entityClass) {
118+
if (ClassUtils.isPrimitiveOrWrapper(entityClass) || entityClass == String.class) {
119+
return null;
120+
}
121+
try {
122+
return mappingContext.getPersistentEntity(entityClass);
123+
} catch (InaccessibleObjectException t) {
124+
125+
}
126+
return null;
127+
}
101128

102129
@Override
103130
public Object applyUpdatedCas(final Object entity, CouchbaseDocument converted, final long cas) {

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

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,10 @@
1818

1919
import reactor.core.publisher.Mono;
2020

21+
import java.lang.reflect.InaccessibleObjectException;
22+
import java.util.Map;
23+
import java.util.Set;
24+
2125
import org.slf4j.Logger;
2226
import org.slf4j.LoggerFactory;
2327
import org.springframework.beans.BeansException;
@@ -42,6 +46,7 @@
4246
import org.springframework.data.mapping.context.MappingContext;
4347
import org.springframework.data.mapping.model.ConvertingPropertyAccessor;
4448
import org.springframework.util.Assert;
49+
import org.springframework.util.ClassUtils;
4550

4651
/**
4752
* Internal encode/decode support for {@link ReactiveCouchbaseTemplate}.
@@ -84,7 +89,19 @@ public <T> Mono<T> decodeEntity(String id, String source, long cas, Class<T> ent
8489
return Mono.fromSupplier(() -> {
8590
final CouchbaseDocument converted = new CouchbaseDocument(id);
8691
converted.setId(id);
87-
CouchbasePersistentEntity<?> persistentEntity = mappingContext.getRequiredPersistentEntity(entityClass);
92+
93+
CouchbasePersistentEntity persistentEntity = couldBePersistentEntity(entityClass);
94+
95+
if (persistentEntity == null) { // method could return a Long, Boolean, String etc.
96+
// QueryExecutionConverters.unwrapWrapperTypes will recursively unwrap until there is nothing left
97+
// to unwrap. This results in List<String[]> being unwrapped past String[] to String, so this may also be a
98+
// Collection (or Array) of entityClass. We have no way of knowing - so just assume it is what we are told.
99+
// if this is a Collection or array, only the first element will be returned.
100+
Set<Map.Entry<String, Object>> set = ((CouchbaseDocument) translationService.decode(source, converted))
101+
.getContent().entrySet();
102+
return (T) set.iterator().next().getValue();
103+
}
104+
88105
if (cas != 0 && persistentEntity.getVersionProperty() != null) {
89106
converted.put(persistentEntity.getVersionProperty().getName(), cas);
90107
}
@@ -100,6 +117,18 @@ public <T> Mono<T> decodeEntity(String id, String source, long cas, Class<T> ent
100117
});
101118
}
102119

120+
CouchbasePersistentEntity couldBePersistentEntity(Class<?> entityClass) {
121+
if (ClassUtils.isPrimitiveOrWrapper(entityClass) || entityClass == String.class) {
122+
return null;
123+
}
124+
try {
125+
return mappingContext.getPersistentEntity(entityClass);
126+
} catch (InaccessibleObjectException t) {
127+
128+
}
129+
return null;
130+
}
131+
103132
@Override
104133
public Mono<Object> applyUpdatedCas(final Object entity, CouchbaseDocument converted, final long cas) {
105134
return Mono.fromSupplier(() -> {

src/main/java/org/springframework/data/couchbase/core/convert/AbstractCouchbaseConverter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
import org.springframework.core.convert.ConversionService;
2323
import org.springframework.core.convert.support.GenericConversionService;
2424
import org.springframework.data.convert.CustomConversions;
25-
import org.springframework.data.convert.EntityInstantiators;
25+
import org.springframework.data.mapping.model.EntityInstantiators;
2626

2727
/**
2828
* An abstract {@link CouchbaseConverter} that provides the basics for the {@link MappingCouchbaseConverter}.

src/main/java/org/springframework/data/couchbase/core/convert/CouchbaseJsr310Converters.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import java.time.LocalTime;
2828
import java.time.Period;
2929
import java.time.ZoneId;
30+
import java.time.ZonedDateTime;
3031
import java.util.ArrayList;
3132
import java.util.Collection;
3233
import java.util.Date;
@@ -71,6 +72,9 @@ private CouchbaseJsr310Converters() {
7172
converters.add(StringToDurationConverter.INSTANCE);
7273
converters.add(PeriodToStringConverter.INSTANCE);
7374
converters.add(StringToPeriodConverter.INSTANCE);
75+
converters.add(ZonedDateTimeToLongConverter.INSTANCE);
76+
converters.add(NumberToZonedDateTimeConverter.INSTANCE);
77+
7478
return converters;
7579
}
7680

@@ -99,6 +103,31 @@ public Long convert(LocalDateTime source) {
99103
}
100104
}
101105

106+
@ReadingConverter
107+
public enum NumberToZonedDateTimeConverter implements Converter<Number, ZonedDateTime> {
108+
109+
INSTANCE;
110+
111+
@Override
112+
public ZonedDateTime convert(Number source) {
113+
return source == null ? null
114+
: ZonedDateTime.ofInstant(DateConverters.SerializedObjectToDateConverter.INSTANCE.convert(source).toInstant(),
115+
systemDefault());
116+
}
117+
}
118+
119+
@WritingConverter
120+
public enum ZonedDateTimeToLongConverter implements Converter<ZonedDateTime, Long> {
121+
122+
INSTANCE;
123+
124+
@Override
125+
public Long convert(ZonedDateTime source) {
126+
return source == null ? null
127+
: DateConverters.DateToLongConverter.INSTANCE.convert(Date.from(source.toInstant()));
128+
}
129+
}
130+
102131
@ReadingConverter
103132
public enum NumberToLocalDateConverter implements Converter<Number, LocalDate> {
104133

src/main/java/org/springframework/data/couchbase/core/convert/MappingCouchbaseConverter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@
3636
import org.springframework.core.convert.support.DefaultConversionService;
3737
import org.springframework.data.annotation.Transient;
3838
import org.springframework.data.convert.CustomConversions;
39-
import org.springframework.data.convert.EntityInstantiator;
4039
import org.springframework.data.couchbase.core.mapping.CouchbaseDocument;
4140
import org.springframework.data.couchbase.core.mapping.CouchbaseList;
4241
import org.springframework.data.couchbase.core.mapping.CouchbaseMappingContext;
@@ -60,6 +59,7 @@
6059
import org.springframework.data.mapping.context.MappingContext;
6160
import org.springframework.data.mapping.model.ConvertingPropertyAccessor;
6261
import org.springframework.data.mapping.model.DefaultSpELExpressionEvaluator;
62+
import org.springframework.data.mapping.model.EntityInstantiator;
6363
import org.springframework.data.mapping.model.ParameterValueProvider;
6464
import org.springframework.data.mapping.model.PersistentEntityParameterValueProvider;
6565
import org.springframework.data.mapping.model.PropertyValueProvider;

src/main/java/org/springframework/data/couchbase/core/mapping/event/ValidatingCouchbaseEventListener.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,13 @@
1818

1919
import java.util.Set;
2020

21-
import javax.validation.ConstraintViolationException;
22-
import javax.validation.Validator;
2321

22+
import jakarta.validation.ConstraintViolationException;
2423
import org.slf4j.Logger;
2524
import org.slf4j.LoggerFactory;
2625
import org.springframework.data.couchbase.core.mapping.CouchbaseDocument;
2726
import org.springframework.util.Assert;
27+
import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;
2828

2929
/**
3030
* javax.validation dependant entities validator. When it is registered as Spring component its automatically invoked
@@ -38,14 +38,14 @@ public class ValidatingCouchbaseEventListener extends AbstractCouchbaseEventList
3838

3939
private static final Logger LOG = LoggerFactory.getLogger(ValidatingCouchbaseEventListener.class);
4040

41-
private final Validator validator;
41+
private final LocalValidatorFactoryBean validator;
4242

4343
/**
4444
* Creates a new {@link ValidatingCouchbaseEventListener} using the given {@link Validator}.
4545
*
4646
* @param validator must not be {@literal null}.
4747
*/
48-
public ValidatingCouchbaseEventListener(Validator validator) {
48+
public ValidatingCouchbaseEventListener(LocalValidatorFactoryBean validator) {
4949
Assert.notNull(validator, "Validator must not be null!");
5050
this.validator = validator;
5151
}

0 commit comments

Comments
 (0)