{"id":4897,"date":"2012-05-31T10:04:15","date_gmt":"2012-05-31T08:04:15","guid":{"rendered":"http:\/\/blog.orange11.nl\/?p=4897"},"modified":"2012-05-31T10:04:15","modified_gmt":"2012-05-31T08:04:15","slug":"spring-context-configuration-in-magnolia","status":"publish","type":"post","link":"https:\/\/trifork.nl\/blog\/spring-context-configuration-in-magnolia\/","title":{"rendered":"Spring context configuration in Magnolia"},"content":{"rendered":"<p>Here at Trifork we have quite a Magnolia portfolio. We do not only install, configure and host the\u00a0actual CMS itself alone, we also design and implement pixel-perfect designs, and last but certainly not\u00a0least: integrate new or existing business processes from external resources.<\/p>\n<p>When we create any piece of software for such an integration, that software is 90% of the time a Spring\u00a0configured application. For example, when \u00a0we need to load content from an external database into the\u00a0<a title=\"Magnolia Data module\" href=\"http:\/\/documentation.magnolia-cms.com\/modules\/data.html\" target=\"_blank\" rel=\"noopener\">Data module<\/a>, or when we want to create a <a title=\"Magnolia Blossom\" href=\"http:\/\/documentation.magnolia-cms.com\/modules\/blossom.html\" target=\"_blank\" rel=\"noopener\">Blossom dialog<\/a> that renders a select box based on results\u00a0from an external web service. We create these services in a separate abstraction layer, like most of us\u00a0would, so that we end up with a nice separate, reusable and testable module. The services we create are\u00a0usually configured in a number of Spring contexts.<\/p>\n<h3>Loading your contexts in the Magnolia admin central.<\/h3>\n<p>Are you building your own Magnolia modules instead of Magnolia (1)? Are you letting your modules\u00a0configure your Magnolia instance (2)?<br \/>\nIf the answer to both of these questions is yes, and you do a\u00a0fair bit of Spring in your modules, you might want to read on!<\/p>\n<p>(1) <a title=\"Don\u2019t build Magnolia: build your projects.\" href=\"http:\/\/dev.magnolia-cms.com\/~gjoseph\/dont-build-magnolia-build-your-projects\" target=\"_blank\" rel=\"noopener\">Gr\u00e9gory Josephs&#8217;: Don\u2019t build Magnolia: build your projects.<\/a><br \/>\n(2)\u00a0<a title=\"Don\u2019t configure Magnolia: let your projects configure it.\" href=\"http:\/\/dev.magnolia-cms.com\/~gjoseph\/dont-configure-magnolia-let-your-projects-configure-it\" target=\"_blank\" rel=\"noopener\">Gr\u00e9gory Josephs&#8217;: Don\u2019t configure Magnolia: let your projects configure it.<\/a><\/p>\n<p><!--more--><\/p>\n<h2>How would we usually configure such a module<\/h2>\n<p>When you want to enable any kind of Spring in your Magnolia web application, you will probably add Springs&#8217; <em>ContextLoaderListener<\/em> in your <em>web.xml<\/em> and either load all of the contexts directly using the\u00a0<em>contextConfigLocation<\/em> parameter, or perhaps import &#8217;em all in your root application context.<\/p>\n<p>Your regular <em>contextConfigLocation<\/em> looks like the <em>web.xml<\/em> excerpt below. There is nothing new going on here. Just plain old stuff.<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">\n\t...\n\t&lt;context-param&gt;\n\t\t&lt;param-name&gt;contextConfigLocation&lt;\/param-name&gt;\n\t\t&lt;param-value&gt;\/WEB-INF\/applicationContext.xml&lt;\/param-value&gt;\n\t&lt;\/context-param&gt;\n\t&lt;listener&gt;\n\t\t&lt;listener-class&gt;org.springframework.web.context.ContextLoaderListener&lt;\/listener-class&gt;\n\t&lt;\/listener&gt;\n\t&lt;filter&gt;\n\t\t&lt;display-name&gt;Magnolia global filters&lt;\/display-name&gt;\n\t\t&lt;filter-name&gt;magnoliaFilterChain&lt;\/filter-name&gt;\n\t\t&lt;filter-class&gt;info.magnolia.cms.filters.MgnlMainFilter&lt;\/filter-class&gt;\n\t&lt;\/filter&gt;\n\t...\n\t&lt;listener&gt;\n\t\t&lt;listener-class&gt;info.magnolia.cms.servlets.MgnlServletContextListener&lt;\/listener-class&gt;\n\t&lt;\/listener&gt;\n\t...\n<\/pre>\n<p>What is the issue here, you might think? Well, nothing to be quite honest. This works like a charm, and when the <em>ContextLoaderListener<\/em> is placed above the <em>MgnlServletContextListener<\/em>, your services will even be able to access the Magnolia repositories. But when you are creating multiple modules that are reusable in multiple applications, that have multiple contexts, module dependencies etcetera, setting up and maintaining these configurations can become quite a hassle.<\/p>\n<p>In my opinion: when you want to add a module to Magnolia, whatever framework is used, the fact that you will possibly have to update the web.xml, modify any existing contexts to make it work is pretty annoying.\u00a0This approach also does not fit in Greg&#8217;s \u201cDon\u2019t configure Magnolia: let your projects configure it.\u201d principal. It should just work out of the box!<\/p>\n<h2>Ah, Spring in Magnolia you&#8217;re saying? You mean Blossom!!<\/h2>\n<p>This is something that often <em>Springs<\/em> to mind when discussing Magnolia in combination with Spring (no pun intended). <a title=\"Blossom\" href=\"http:\/\/documentation.magnolia-cms.com\/modules\/blossom\/blossom-1-2.html\" target=\"_blank\" rel=\"noopener\"><em>Blossom<\/em><\/a> is a great way of using dynamically generated <a title=\"Creating Blossom Dialog Factories\" href=\"http:\/\/documentation.magnolia-cms.com\/modules\/blossom.html#Dialogs\" target=\"_blank\" rel=\"noopener\"><em>Dialogs<\/em><\/a> and their content validators, <a title=\"Virtual URI mappings for vanity URL's\" href=\"http:\/\/documentation.magnolia-cms.com\/modules\/blossom.html#VirtualURIMappings\" target=\"_blank\" rel=\"noopener\"><em>VirtualURIMappers<\/em><\/a> or <a title=\"Magnolia Components\" href=\"http:\/\/documentation.magnolia-cms.com\/modules\/blossom.html#Components\" target=\"_blank\" rel=\"noopener\"><em>Spring MVC controllers<\/em><\/a> in Magnolia (and much more). But the issue that I want to touch upon is purely the configuration of your Spring contexts in your module.<\/p>\n<p>Usually there is already a <em>ContextLoaderListener<\/em> and root context present in your app. But when we actually want to enable a module like say <a title=\"Install and configure Blossom\" href=\"http:\/\/documentation.magnolia-cms.com\/modules\/blossom\/blossom-1-2.html#GettingStarted\" target=\"_blank\" rel=\"noopener\"><em>Blossom<\/em><\/a> in our existing web application, you guessed it&#8230;, you will perhaps have to edit your web.xml again and add some more contexts to your existing application.<br \/>\nFor each and every module with an own configuration you&#8217;d have to repeat these steps.<\/p>\n<p>So when I am talking about Spring context loading in Magnolia, I really just mean the context loading itself. Either for using Blossom, or some of our own many modules, the integration of the actual context loading and managing the configuration is not very subtle or centralized.<\/p>\n<h2>So then what would the ideal scenario look like?<\/h2>\n<p>Magnolia already has a very neat way of installing, updating and configuring modules. You can register dependencies in the config, or perhaps deltas in your version handler, and perform elaborate update tasks.<br \/>\nWhy not make use of all of these great features and actually take control of Magnolia&#8217;s rich dynamic configuration mechanism. It would be very fancy if one could just create a configuration node in a module, specifying any contexts that need to be loaded. Let the Magnolia <em><a title=\"Magnolia ObservedManager\" href=\"http:\/\/nexus.magnolia-cms.com\/content\/sites\/magnolia.public.sites\/ref\/4.4.6\/apidocs\/index.html?info\/magnolia\/cms\/beans\/config\/ObservedManager.html\" target=\"_blank\" rel=\"noopener\">ObservedManager<\/a><\/em> pick up any values that I set in the config for handling changes runtime. We could also export these configuration nodes, and bootstrap them upon version change. This way the configuration of a module is completely defined in the admincentral.<\/p>\n<p>We at Trifork are using Maven a lot in our projects. With modules like this we would just have to add a dependency to the application, and that&#8217;s it! The contexts are automatically added to the root context.<\/p>\n<p>This is exactly what we did a couple of years ago with our <em><strong>Magnolia\u00a0Spring context configuration module<\/strong><\/em>. Simple is beautiful, as appears in just about every Magnolia adminCentral you open.<\/p>\n<h2>Set up instructions<\/h2>\n<p>The <em><strong>Magnolia\u00a0Spring context configuration module<\/strong><\/em>\u00a0is a maven module that you will have to add to your website&#8217;s pom.xml.\u00a0From that moment on, all your context configurations will be managed inside the Magnolia admin central and not in your webapp structure.<\/p>\n<p>Within the config node of your module, we can specify the spring-contexts and the spring-beans (override-able properties) that this module needs. In the example below, two contexts are loaded: the &#8216;spring-ws-context&#8217; and an &#8216;external-db-context&#8217;. The contexts are expanded to show you the configuration needed for a context.<\/p>\n<p><a href=\"http:\/\/blog.trifork.nl\/wp-content\/uploads\/2012\/05\/context-configuration.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"636\" height=\"297\" class=\" wp-image-5002\" style=\"border: 1px solid black\" title=\"context-configuration\" src=\"http:\/\/blog.trifork.nl\/wp-content\/uploads\/2012\/05\/context-configuration.jpg\" alt=\"\" srcset=\"https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2012\/05\/context-configuration.jpg 636w, https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2012\/05\/context-configuration-300x140.jpg 300w\" sizes=\"auto, (max-width: 636px) 100vw, 636px\" \/><\/a><\/p>\n<ul>\n<li>The <strong>context-path<\/strong> node contains the import path to your context.<\/li>\n<li>The <strong>enabled<\/strong> node, gives you the option of enabling or disabling a context.<br \/>\nThis might be useful for enabling an\u00a0application on an author instance only, or whatever case you might have.<\/li>\n<\/ul>\n<p>If you have any settings that need to be configured, you can put these in the spring-beans folder as\u00a0shown below:<\/p>\n<p><a href=\"http:\/\/blog.trifork.nl\/wp-content\/uploads\/2012\/05\/bean-configuration.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"636\" height=\"297\" class=\"size-full wp-image-5001 \" style=\"border: 1px solid black\" title=\"bean-configuration\" src=\"http:\/\/blog.trifork.nl\/wp-content\/uploads\/2012\/05\/bean-configuration.jpg\" alt=\"\" srcset=\"https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2012\/05\/bean-configuration.jpg 636w, https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2012\/05\/bean-configuration-300x140.jpg 300w\" sizes=\"auto, (max-width: 636px) 100vw, 636px\" \/><\/a>The above configuration creates two String beans in the Spring context. A <em><strong>solrServerUrl<\/strong><\/em> String bean and a <em><strong>wordPressJsonApi<\/strong><\/em> String bean. Set the type column accordingly.<br \/>\nCurrently supported bean types are:<\/p>\n<ul>\n<li><strong>Long \/ Integer<\/strong><\/li>\n<li><strong>String<\/strong><\/li>\n<li><strong>Boolean<\/strong><\/li>\n<\/ul>\n<p>Only these three types are available due to lack of effort by me. You could create brilliant structures to\u00a0configure complete beans with references, lists, maps etc., but these eventually need to be in your\u00a0context, and not in your configuration. This might be a feature for the future, but in the last years, these\u00a0bean types were more than sufficient.<\/p>\n<pre><strong>NOTE:<\/strong> Providing a sample-config node in your module as shown in the illustration,\ncould prove useful to show all of the available properties that are available in\u00a0\nyour config.<\/pre>\n<p>Upon first start up, I usually run into the fact that I forgot to configure my <em>ContextLoaderListener<\/em> all together. But that might be just me.. This would result in the following error in your log:<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nERROR SpringContextLoadingModule: No WebApplicationContext found. The Spring listener must be loaded first in the web.xml, above the Magnolia listener.\n<\/pre>\n<p>When you start up Magnolia after fixing the above and with the configuration in place as discussed earlier, Magnolia will startup clean and you can see the following entries in your log:<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nDEBUG SpringContextLoadingModule: Context configuration 'spring-ws-context' is enabled.\nDEBUG SpringContextLoadingModule: Context configuration 'external-db-context' is enabled.\nINFO  SpringContextLoadingModule: Loaded 2 contexts for my-module\nDEBUG SpringContextLoadingModule: Creating String bean wordPressJsonApi\nDEBUG SpringContextLoadingModule: Creating String bean solrServerUrl\nINFO  SpringContextLoadingModule: Loaded 2 bean definitions for my-module\n<\/pre>\n<p>When your configuration is finished, just export the configuration nodes, add them to your\u00a0VersionHandler that will bootstrap them upon install. You are also free to do some version\u00a0management, like removing old definitions, or renaming or adding new ones to your module.<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\n\tinstallOrUpdateTasks.add(new BootstrapConditionally(\n\t\t\t\t\t&quot;Context config&quot;,\n\t\t\t\t\t&quot;Bootstrap the context configuration for MyModule&quot;,\n\t\t\t\t\t&quot;\/path\/to\/context-config.xml&quot;));\n<\/pre>\n<pre><strong>NOTE:<\/strong> Use the <a title=\"BootstrapConditionally\" href=\"http:\/\/nexus.magnolia-cms.com\/content\/sites\/magnolia.public.sites\/ref\/4.4.6\/apidocs\/index.html?info\/magnolia\/module\/delta\/BootstrapConditionally.html\" target=\"_blank\" rel=\"noopener\">BootstrapConditionally<\/a> task instead of the <a title=\"BootstrapSingleResource\" href=\"http:\/\/nexus.magnolia-cms.com\/content\/sites\/magnolia.public.sites\/ref\/4.4.6\/apidocs\/index.html?info\/magnolia\/module\/delta\/BootstrapSingleResource.html\" target=\"_blank\" rel=\"noopener\">BootstrapSingleResource<\/a>\nfor your spring config folders. You might not want to overwrite any pre-existing\nconfiguration settings.<\/pre>\n<h2>Ok, that&#8217;s what I need. let me put it in my pom to give it a try!<\/h2>\n<p>We are working on a way of sharing our numerous Magnolia modules with you. For now if you are interested in this one, <a href=\"http:\/\/info.trifork.com\/Springdownloadinmagnolia.html\" target=\"_blank\" rel=\"noopener\"><strong>click here, fill out the form<\/strong><\/a> and we will send it to you&#8230;and then you can read this blog and take some action for yourself! Enjoy and remember if you need any help just <a href=\"http:\/\/info.trifork.nl\/Springdownloadinmagnolia.html\" target=\"_blank\" rel=\"noopener\"><strong>contact us<\/strong><\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Here at Trifork we have quite a Magnolia portfolio. We do not only install, configure and host the\u00a0actual CMS itself alone, we also design and implement pixel-perfect designs, and last but certainly not\u00a0least: integrate new or existing business processes from external resources. When we create any piece of software for such an integration, that software [&hellip;]<\/p>\n","protected":false},"author":40,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"content-type":"","footnotes":""},"categories":[31,68,10],"tags":[297,298,69,95],"class_list":["post-4897","post","type-post","status-publish","format-standard","hentry","category-java","category-magnolia","category-development","tag-blossom","tag-magnolia","tag-magnolia-modules","tag-spring-framework"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v24.4 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Spring context configuration in Magnolia - Trifork 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:\/\/trifork.nl\/blog\/spring-context-configuration-in-magnolia\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Spring context configuration in Magnolia - Trifork Blog\" \/>\n<meta property=\"og:description\" content=\"Here at Trifork we have quite a Magnolia portfolio. We do not only install, configure and host the\u00a0actual CMS itself alone, we also design and implement pixel-perfect designs, and last but certainly not\u00a0least: integrate new or existing business processes from external resources. When we create any piece of software for such an integration, that software [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/trifork.nl\/blog\/spring-context-configuration-in-magnolia\/\" \/>\n<meta property=\"og:site_name\" content=\"Trifork Blog\" \/>\n<meta property=\"article:published_time\" content=\"2012-05-31T08:04:15+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/blog.trifork.nl\/wp-content\/uploads\/2012\/05\/context-configuration.jpg\" \/>\n<meta name=\"author\" content=\"Erik Alphenaar\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Erik Alphenaar\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/trifork.nl\/blog\/spring-context-configuration-in-magnolia\/\",\"url\":\"https:\/\/trifork.nl\/blog\/spring-context-configuration-in-magnolia\/\",\"name\":\"Spring context configuration in Magnolia - Trifork Blog\",\"isPartOf\":{\"@id\":\"https:\/\/trifork.nl\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/trifork.nl\/blog\/spring-context-configuration-in-magnolia\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/trifork.nl\/blog\/spring-context-configuration-in-magnolia\/#primaryimage\"},\"thumbnailUrl\":\"http:\/\/blog.trifork.nl\/wp-content\/uploads\/2012\/05\/context-configuration.jpg\",\"datePublished\":\"2012-05-31T08:04:15+00:00\",\"author\":{\"@id\":\"https:\/\/trifork.nl\/blog\/#\/schema\/person\/63f17c99a57ab0e632f09f27214f9466\"},\"breadcrumb\":{\"@id\":\"https:\/\/trifork.nl\/blog\/spring-context-configuration-in-magnolia\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/trifork.nl\/blog\/spring-context-configuration-in-magnolia\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/trifork.nl\/blog\/spring-context-configuration-in-magnolia\/#primaryimage\",\"url\":\"http:\/\/blog.trifork.nl\/wp-content\/uploads\/2012\/05\/context-configuration.jpg\",\"contentUrl\":\"http:\/\/blog.trifork.nl\/wp-content\/uploads\/2012\/05\/context-configuration.jpg\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/trifork.nl\/blog\/spring-context-configuration-in-magnolia\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/trifork.nl\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Spring context configuration in Magnolia\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/trifork.nl\/blog\/#website\",\"url\":\"https:\/\/trifork.nl\/blog\/\",\"name\":\"Trifork Blog\",\"description\":\"Keep updated on the technical solutions Trifork is working on!\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/trifork.nl\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/trifork.nl\/blog\/#\/schema\/person\/63f17c99a57ab0e632f09f27214f9466\",\"name\":\"Erik Alphenaar\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/trifork.nl\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/f9734b3c518fbdb970d63dcea60b331d?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/f9734b3c518fbdb970d63dcea60b331d?s=96&d=mm&r=g\",\"caption\":\"Erik Alphenaar\"},\"url\":\"https:\/\/trifork.nl\/blog\/author\/erika\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Spring context configuration in Magnolia - Trifork 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:\/\/trifork.nl\/blog\/spring-context-configuration-in-magnolia\/","og_locale":"en_US","og_type":"article","og_title":"Spring context configuration in Magnolia - Trifork Blog","og_description":"Here at Trifork we have quite a Magnolia portfolio. We do not only install, configure and host the\u00a0actual CMS itself alone, we also design and implement pixel-perfect designs, and last but certainly not\u00a0least: integrate new or existing business processes from external resources. When we create any piece of software for such an integration, that software [&hellip;]","og_url":"https:\/\/trifork.nl\/blog\/spring-context-configuration-in-magnolia\/","og_site_name":"Trifork Blog","article_published_time":"2012-05-31T08:04:15+00:00","og_image":[{"url":"http:\/\/blog.trifork.nl\/wp-content\/uploads\/2012\/05\/context-configuration.jpg","type":"","width":"","height":""}],"author":"Erik Alphenaar","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Erik Alphenaar","Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/trifork.nl\/blog\/spring-context-configuration-in-magnolia\/","url":"https:\/\/trifork.nl\/blog\/spring-context-configuration-in-magnolia\/","name":"Spring context configuration in Magnolia - Trifork Blog","isPartOf":{"@id":"https:\/\/trifork.nl\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/trifork.nl\/blog\/spring-context-configuration-in-magnolia\/#primaryimage"},"image":{"@id":"https:\/\/trifork.nl\/blog\/spring-context-configuration-in-magnolia\/#primaryimage"},"thumbnailUrl":"http:\/\/blog.trifork.nl\/wp-content\/uploads\/2012\/05\/context-configuration.jpg","datePublished":"2012-05-31T08:04:15+00:00","author":{"@id":"https:\/\/trifork.nl\/blog\/#\/schema\/person\/63f17c99a57ab0e632f09f27214f9466"},"breadcrumb":{"@id":"https:\/\/trifork.nl\/blog\/spring-context-configuration-in-magnolia\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/trifork.nl\/blog\/spring-context-configuration-in-magnolia\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/trifork.nl\/blog\/spring-context-configuration-in-magnolia\/#primaryimage","url":"http:\/\/blog.trifork.nl\/wp-content\/uploads\/2012\/05\/context-configuration.jpg","contentUrl":"http:\/\/blog.trifork.nl\/wp-content\/uploads\/2012\/05\/context-configuration.jpg"},{"@type":"BreadcrumbList","@id":"https:\/\/trifork.nl\/blog\/spring-context-configuration-in-magnolia\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/trifork.nl\/blog\/"},{"@type":"ListItem","position":2,"name":"Spring context configuration in Magnolia"}]},{"@type":"WebSite","@id":"https:\/\/trifork.nl\/blog\/#website","url":"https:\/\/trifork.nl\/blog\/","name":"Trifork Blog","description":"Keep updated on the technical solutions Trifork is working on!","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/trifork.nl\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/trifork.nl\/blog\/#\/schema\/person\/63f17c99a57ab0e632f09f27214f9466","name":"Erik Alphenaar","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/trifork.nl\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/f9734b3c518fbdb970d63dcea60b331d?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/f9734b3c518fbdb970d63dcea60b331d?s=96&d=mm&r=g","caption":"Erik Alphenaar"},"url":"https:\/\/trifork.nl\/blog\/author\/erika\/"}]}},"_links":{"self":[{"href":"https:\/\/trifork.nl\/blog\/wp-json\/wp\/v2\/posts\/4897","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/trifork.nl\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/trifork.nl\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/trifork.nl\/blog\/wp-json\/wp\/v2\/users\/40"}],"replies":[{"embeddable":true,"href":"https:\/\/trifork.nl\/blog\/wp-json\/wp\/v2\/comments?post=4897"}],"version-history":[{"count":0,"href":"https:\/\/trifork.nl\/blog\/wp-json\/wp\/v2\/posts\/4897\/revisions"}],"wp:attachment":[{"href":"https:\/\/trifork.nl\/blog\/wp-json\/wp\/v2\/media?parent=4897"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/trifork.nl\/blog\/wp-json\/wp\/v2\/categories?post=4897"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/trifork.nl\/blog\/wp-json\/wp\/v2\/tags?post=4897"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}