{"id":1896,"date":"2015-03-03T17:05:20","date_gmt":"2015-03-03T17:05:20","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=1896"},"modified":"2023-09-07T10:12:32","modified_gmt":"2023-09-07T17:12:32","slug":"advanced-spring-data-couchbase","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/advanced-spring-data-couchbase\/","title":{"rendered":"Advanced Spring Data Couchbase"},"content":{"rendered":"<p>In the\u00a0<a href=\"intro-spring-data-couchbase\">previous<\/a>\u00a0<a href=\"storing-timestamped-metrics-in-couchbase-with-spring\">two<\/a>\u00a0posts we looked at getting started with <a href=\"https:\/\/docs.couchbase.com\/sdk-extensions\/spring-data-couchbase.html\">Spring Data Couchbase<\/a>. Now it\u2019s time to get a little more sophisticated (keeping in mind that sophisticated or advanced does not mean more complicated). Let\u2019s look at some of the great stuff you can do like caching, document validation and exposing your repository through a REST API.<\/p>\n<h2 id=\"caching\">Caching<\/h2>\n<p>The Spring core module provides a very nice\u00a0<a href=\"https:\/\/docs.spring.io\/spring\/docs\/current\/spring-framework-reference\/html\/cache.html\">cache abstraction<\/a>\u00a0with support for JSR\u2013107(JCache). Let\u2019s go through an example. To make sure the result of a method is cached, I can simply use the following annotation:<\/p>\n<pre><code>@Cacheable(value = \u201cmyCache\u201d, key = \u201c\u2018cache:\u2019+#param\u201d)\r\npublic Object useALotOfCPUCycles(String param){\r\n\u00a0\u2026.\r\n\u2028}\r\n<\/code><\/pre>\n<p>Here \u201cmyCache\u201d is the name of an existing cache instance I have configured. The key of the document will be resolved using the key regex \u201c\u2018cache:\u2019+#param\u201d, where #param is the method parameter named \u2018param\u2019. This will make sure that for the same parameter, the method will be executed only once. When it\u2019s called in future, the result will be fetched from the cache. Which is to say from Couchbase if I have configured my application appropriately. To define a cache instance, add the following to your configuration:<\/p>\n<pre><code>\u2028@Bean\r\n\u2028CouchbaseCacheManager cacheManager(CouchbaseClient couchbaseClient) throws Exception {\r\n\u2028\u00a0\u00a0\u00a0 HashMap&lt;String, CouchbaseClient&gt; instances = new HashMap&lt;&gt;();\r\n\u2028\u00a0\u00a0\u00a0 instances.put(\u201cmyCache\u201d, couchbaseClient);\r\n\u2028\u00a0\u00a0\u00a0 return new CouchbaseCacheManager(instances);\u2028\r\n}\r\n<\/code><\/pre>\n<p>and the\u00a0<strong>@EnableCaching<\/strong>\u00a0annotation on your configuration class.<\/p>\n<p>If you are already using Spring\u2019s caching system, it is really easy to replace your current storage with Couchbase. Just make sure that the cacheManager you are using is a CouchbaseCacheManager implementation.<\/p>\n<h2 id=\"documentvalidation\">Document Validation<\/h2>\n<p>Field validation is a common task when dealing with business objects. An example would be to make sure that a specified field is not null before storing it into Couchbase, or that a field is not longer than 140 characters. And the good news is this is actually quite easy. I can use Hibernate validation. First thing to do is to add the required dependency to my pom:<\/p>\n<pre><code>\r\n\u00a0 \u00a0 org.hibernate\r\n\u00a0 \u00a0 hibernate-validator\r\n\r\n<\/code><\/pre>\n<p>The next step is to add a ValidationListener bean that will throw a ConstraintViolationException when the object to be stored does not meet the validation requirement:<\/p>\n<pre><code>@Bean\r\n\u2028LocalValidatorFactoryBean validator() {\r\n\u2028\u00a0\u00a0\u00a0 return new LocalValidatorFactoryBean();\u2028\r\n}<\/code><\/pre>\n<p><code>\u2028\u2028@Bean \u2028ValidatingCouchbaseEventListener validationEventListener() { \u2028\u00a0\u00a0\u00a0 return new ValidatingCouchbaseEventListener(validator());\u2028 }<\/code><\/p>\n<p>Now the mandatory configuration is done, I can add any Hibernate validation annotation to my POJO object like this:<\/p>\n<pre><code>@Field @NotNull\r\nprivate String thisFieldShouldNotBeNull;\r\n<\/code><\/pre>\n<p>Now each time my application attempts to save an object where this particularly \u00a0property is set to null I will get a ConstraintViolationException.<\/p>\n<p>There are of course plenty of annotations other than @NotNull. You can find them in the\u00a0<a href=\"https:\/\/docs.spring.io\/spring\/docs\/current\/spring-framework-reference\/html\/validation.html\">Spring documentation<\/a>.<\/p>\n<h2 id=\"exposetherepositorywitharestapi\">Expose the Repository with a REST API<\/h2>\n<p>Having a repository available in such a short amount of time is great, but what is even better is the fact that you can expose it behind a REST API just by adding a dependency. It requires the use of spring-data-rest-webmvc. So I add it to my dependencies like this:<\/p>\n<pre><code>\r\n\u00a0 \u00a0 org.springframework.data\r\n\u00a0 \u00a0 spring-data-rest-webmvc\r\n\r\n<\/code><\/pre>\n<p>And voil\u00e0 (I feel entitled to write voila, you know, because of my French origin). All the objects in this repository are exposed\u00a0<a href=\"https:\/\/projects.spring.io\/spring-hateoas\/\">HATEOAS<\/a>\u00a0style:<\/p>\n<pre><code>caolila:~ ldoguin$ curl -v https:\/\/localhost:8080\/twitterUpdates\r\n{\r\n\u00a0\u201c_embedded\u201d : {\r\n\u00a0\u00a0\u00a0 \u201ctwitterUpdates\u201d : [ {\r\n\u00a0\u00a0\u00a0\u00a0 \u201ccreatedAt\u201d : 1421929099417,\r\n\u00a0\u00a0\u00a0\u00a0 \u201ctype\u201d : \u201ctwitterUpdate\u201d,\r\n\u00a0\u00a0\u00a0\u00a0 \u201caccount\u201d : \u201cCouchbase\u201d,\r\n\u00a0\u00a0\u00a0\u00a0 \u201cfollowers\u201d : 90323,\r\n\u00a0\u00a0\u00a0\u00a0 \u201cfavorites\u201d : 619,\r\n\u00a0\u00a0\u00a0\u00a0 \u201cfriends\u201d : 541,\r\n\u00a0\u00a0\u00a0\u00a0 \u201cstatuses\u201d : 6155,\r\n\u00a0\u00a0\u00a0\u00a0 \u201c_links\u201d : {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u201cself\u201d : {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u201chref\u201d : \u201chttps:\/\/localhost:8080\/twitterUpdates\/tw-couchbase\u20131421929099417\u201d\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0 }, {\r\n\u00a0\u00a0\u00a0\u00a0 \u201ccreatedAt\u201d : 1422314903175,\r\n\u00a0\u00a0\u00a0\u00a0 \u201ctype\u201d : \u201ctwitterUpdate\u201d,\r\n\u00a0\u00a0\u00a0\u00a0 \u201caccount\u201d : \u201cCouchbase\u201d,\r\n\u00a0\u00a0\u00a0\u00a0 \u201cfollowers\u201d : 90285,\r\n\u00a0\u00a0\u00a0\u00a0 \u201cfavorites\u201d : 619,\r\n\u00a0\u00a0\u00a0\u00a0 \u201cfriends\u201d : 542,\r\n\u00a0\u00a0\u00a0\u00a0 \u201cstatuses\u201d : 6207,\r\n\u00a0\u00a0\u00a0\u00a0 \u201c_links\u201d : {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u201cself\u201d : {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u201chref\u201d : \u201chttps:\/\/localhost:8080\/twitterUpdates\/tw-Couchbase\u20131422314903175\u201d\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0 } ]\r\n\u00a0}\r\n<\/code><\/pre>\n<p>Just don\u2019t forget to add getters like I did if you want to see some properties in your JSON documents\u2026<\/p>\n<p>That\u2019s it for this blog post series about Spring Data Couchbase. Please comment and share, tell us if you want more Spring and Couchbase resources, tell us if you use it or want to use it.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In the\u00a0previous\u00a0two\u00a0posts we looked at getting started with Spring Data Couchbase. Now it\u2019s time to get a little more sophisticated (keeping in mind that sophisticated or advanced does not mean more complicated). Let\u2019s look at some of the great stuff [&hellip;]<\/p>\n","protected":false},"author":49,"featured_media":13873,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1],"tags":[1424],"ppma_author":[9023],"class_list":["post-1896","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","tag-spring"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.8 (Yoast SEO v25.8) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Advanced Spring Data Couchbase - The Couchbase Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/advanced-spring-data-couchbase\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Advanced Spring Data Couchbase\" \/>\n<meta property=\"og:description\" content=\"In the\u00a0previous\u00a0two\u00a0posts we looked at getting started with Spring Data Couchbase. Now it\u2019s time to get a little more sophisticated (keeping in mind that sophisticated or advanced does not mean more complicated). Let\u2019s look at some of the great stuff [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/advanced-spring-data-couchbase\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2015-03-03T17:05:20+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-09-07T17:12:32+00:00\" \/>\n<meta name=\"author\" content=\"Laurent Doguin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@ldoguin\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"unstructured.io\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/advanced-spring-data-couchbase\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/advanced-spring-data-couchbase\/\"},\"author\":{\"name\":\"Laurent Doguin\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c0aa9b8f1ed51b7a9e2f7cb755994a5e\"},\"headline\":\"Advanced Spring Data Couchbase\",\"datePublished\":\"2015-03-03T17:05:20+00:00\",\"dateModified\":\"2023-09-07T17:12:32+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/advanced-spring-data-couchbase\/\"},\"wordCount\":528,\"commentCount\":1,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/advanced-spring-data-couchbase\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"keywords\":[\"spring\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/advanced-spring-data-couchbase\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/advanced-spring-data-couchbase\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/advanced-spring-data-couchbase\/\",\"name\":\"Advanced Spring Data Couchbase - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/advanced-spring-data-couchbase\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/advanced-spring-data-couchbase\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2015-03-03T17:05:20+00:00\",\"dateModified\":\"2023-09-07T17:12:32+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/advanced-spring-data-couchbase\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/advanced-spring-data-couchbase\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/advanced-spring-data-couchbase\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"width\":1800,\"height\":630},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/advanced-spring-data-couchbase\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Advanced Spring Data Couchbase\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c0aa9b8f1ed51b7a9e2f7cb755994a5e\",\"name\":\"Laurent Doguin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/12929ce99397769f362b7a90d6b85071\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/b8c466908092b46634af916b6921f30187a051e4367ded7ac9b1a3f2c5692fd2?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/b8c466908092b46634af916b6921f30187a051e4367ded7ac9b1a3f2c5692fd2?s=96&d=mm&r=g\",\"caption\":\"Laurent Doguin\"},\"description\":\"Laurent is a nerdy metal head who lives in Paris. He mostly writes code in Java and structured text in AsciiDoc, and often talks about data, reactive programming and other buzzwordy stuff. He is also a former Developer Advocate for Clever Cloud and Nuxeo where he devoted his time and expertise to helping those communities grow bigger and stronger. He now runs Developer Relations at Couchbase.\",\"sameAs\":[\"https:\/\/x.com\/ldoguin\"],\"honorificPrefix\":\"Mr\",\"birthDate\":\"1985-06-07\",\"gender\":\"male\",\"award\":[\"Devoxx Champion\",\"Couchbase Legend\"],\"knowsAbout\":[\"Java\"],\"knowsLanguage\":[\"English\",\"French\"],\"jobTitle\":\"Director Developer Relation & Strategy\",\"worksFor\":\"Couchbase\",\"url\":\"https:\/\/www.couchbase.com\/blog\/author\/laurent-doguin\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Advanced Spring Data Couchbase - The Couchbase Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/advanced-spring-data-couchbase\/","og_locale":"en_US","og_type":"article","og_title":"Advanced Spring Data Couchbase","og_description":"In the\u00a0previous\u00a0two\u00a0posts we looked at getting started with Spring Data Couchbase. Now it\u2019s time to get a little more sophisticated (keeping in mind that sophisticated or advanced does not mean more complicated). Let\u2019s look at some of the great stuff [&hellip;]","og_url":"https:\/\/www.couchbase.com\/blog\/advanced-spring-data-couchbase\/","og_site_name":"The Couchbase Blog","article_published_time":"2015-03-03T17:05:20+00:00","article_modified_time":"2023-09-07T17:12:32+00:00","author":"Laurent Doguin","twitter_card":"summary_large_image","twitter_creator":"@ldoguin","twitter_misc":{"Written by":"unstructured.io","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/advanced-spring-data-couchbase\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/advanced-spring-data-couchbase\/"},"author":{"name":"Laurent Doguin","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c0aa9b8f1ed51b7a9e2f7cb755994a5e"},"headline":"Advanced Spring Data Couchbase","datePublished":"2015-03-03T17:05:20+00:00","dateModified":"2023-09-07T17:12:32+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/advanced-spring-data-couchbase\/"},"wordCount":528,"commentCount":1,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/advanced-spring-data-couchbase\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","keywords":["spring"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/advanced-spring-data-couchbase\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/advanced-spring-data-couchbase\/","url":"https:\/\/www.couchbase.com\/blog\/advanced-spring-data-couchbase\/","name":"Advanced Spring Data Couchbase - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/advanced-spring-data-couchbase\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/advanced-spring-data-couchbase\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2015-03-03T17:05:20+00:00","dateModified":"2023-09-07T17:12:32+00:00","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/advanced-spring-data-couchbase\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/advanced-spring-data-couchbase\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.couchbase.com\/blog\/advanced-spring-data-couchbase\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","width":1800,"height":630},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/advanced-spring-data-couchbase\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Advanced Spring Data Couchbase"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"The Couchbase Blog","description":"Couchbase, the NoSQL Database","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"The Couchbase Blog","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c0aa9b8f1ed51b7a9e2f7cb755994a5e","name":"Laurent Doguin","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/12929ce99397769f362b7a90d6b85071","url":"https:\/\/secure.gravatar.com\/avatar\/b8c466908092b46634af916b6921f30187a051e4367ded7ac9b1a3f2c5692fd2?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/b8c466908092b46634af916b6921f30187a051e4367ded7ac9b1a3f2c5692fd2?s=96&d=mm&r=g","caption":"Laurent Doguin"},"description":"Laurent is a nerdy metal head who lives in Paris. He mostly writes code in Java and structured text in AsciiDoc, and often talks about data, reactive programming and other buzzwordy stuff. He is also a former Developer Advocate for Clever Cloud and Nuxeo where he devoted his time and expertise to helping those communities grow bigger and stronger. He now runs Developer Relations at Couchbase.","sameAs":["https:\/\/x.com\/ldoguin"],"honorificPrefix":"Mr","birthDate":"1985-06-07","gender":"male","award":["Devoxx Champion","Couchbase Legend"],"knowsAbout":["Java"],"knowsLanguage":["English","French"],"jobTitle":"Director Developer Relation & Strategy","worksFor":"Couchbase","url":"https:\/\/www.couchbase.com\/blog\/author\/laurent-doguin\/"}]}},"authors":[{"term_id":9023,"user_id":49,"is_guest":0,"slug":"laurent-doguin","display_name":"Laurent Doguin","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/b8c466908092b46634af916b6921f30187a051e4367ded7ac9b1a3f2c5692fd2?s=96&d=mm&r=g","author_category":"","last_name":"Doguin","first_name":"Laurent","job_title":"","user_url":"","description":"Laurent is a nerdy metal head who lives in Paris. He mostly writes code in Java and structured text in AsciiDoc, and often talks about data, reactive programming and other buzzwordy stuff. He is also a former Developer Advocate for Clever Cloud and Nuxeo where he devoted his time and expertise to helping those communities grow bigger and stronger. He now runs Developer Relations at Couchbase."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/posts\/1896","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/users\/49"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/comments?post=1896"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/posts\/1896\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/media\/13873"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/media?parent=1896"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/categories?post=1896"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/tags?post=1896"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/ppma_author?post=1896"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}