1818
1919import static com .couchbase .client .java .ClusterOptions .clusterOptions ;
2020
21- import java .util .Collections ;
21+ import java .util .ArrayList ;
2222import java .util .HashSet ;
23+ import java .util .List ;
2324import java .util .Set ;
2425
2526import org .springframework .beans .factory .config .BeanDefinition ;
2627import org .springframework .context .annotation .Bean ;
2728import org .springframework .context .annotation .ClassPathScanningCandidateComponentProvider ;
2829import org .springframework .context .annotation .Configuration ;
2930import org .springframework .context .annotation .Role ;
31+ import org .springframework .core .convert .converter .GenericConverter ;
3032import org .springframework .core .type .filter .AnnotationTypeFilter ;
3133import org .springframework .data .convert .CustomConversions ;
34+ import org .springframework .data .convert .PropertyValueConverterRegistrar ;
35+ import org .springframework .data .convert .SimplePropertyValueConversions ;
3236import org .springframework .data .couchbase .CouchbaseClientFactory ;
3337import org .springframework .data .couchbase .SimpleCouchbaseClientFactory ;
3438import org .springframework .data .couchbase .core .CouchbaseTemplate ;
3539import org .springframework .data .couchbase .core .ReactiveCouchbaseTemplate ;
3640import org .springframework .data .couchbase .core .convert .CouchbaseCustomConversions ;
41+ import org .springframework .data .couchbase .core .convert .CouchbasePropertyValueConverterFactory ;
42+ import org .springframework .data .couchbase .core .convert .CryptoConverter ;
3743import org .springframework .data .couchbase .core .convert .MappingCouchbaseConverter ;
3844import org .springframework .data .couchbase .core .convert .translation .JacksonTranslationService ;
3945import org .springframework .data .couchbase .core .convert .translation .TranslationService ;
@@ -149,7 +155,9 @@ public ClusterEnvironment couchbaseClusterEnvironment() {
149155 if (!nonShadowedJacksonPresent ()) {
150156 throw new CouchbaseException ("non-shadowed Jackson not present" );
151157 }
152- builder .jsonSerializer (JacksonJsonSerializer .create (couchbaseObjectMapper ()));
158+ CryptoManager cryptoManager = cryptoManager ();
159+ builder .jsonSerializer (JacksonJsonSerializer .create (couchbaseObjectMapper (cryptoManager )));
160+ builder .cryptoManager (cryptoManager );
153161 configureEnvironment (builder );
154162 return builder .build ();
155163 }
@@ -160,7 +168,6 @@ public ClusterEnvironment couchbaseClusterEnvironment() {
160168 * @param builder the builder that can be customized.
161169 */
162170 protected void configureEnvironment (final ClusterEnvironment .Builder builder ) {
163-
164171 }
165172
166173 @ Bean (name = BeanNames .COUCHBASE_TEMPLATE )
@@ -269,6 +276,7 @@ public MappingCouchbaseConverter mappingCouchbaseConverter(CouchbaseMappingConte
269276 CouchbaseCustomConversions couchbaseCustomConversions ) {
270277 MappingCouchbaseConverter converter = new MappingCouchbaseConverter (couchbaseMappingContext , typeKey ());
271278 converter .setCustomConversions (couchbaseCustomConversions );
279+ couchbaseMappingContext .setSimpleTypeHolder (couchbaseCustomConversions .getSimpleTypeHolder ());
272280 return converter ;
273281 }
274282
@@ -280,8 +288,8 @@ public MappingCouchbaseConverter mappingCouchbaseConverter(CouchbaseMappingConte
280288 @ Bean
281289 public TranslationService couchbaseTranslationService () {
282290 final JacksonTranslationService jacksonTranslationService = new JacksonTranslationService ();
291+ jacksonTranslationService .setObjectMapper (couchbaseObjectMapper (cryptoManager ()));
283292 jacksonTranslationService .afterPropertiesSet ();
284-
285293 // for sdk3, we need to ask the mapper _it_ uses to ignore extra fields...
286294 JacksonTransformers .MAPPER .configure (DeserializationFeature .FAIL_ON_UNKNOWN_PROPERTIES , false );
287295 return jacksonTranslationService ;
@@ -306,12 +314,26 @@ public CouchbaseMappingContext couchbaseMappingContext(CustomConversions customC
306314 *
307315 * @return ObjectMapper
308316 */
317+ private ObjectMapper couchbaseObjectMapper () {
318+ return couchbaseObjectMapper (cryptoManager ());
319+ }
320+
321+ /**
322+ * Creates a {@link ObjectMapper} for the jsonSerializer of the ClusterEnvironment
323+ *
324+ * @param cryptoManager
325+ * @return ObjectMapper
326+ */
309327
310- public ObjectMapper couchbaseObjectMapper () {
311- ObjectMapper mapper = new ObjectMapper ();
328+ ObjectMapper mapper ;
329+
330+ public ObjectMapper couchbaseObjectMapper (CryptoManager cryptoManager ) {
331+ if (mapper != null ) {
332+ return mapper ;
333+ }
334+ mapper = new ObjectMapper (); // or use the one from the Java SDK (?) JacksonTransformers.MAPPER
312335 mapper .configure (com .fasterxml .jackson .databind .DeserializationFeature .FAIL_ON_UNKNOWN_PROPERTIES , false );
313336 mapper .registerModule (new JsonValueModule ());
314- CryptoManager cryptoManager = null ;
315337 if (cryptoManager != null ) {
316338 mapper .registerModule (new EncryptionModule (cryptoManager ));
317339 }
@@ -320,7 +342,7 @@ public ObjectMapper couchbaseObjectMapper() {
320342
321343 /**
322344 * The default blocking transaction manager. It is an implementation of CallbackPreferringTransactionManager
323- * CallbackPreferrringTransactionmanagers do not play well with test-cases that rely
345+ * CallbackPreferringTransactionManagers do not play well with test-cases that rely
324346 * on @TestTransaction/@BeforeTransaction/@AfterTransaction
325347 *
326348 * @param clientFactory
@@ -341,6 +363,7 @@ CouchbaseCallbackTransactionManager couchbaseTransactionManager(CouchbaseClientF
341363 TransactionTemplate couchbaseTransactionTemplate (CouchbaseCallbackTransactionManager couchbaseTransactionManager ) {
342364 return new TransactionTemplate (couchbaseTransactionManager );
343365 }
366+
344367 /**
345368 * The default TransactionalOperator.
346369 *
@@ -376,14 +399,43 @@ protected boolean autoIndexCreation() {
376399 /**
377400 * Register custom Converters in a {@link CustomConversions} object if required. These {@link CustomConversions} will
378401 * be registered with the {@link #mappingCouchbaseConverter(CouchbaseMappingContext, CouchbaseCustomConversions)} )}
379- * and {@link #couchbaseMappingContext(CustomConversions)}. Returns an empty {@link CustomConversions} instance by
380- * default.
402+ * and {@link #couchbaseMappingContext(CustomConversions)}.
381403 *
382404 * @return must not be {@literal null}.
383405 */
384406 @ Bean (name = BeanNames .COUCHBASE_CUSTOM_CONVERSIONS )
385407 public CustomConversions customConversions () {
386- return new CouchbaseCustomConversions (Collections .emptyList ());
408+ return customConversions (cryptoManager ());
409+ }
410+
411+ /**
412+ * Register custom Converters in a {@link CustomConversions} object if required. These {@link CustomConversions} will
413+ * be registered with the {@link #mappingCouchbaseConverter(CouchbaseMappingContext, CouchbaseCustomConversions)} )}
414+ * and {@link #couchbaseMappingContext(CustomConversions)}.
415+ *
416+ * @param cryptoManager
417+ * @return must not be {@literal null}.
418+ */
419+ public CustomConversions customConversions (CryptoManager cryptoManager ) {
420+ List <GenericConverter > newConverters = new ArrayList ();
421+ CustomConversions customConversions = CouchbaseCustomConversions .create (configurationAdapter -> {
422+ SimplePropertyValueConversions valueConversions = new SimplePropertyValueConversions ();
423+ valueConversions .setConverterFactory (new CouchbasePropertyValueConverterFactory (cryptoManager ));
424+ valueConversions .setValueConverterRegistry (new PropertyValueConverterRegistrar ().buildRegistry ());
425+ configurationAdapter .setPropertyValueConversions (valueConversions );
426+ configurationAdapter .registerConverters (newConverters );
427+ });
428+ return customConversions ;
429+ }
430+
431+ @ Bean
432+ protected CryptoManager cryptoManager () {
433+ return null ;
434+ }
435+
436+ @ Bean
437+ protected CryptoConverter cryptoConverter (CryptoManager cryptoManager ) {
438+ return cryptoManager == null ? null : new CryptoConverter (cryptoManager );
387439 }
388440
389441 /**
0 commit comments