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 ;
3234import org .springframework .data .couchbase .CouchbaseClientFactory ;
3537import org .springframework .data .couchbase .core .ReactiveCouchbaseTemplate ;
3638import org .springframework .data .couchbase .core .convert .CouchbaseCustomConversions ;
3739import org .springframework .data .couchbase .core .convert .MappingCouchbaseConverter ;
40+ import org .springframework .data .couchbase .core .convert .OtherConverters ;
3841import org .springframework .data .couchbase .core .convert .translation .JacksonTranslationService ;
3942import org .springframework .data .couchbase .core .convert .translation .TranslationService ;
4043import org .springframework .data .couchbase .core .mapping .CouchbaseMappingContext ;
@@ -149,7 +152,9 @@ public ClusterEnvironment couchbaseClusterEnvironment() {
149152 if (!nonShadowedJacksonPresent ()) {
150153 throw new CouchbaseException ("non-shadowed Jackson not present" );
151154 }
152- builder .jsonSerializer (JacksonJsonSerializer .create (couchbaseObjectMapper ()));
155+ CryptoManager cryptoManager = cryptoManager ();
156+ builder .jsonSerializer (JacksonJsonSerializer .create (couchbaseObjectMapper (cryptoManager )));
157+ builder .cryptoManager (cryptoManager );
153158 configureEnvironment (builder );
154159 return builder .build ();
155160 }
@@ -280,8 +285,8 @@ public MappingCouchbaseConverter mappingCouchbaseConverter(CouchbaseMappingConte
280285 @ Bean
281286 public TranslationService couchbaseTranslationService () {
282287 final JacksonTranslationService jacksonTranslationService = new JacksonTranslationService ();
288+ jacksonTranslationService .setObjectMapper (couchbaseObjectMapper (cryptoManager ()));
283289 jacksonTranslationService .afterPropertiesSet ();
284-
285290 // for sdk3, we need to ask the mapper _it_ uses to ignore extra fields...
286291 JacksonTransformers .MAPPER .configure (DeserializationFeature .FAIL_ON_UNKNOWN_PROPERTIES , false );
287292 return jacksonTranslationService ;
@@ -308,10 +313,25 @@ public CouchbaseMappingContext couchbaseMappingContext(CustomConversions customC
308313 */
309314
310315 public ObjectMapper couchbaseObjectMapper () {
311- ObjectMapper mapper = new ObjectMapper ();
316+ return couchbaseObjectMapper (cryptoManager ());
317+ }
318+
319+ /**
320+ * Creates a {@link ObjectMapper} for the jsonSerializer of the ClusterEnvironment
321+ *
322+ * @param cryptoManager
323+ * @return ObjectMapper
324+ */
325+
326+ ObjectMapper mapper ;
327+
328+ public ObjectMapper couchbaseObjectMapper (CryptoManager cryptoManager ) {
329+ if (mapper != null ) {
330+ return mapper ;
331+ }
332+ mapper = new ObjectMapper (); // or use the one from the Java SDK (?) JacksonTransformers.MAPPER
312333 mapper .configure (com .fasterxml .jackson .databind .DeserializationFeature .FAIL_ON_UNKNOWN_PROPERTIES , false );
313334 mapper .registerModule (new JsonValueModule ());
314- CryptoManager cryptoManager = null ;
315335 if (cryptoManager != null ) {
316336 mapper .registerModule (new EncryptionModule (cryptoManager ));
317337 }
@@ -320,7 +340,7 @@ public ObjectMapper couchbaseObjectMapper() {
320340
321341 /**
322342 * The default blocking transaction manager. It is an implementation of CallbackPreferringTransactionManager
323- * CallbackPreferrringTransactionmanagers do not play well with test-cases that rely
343+ * CallbackPreferringTransactionManagers do not play well with test-cases that rely
324344 * on @TestTransaction/@BeforeTransaction/@AfterTransaction
325345 *
326346 * @param clientFactory
@@ -341,6 +361,7 @@ CouchbaseCallbackTransactionManager couchbaseTransactionManager(CouchbaseClientF
341361 TransactionTemplate couchbaseTransactionTemplate (CouchbaseCallbackTransactionManager couchbaseTransactionManager ) {
342362 return new TransactionTemplate (couchbaseTransactionManager );
343363 }
364+
344365 /**
345366 * The default TransactionalOperator.
346367 *
@@ -379,11 +400,28 @@ protected boolean autoIndexCreation() {
379400 * and {@link #couchbaseMappingContext(CustomConversions)}. Returns an empty {@link CustomConversions} instance by
380401 * default.
381402 *
403+ * @param cryptoManagerOptional optional cryptoManager. Make varargs for backwards compatibility.
382404 * @return must not be {@literal null}.
383405 */
384406 @ Bean (name = BeanNames .COUCHBASE_CUSTOM_CONVERSIONS )
385- public CustomConversions customConversions () {
386- return new CouchbaseCustomConversions (Collections .emptyList ());
407+ public CustomConversions customConversions (CryptoManager ... cryptoManagerOptional ) {
408+ assert (cryptoManagerOptional == null || cryptoManagerOptional .length <= 1 );
409+ CryptoManager cryptoManager = cryptoManagerOptional != null && cryptoManagerOptional .length == 1
410+ ? cryptoManagerOptional [0 ]
411+ : null ;
412+ List <GenericConverter > newConverters = new ArrayList ();
413+ // the cryptoConverters take an argument, so they cannot be created in the
414+ // static block of CouchbaseCustomConversions. And they must be set before the super() constructor
415+ // in CouchbaseCustomerConversions
416+ if (cryptoManager != null ) {
417+ newConverters .addAll (OtherConverters .getCryptoConverters (cryptoManager ));
418+ }
419+ return new CouchbaseCustomConversions (newConverters );
420+ }
421+
422+ @ Bean
423+ protected CryptoManager cryptoManager () {
424+ return null ;
387425 }
388426
389427 /**
0 commit comments