{"id":263,"date":"2018-06-11T21:07:04","date_gmt":"2018-06-11T21:07:04","guid":{"rendered":"http:\/\/www.canchito-dev.com\/public\/blog\/?p=263"},"modified":"2021-05-02T13:46:48","modified_gmt":"2021-05-02T13:46:48","slug":"spring-boot-actuator-production-ready-features","status":"publish","type":"post","link":"https:\/\/www.canchito-dev.com\/public\/blog\/2018\/06\/11\/spring-boot-actuator-production-ready-features\/","title":{"rendered":"Spring Boot Actuator &#8211; Production-ready features"},"content":{"rendered":"<p style=\"text-align: justify;\"><div class=\"perfect-pullquote vcard pullquote-align-full pullquote-border-placement-left\" style=\"font-size:14px !important;\"><blockquote><p style=\"font-size:14px !important;\"><\/p>\n<p style=\"text-align: justify;\">In this post, we\u2019re going to introduce <strong>Spring Boot Actuator<\/strong>, by first covering the basics. Afterwards,\u00a0you will create a Spring project and learn how to use, configure and extend this monitoring tool.<\/p>\n<p style=\"text-align: justify;\"><\/p><\/blockquote><\/div><\/p>\n<div>\n  <a class=\"donate-with-crypto\"\n     href=\"https:\/\/commerce.coinbase.com\/checkout\/faf64f90-2e80-46ee-aeba-0fde14cbeb46\"><br \/>\n    Buy Me a Coffee<br \/>\n  <\/a><br \/>\n  <script src=\"https:\/\/commerce.coinbase.com\/v1\/checkout.js?version=201807\">\n  <\/script>\n<\/div>\n<h1>Contribute Code<\/h1>\n<p>If you would like to become an active contributor to this project please follow these simple steps:<\/p>\n<ol>\n<li>Fork it<\/li>\n<li>Create your feature branch<\/li>\n<li>Commit your changes<\/li>\n<li>Push to the branch<\/li>\n<li>Create new Pull Request<\/li>\n<\/ol>\n<p><strong style=\"font-size: 1rem;\">Source code<\/strong><span style=\"font-size: 1rem;\"> can be downloaded from <\/span><a style=\"font-size: 1rem;\" href=\"https:\/\/github.com\/canchito-dev\/rest-api-with-spring-actuator\" target=\"_blank\" rel=\"noopener noreferrer\">GitHub<\/a><span style=\"font-size: 1rem;\">.<\/span><\/p>\n<h1>What you\u2019ll need<\/h1>\n<ul>\n<li>About 40 minutes<\/li>\n<li>A favorite IDE. In this post, we use:Eclipse IDE for Java DevelopersVersion: Mars.2 Release (4.5.2)<br \/>\nBuild id: 20160218-0600<\/li>\n<li><a href=\"http:\/\/www.oracle.com\/technetwork\/java\/javase\/downloads\/index.html\" target=\"_blank\" rel=\"noopener noreferrer\">JDK 7<\/a>\u00a0or later.\u00a0It can be made to work with JDK6, but it will need configuration tweaks. Please check the Spring Boot documentation<\/li>\n<li>An empty Spring project. You can follow the steps from <a href=\"http:\/\/canchito-dev.com\/public\/blog\/2017\/04\/16\/spring-initializer\/\" target=\"_blank\" rel=\"noopener noreferrer\">here<\/a>.<\/li>\n<\/ul>\n<h1>Introduction<\/h1>\n<p>In this article, we\u2019re going to introduce <strong>Spring Boot Actuator<\/strong>, by first covering the basic and afterwards by learning how to use, configure and extend this monitoring tool.<\/p>\n<p>The current article is based on our previous article <a href=\"http:\/\/www.canchito-dev.com\/public\/blog\/2018\/05\/30\/rest-api-with-spring-jpa-criteria\/\">\u201cREST API with Spring JPA Criteria\u201d<\/a>. Please refer to it, in order to understand how the application was constructed.<\/p>\n<h1>Overview<\/h1>\n<p><strong>Spring Boot<\/strong> is a framework aimed to help developers to easily create and build stand-alone, production-grade Spring based Applications that you can &#8220;just run&#8221;.<\/p>\n<p>In addition, <strong>Spring Boot<\/strong> also comes with a series of additional features designed to help you monitor and manage your applications at the moment they are pushed into production. You can decide whether to manage and monitor them via HTTP endpoints or using JMX.<\/p>\n<p><strong>Spring Boot Actuator<\/strong> is a sub-project of <strong>Spring Boot<\/strong>. <strong>Spring Boot<\/strong> includes several built-in endpoints, and you can also add your own or even configure existing endpoints to be exposed on any custom endpoints of your choice.<\/p>\n<p>For now, we will focus on showing how to use, configure and expose the already available endpoints, and how to configure <strong>Spring Boot Actuator<\/strong> in order to suit your requirements better.<\/p>\n<h1>Definition of Actuator<\/h1>\n<p>An actuator is a manufacturing term that refers to a mechanical device or a component of a machine responsible for moving or controlling a mechanism or system. Actuators can generate a large amount of motion from a small change.<\/p>\n<p>Thanks to the features provided by the actuator, we can easily monitor our app, by gathering metrics, understanding the traffic or the current state of our database.<\/p>\n<p>One of the main advantages of this library is that we can get production ready tools and features without the need of actually developing and implementing them ourselves.<\/p>\n<h1>Enabling Production-ready Features<\/h1>\n<p>Let\u2019s start by enabling the built-in endpoints. To do so, we need to include the\u00a0<a href=\"https:\/\/github.com\/spring-projects\/spring-boot\/tree\/v2.0.2.RELEASE\/spring-boot-project\/spring-boot-actuator\">spring-boot-actuator<\/a>\u00a0module into our project. The simplest way to enable the features is to add the\u00a0<code class=\"EnlighterJSRAW\" data-enlighter-language=\"xml\">spring-boot-starter-actuator<\/code>\u00a0dependency.<\/p>\n<p>So, let\u2019s begin by adding the actuator to our Maven based project. Open the <em>pom.xml<\/em> and add the following XML snipped:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"xml\">&lt;dependencies&gt;\r\n  &lt;dependency&gt;\r\n    &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\r\n    &lt;artifactId&gt;spring-boot-starter-actuator&lt;\/artifactId&gt;\r\n  &lt;\/dependency&gt;\r\n&lt;\/dependencies&gt;<\/pre>\n<p>Take into consideration that, most endpoints are sensitive \u2013 meaning they\u2019re not fully public. Due to this, most information will be omitted. How to handle these sensitive endpoints is explained later in this article.<\/p>\n<h1>Endpoints<\/h1>\n<p>Throw the endpoints, you can easily monitor and interact with your application. There are several built-in endpoints included within <strong>Spring Boot<\/strong>. But you are not limited to them, you can easily develop and implement your own.<\/p>\n<p>Each individual endpoint can be enabled or disabled. Thus, allowing you to control which endpoint is created and consequently exposed. Exposing means making and endpoint remotely accessible via HTTP or JMX.<\/p>\n<p>For our purpose, we will expose endpoints via HTTP, where the ID of the endpoint along with a prefix of\u00a0<code class=\"EnlighterJSRAW\" data-enlighter-language=\"html\">\/actuator<\/code>\u00a0is mapped to a URL.<\/p>\n<h1>So far\u2026<\/h1>\n<p>Until this moment, we have included the <a href=\"https:\/\/github.com\/spring-projects\/spring-boot\/tree\/v2.0.2.RELEASE\/spring-boot-project\/spring-boot-actuator\">spring-boot-actuator<\/a>\u00a0module into our <em>pom.xml<\/em> file. So let\u2019s execute our project and test the actuator\u2019s endpoint with the help of <a href=\"https:\/\/curl.haxx.se\/\">curl<\/a> or <a href=\"https:\/\/www.getpostman.com\/\">Postman<\/a>:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"html\">http:\/\/localhost:8080\/actuator<\/pre>\n<p>In the response body you should see something like this:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"json\">{\r\n    \"_links\": {\r\n        \"self\": {\r\n            \"href\": \"http:\/\/localhost:8080\/actuator\",\r\n            \"templated\": false\r\n        },\r\n        \"health\": {\r\n            \"href\": \"http:\/\/localhost:8080\/actuator\/health\",\r\n            \"templated\": false\r\n        },\r\n        \"info\": {\r\n            \"href\": \"http:\/\/localhost:8080\/actuator\/info\",\r\n            \"templated\": false\r\n        }\r\n    }\r\n}<\/pre>\n<p>This shows us an overview of the exposed actuator endpoints. As you can see, only three actuator endpoints are exposed by default.<\/p>\n<p>The <em>url<\/em> we just tested is known as the <em>\u201cdiscovery page\u201d<\/em>, and it includes links to all the available endpoints.<\/p>\n<p>Here is a brief description of the out-of-the-box endpoints:<\/p>\n<ul>\n<li><code class=\"EnlighterJSRAW\" data-enlighter-language=\"html\">\/health<\/code>: Shows application health information (a simple \u2018status\u2019 when accessed over an unauthenticated connection or full message details when authenticated); it\u2019s not sensitive by default.<\/li>\n<li><code class=\"EnlighterJSRAW\" data-enlighter-language=\"html\">\/info:<\/code> Displays arbitrary application info; not sensitive by default. Please refer to <a href=\"#_Configuring_\/info_Endpoint\">Configuring <code class=\"EnlighterJSRAW\" data-enlighter-language=\"html\">\/info<\/code> Endpoint<\/a> section for customizing this endpoint.<\/li>\n<\/ul>\n<h1>Enabling Endpoints<\/h1>\n<p>By default, all endpoints except for\u00a0<code class=\"EnlighterJSRAW\" data-enlighter-language=\"html\">\/shutdown\u00a0<\/code>are enabled. To configure the enablement of an endpoint, use its\u00a0<code class=\"EnlighterJSRAW\" data-enlighter-language=\"ini\">management.endpoint.&lt;id&gt;.enabled<\/code>\u00a0property.<\/p>\n<p>If you prefer endpoint enablement to be opt-in rather than opt-out, set the\u00a0<code class=\"EnlighterJSRAW\" data-enlighter-language=\"ini\">management.endpoints.enabled-by-default<\/code>\u00a0property to\u00a0<code class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\">false\u00a0<\/code>and use individual endpoint\u00a0<code class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\">enabled\u00a0<\/code>properties to opt back in. The following example enables the <code class=\"EnlighterJSRAW\" data-enlighter-language=\"html\">\/info<\/code>\u00a0endpoint and disables all other endpoints:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"ini\">management.endpoints.enabled-by-default=false\r\nmanagement.endpoint.info.enabled=true<\/pre>\n<p>For a complete list of available endpoints, please refer to <a href=\"https:\/\/docs.spring.io\/spring-boot\/docs\/current-SNAPSHOT\/reference\/htmlsingle\/#production-ready-endpoints-exposing-endpoints\">Spring Boot\u2019s official documentation<\/a>.<\/p>\n<h1>Configuring <code class=\"EnlighterJSRAW\" data-enlighter-language=\"html\">\/info<\/code> Endpoint<\/h1>\n<p>As we have already said, <code class=\"EnlighterJSRAW\" data-enlighter-language=\"html\">\/info<\/code> endpoint displays arbitrary application information; not sensitive by default. But this information has to be provided to the endpoint.<\/p>\n<p>This can be done by setting\u00a0<code class=\"EnlighterJSRAW\" data-enlighter-language=\"ini\">info.*<\/code>\u00a0in <strong>Spring<\/strong>\u2019s <em>application.properties<\/em> file or rather than hardcoding those values, you could also expand info properties at build time, or the option I like the most, by automatically expanding the property using <strong>Maven<\/strong>.<\/p>\n<p>So, open <em>pom.xml<\/em> your file and paste the following:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"xml\">&lt;plugin&gt;\r\n  &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\r\n  &lt;artifactId&gt;spring-boot-maven-plugin&lt;\/artifactId&gt;\r\n  &lt;configuration&gt;\r\n    &lt;additionalProperties&gt;\r\n      &lt;encoding.source&gt;UTF-8&lt;\/encoding.source&gt;\r\n      &lt;encoding.reporting&gt;UTF-8&lt;\/encoding.reporting&gt;\r\n      &lt;java.source&gt;${maven.compiler.source}&lt;\/java.source&gt;\r\n      &lt;java.target&gt;${maven.compiler.target}&lt;\/java.target&gt;\r\n    &lt;\/additionalProperties&gt;\r\n  &lt;\/configuration&gt;\r\n  &lt;executions&gt;\r\n    &lt;execution&gt;\r\n      &lt;goals&gt;\r\n        &lt;goal&gt;build-info&lt;\/goal&gt;\r\n      &lt;\/goals&gt;\r\n    &lt;\/execution&gt;\r\n  &lt;\/executions&gt;\r\n&lt;\/plugin&gt;<\/pre>\n<p>If you call the <code class=\"EnlighterJSRAW\" data-enlighter-language=\"html\">\/info<\/code> endpoint with the help of <a href=\"https:\/\/curl.haxx.se\/\">curl<\/a> or <a href=\"https:\/\/www.getpostman.com\/\">Postman<\/a>:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"html\">http:\/\/localhost:8080\/actuator\/info<\/pre>\n<p>In the response body you should see something like this:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"json\">{\r\n    \"build\": {\r\n        \"name\": \"rest-api-actuator\",\r\n        \"time\": \"2018-06-10T17:16:04.892Z\",\r\n        \"java\": {\r\n            \"target\": \"1.8\",\r\n            \"source\": \"1.8\"\r\n        },\r\n        \"encoding\": {\r\n            \"source\": \"UTF-8\",\r\n            \"reporting\": \"UTF-8\"\r\n        },\r\n        \"version\": \"0.0.1-SNAPSHOT\",\r\n        \"group\": \"com.canchitodev.example\",\r\n        \"artifact\": \"rest-api-actuator\"\r\n    }\r\n}<\/pre>\n<h1>Secure the Endpoints<\/h1>\n<p>For obvious reasons, we do not want this information exposed by actuator\u2019s endpoints to be accessible by everyone. In that case, we can secure the actuator endpoints by adding <strong>Spring Boot Security<\/strong> to the <em>pom.xml<\/em> file:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"xml\">&lt;dependency&gt;\r\n  &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\r\n  &lt;artifactId&gt;spring-boot-starter-security&lt;\/artifactId&gt;\r\n&lt;\/dependency&gt;<\/pre>\n<p>If you execute the application, you will notice in the console the following line:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"ini\">Using generated security password: 88283e85-3dfb-4baf-bc24-cc8222fd1ac6<\/pre>\n<p>From this moment on, you have to use <em>Basic Authentication<\/em> to gain access to not only the actuator\u2019s endpoints, but to any exposed endpoint. The default user account is <em>user<\/em>.<\/p>\n<p>You can modify this behavior by adding the following options in <em>application.properties<\/em> the file:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"ini\">spring.security.user.name=user # Default user name.\r\nspring.security.user.password= # Password for the default user name.\r\nspring.security.user.roles= # Granted roles for the default user name.<\/pre>\n<p>And to complement it, include this <strong><em><code class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">@Configuration<\/code><\/em><\/strong>:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">@Configuration\r\npublic static class ActuatorWebSecurityConfigurationAdapter extends WebSecurityConfigurerAdapter {\r\n  protected void configure(HttpSecurity http) throws Exception {\r\n    http.requestMatcher(EndpointRequest.toAnyEndpoint()).authorizeRequests()\r\n      .anyRequest().hasRole(\"ACTUATOR\")\r\n      .and()\r\n      .httpBasic();\r\n  }\r\n}<\/pre>\n<p>Please note that we have set up the role as <code>\u201cACTUATOR\u201d<\/code>. This is the same role specified in the spring.security.user.roles\u00a0 property.<\/p>\n<p>Remember that all the built-in endpoints except\u00a0<code class=\"EnlighterJSRAW\" data-enlighter-language=\"html\">\/info<\/code>\u00a0are sensitive by default. By using <strong>Spring Boot Security<\/strong>, we can secure these endpoints by defining the default security properties \u2013 username, password, and role \u2013 in the <em>application.properties<\/em> file.<\/p>\n<h1>Further Customization<\/h1>\n<p>To further secure you application, you might decide to expose the actuator endpoints over por different than the standard one. The following properties restrict where the endpoints can be accessed from over the network:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"ini\">management.server.port= # Management endpoint HTTP port (uses the same port as the application by default). Configure a different port to use management-specific SSL.<\/pre>\n<p>You can even change the IP from which the actuator\u2019s endpoints can be accessed, simply by modifying the following properties:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"ini\">management.server.address= # Network address to which the management endpoints should bind. Requires a custom management.server.port.<\/pre>\n<h1>Exposing Endpoints<\/h1>\n<p>Before exposing any endpoint, give it a hard though, as they might contain sensitive information which should not be exposed at all. You can use the technology-specific\u00a0<code class=\"EnlighterJSRAW\" data-enlighter-language=\"html\">include\u00a0<\/code>and\u00a0<code class=\"EnlighterJSRAW\" data-enlighter-language=\"html\">exclude\u00a0<\/code>properties to change which endpoints are exposed:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"ini\">management.endpoints.web.exposure.include= # Endpoint IDs that should be included or '*' for all.\r\nmanagement.endpoints.web.exposure.exclude= # Endpoint IDs that should be excluded.<\/pre>\n<p>The endpoints that are exposed are listed in the <code class=\"EnlighterJSRAW\" data-enlighter-language=\"html\">include<\/code>. While the endpoints of those which should not be exposed, are listed in the <code class=\"EnlighterJSRAW\" data-enlighter-language=\"html\">exclude<\/code> property. The exclude property takes precedence over the <code class=\"EnlighterJSRAW\" data-enlighter-language=\"html\">include<\/code> property. Both <code class=\"EnlighterJSRAW\" data-enlighter-language=\"html\">include<\/code> and <code class=\"EnlighterJSRAW\" data-enlighter-language=\"html\">exclude<\/code> properties can be configured with a list of endpoint IDs.<\/p>\n<h1>The <code class=\"EnlighterJSRAW\" data-enlighter-language=\"html\">\/health<\/code> Endpoint<\/h1>\n<p>The <code class=\"EnlighterJSRAW\" data-enlighter-language=\"html\">\/health<\/code> endpoint is useful to check the current status of your running application. It is commonly used together with any monitoring software to alert when a production system goes down. The information exposed by the<code class=\"EnlighterJSRAW\" data-enlighter-language=\"html\"> \/health<\/code> endpoint depends on the <code class=\"EnlighterJSRAW\" data-enlighter-language=\"ini\">management.endpoint.health.show-details<\/code> property.<\/p>\n<p>There is a very complete list of health indicators that can be used. Please refer to section <a href=\"https:\/\/docs.spring.io\/spring-boot\/docs\/current-SNAPSHOT\/reference\/htmlsingle\/#_auto_configured_healthindicators\">Auto-configured HealthIndicators<\/a> found in <strong>Spring Boot<\/strong>\u2019s official documentation.<\/p>\n<h1>Summary<\/h1>\n<p>The presented implementation of <strong>Spring Boot Actuator<\/strong> is simple, but yet very powerful, as it exposes a lot of endpoints that as useful for monitoring system running under a production environment.<\/p>\n<p>We hope that, even though this was a very basic introduction, you understood how to use, configure and extend this monitoring tool.<\/p>\n<p>Please feel free to contact us. We will gladly response to any doubt or question you might have.<\/p>\n<p>The full implementation of this article can be found in the <a href=\"https:\/\/github.com\/canchito-dev\/rest-api-with-spring-actuator\">GitHub<\/a> project \u2013 this is a Maven-based project, so it should be easy to import and run as it is.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In this post, we\u2019re going to introduce Spring Boot Actuator, by first covering the basics. Afterwards,\u00a0you will create a Spring project and learn how to use, configure and extend this monitoring tool.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_exactmetrics_skip_tracking":false,"_exactmetrics_sitenote_active":false,"_exactmetrics_sitenote_note":"","_exactmetrics_sitenote_category":0,"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[38,15,3],"tags":[39,16,11,5],"class_list":["post-263","post","type-post","status-publish","format-standard","hentry","category-actuator","category-rest","category-spring","tag-actuator","tag-api","tag-rest","tag-spring"],"aioseo_notices":[],"jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/p8EwXo-4f","jetpack-related-posts":[{"id":370,"url":"https:\/\/www.canchito-dev.com\/public\/blog\/2020\/05\/12\/integrate-flowable-into-your-spring-boot-application\/","url_meta":{"origin":263,"position":0},"title":"Integrate Flowable into your Spring Boot Application","author":"canchitodev","date":"May 12, 2020","format":false,"excerpt":"In\u00a0this\u00a0tutorial,\u00a0we\u00a0will\u00a0be\u00a0integrating\u00a0Flowable's\u00a0BPM\u00a0engine\u00a0into\u00a0our\u00a0Spring\u00a0Boot\u00a0application.","rel":"","context":"In &quot;BPM&quot;","block_context":{"text":"BPM","link":"https:\/\/www.canchito-dev.com\/public\/blog\/category\/bpm\/"},"img":{"alt_text":"CANCHITO-DEV: Spring Initializr","src":"https:\/\/i0.wp.com\/www.canchito-dev.com\/public\/blog\/wp-content\/uploads\/2020\/05\/initializr-1024x674.png?resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.canchito-dev.com\/public\/blog\/wp-content\/uploads\/2020\/05\/initializr-1024x674.png?resize=350%2C200 1x, https:\/\/i0.wp.com\/www.canchito-dev.com\/public\/blog\/wp-content\/uploads\/2020\/05\/initializr-1024x674.png?resize=525%2C300 1.5x"},"classes":[]},{"id":361,"url":"https:\/\/www.canchito-dev.com\/public\/blog\/2019\/07\/22\/spring-cloud-config-server-and-client-side-support-for-externalized-configuration\/","url_meta":{"origin":263,"position":1},"title":"Spring Cloud Config &#8211; Server and client-side support for externalized configuration","author":"canchitodev","date":"July 22, 2019","format":false,"excerpt":"Want to learn how to manage your application configuration in a distributed environment? Learn how to do it with Spring Cloud Config.","rel":"","context":"In &quot;Spring&quot;","block_context":{"text":"Spring","link":"https:\/\/www.canchito-dev.com\/public\/blog\/category\/spring\/"},"img":{"alt_text":"CANCHITO-DEV: Spring Boot Config - Server and client-side support for externalized configuration","src":"https:\/\/i0.wp.com\/www.canchito-dev.com\/public\/blog\/wp-content\/uploads\/2019\/07\/Spring-Boot-Config-Server-and-client-side-support-for-externalized-configuration.png?resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.canchito-dev.com\/public\/blog\/wp-content\/uploads\/2019\/07\/Spring-Boot-Config-Server-and-client-side-support-for-externalized-configuration.png?resize=350%2C200 1x, https:\/\/i0.wp.com\/www.canchito-dev.com\/public\/blog\/wp-content\/uploads\/2019\/07\/Spring-Boot-Config-Server-and-client-side-support-for-externalized-configuration.png?resize=525%2C300 1.5x, https:\/\/i0.wp.com\/www.canchito-dev.com\/public\/blog\/wp-content\/uploads\/2019\/07\/Spring-Boot-Config-Server-and-client-side-support-for-externalized-configuration.png?resize=700%2C400 2x"},"classes":[]},{"id":499,"url":"https:\/\/www.canchito-dev.com\/public\/blog\/2020\/11\/22\/spring-security-with-saml2-and-okta\/","url_meta":{"origin":263,"position":2},"title":"Spring Security with SAML2 and Okta","author":"canchitodev","date":"November 22, 2020","format":false,"excerpt":"Greetings! In this post, we will be showing you how to build a Spring Boot application that uses Okta as platform for authentication via SAML (Security Assertion Markup Language). Ready to get started?","rel":"","context":"In &quot;Open Source&quot;","block_context":{"text":"Open Source","link":"https:\/\/www.canchito-dev.com\/public\/blog\/category\/open-source\/"},"img":{"alt_text":"CANCHITO-DEV: Okta developer console","src":"https:\/\/i0.wp.com\/www.canchito-dev.com\/public\/blog\/wp-content\/uploads\/2020\/11\/okta-developer-developer-console.png?resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.canchito-dev.com\/public\/blog\/wp-content\/uploads\/2020\/11\/okta-developer-developer-console.png?resize=350%2C200 1x, https:\/\/i0.wp.com\/www.canchito-dev.com\/public\/blog\/wp-content\/uploads\/2020\/11\/okta-developer-developer-console.png?resize=525%2C300 1.5x, https:\/\/i0.wp.com\/www.canchito-dev.com\/public\/blog\/wp-content\/uploads\/2020\/11\/okta-developer-developer-console.png?resize=700%2C400 2x"},"classes":[]},{"id":372,"url":"https:\/\/www.canchito-dev.com\/public\/blog\/2020\/06\/07\/create-custom-service-tasks-for-flowable\/","url_meta":{"origin":263,"position":3},"title":"Create Custom Service Tasks for Flowable","author":"canchitodev","date":"June 7, 2020","format":false,"excerpt":"In\u00a0this\u00a0tutorial,\u00a0we\u00a0will\u00a0be\u00a0implementing\u00a0a\u00a0custom\u00a0service\u00a0task\u00a0in\u00a0Flowable\u00a0","rel":"","context":"In &quot;BPM&quot;","block_context":{"text":"BPM","link":"https:\/\/www.canchito-dev.com\/public\/blog\/category\/bpm\/"},"img":{"alt_text":"CANCHITO-DEV: Spring Initializr","src":"https:\/\/i0.wp.com\/www.canchito-dev.com\/public\/blog\/wp-content\/uploads\/2020\/05\/initializr.png?resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.canchito-dev.com\/public\/blog\/wp-content\/uploads\/2020\/05\/initializr.png?resize=350%2C200 1x, https:\/\/i0.wp.com\/www.canchito-dev.com\/public\/blog\/wp-content\/uploads\/2020\/05\/initializr.png?resize=525%2C300 1.5x, https:\/\/i0.wp.com\/www.canchito-dev.com\/public\/blog\/wp-content\/uploads\/2020\/05\/initializr.png?resize=700%2C400 2x, https:\/\/i0.wp.com\/www.canchito-dev.com\/public\/blog\/wp-content\/uploads\/2020\/05\/initializr.png?resize=1050%2C600 3x, https:\/\/i0.wp.com\/www.canchito-dev.com\/public\/blog\/wp-content\/uploads\/2020\/05\/initializr.png?resize=1400%2C800 4x"},"classes":[]},{"id":419,"url":"https:\/\/www.canchito-dev.com\/public\/blog\/2020\/06\/27\/triggerable-custom-service-tasks-in-flowable\/","url_meta":{"origin":263,"position":4},"title":"Triggerable Custom Service Tasks in Flowable","author":"canchitodev","date":"June 27, 2020","format":false,"excerpt":"In this tutorial, we will be implementing a triggerable custom service task in Flowable. A triggerable task, is one that when it is reached, it is executes its business logic, but once done, it enters a wait state. In order to leave this state, it must be triggered.","rel":"","context":"In &quot;Flowable&quot;","block_context":{"text":"Flowable","link":"https:\/\/www.canchito-dev.com\/public\/blog\/category\/flowable\/"},"img":{"alt_text":"CANCHITO-DEV: Spring Initializr","src":"https:\/\/i0.wp.com\/www.canchito-dev.com\/public\/blog\/wp-content\/uploads\/2020\/05\/initializr.png?resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.canchito-dev.com\/public\/blog\/wp-content\/uploads\/2020\/05\/initializr.png?resize=350%2C200 1x, https:\/\/i0.wp.com\/www.canchito-dev.com\/public\/blog\/wp-content\/uploads\/2020\/05\/initializr.png?resize=525%2C300 1.5x, https:\/\/i0.wp.com\/www.canchito-dev.com\/public\/blog\/wp-content\/uploads\/2020\/05\/initializr.png?resize=700%2C400 2x, https:\/\/i0.wp.com\/www.canchito-dev.com\/public\/blog\/wp-content\/uploads\/2020\/05\/initializr.png?resize=1050%2C600 3x, https:\/\/i0.wp.com\/www.canchito-dev.com\/public\/blog\/wp-content\/uploads\/2020\/05\/initializr.png?resize=1400%2C800 4x"},"classes":[]},{"id":34,"url":"https:\/\/www.canchito-dev.com\/public\/blog\/2017\/04\/22\/build-a-rest-api-with-spring\/","url_meta":{"origin":263,"position":5},"title":"Build a REST API with Spring","author":"canchitodev","date":"April 22, 2017","format":false,"excerpt":"In this guide, you will learn how to set up and build a simple REST API with Spring, that provides CRUD operations for entries that are saved into a database. In addition, you will learn how to map HTTP request to specific URL and its response codes, and how to\u2026","rel":"","context":"In &quot;REST&quot;","block_context":{"text":"REST","link":"https:\/\/www.canchito-dev.com\/public\/blog\/category\/rest\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"jetpack_likes_enabled":true,"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.canchito-dev.com\/public\/blog\/wp-json\/wp\/v2\/posts\/263","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.canchito-dev.com\/public\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.canchito-dev.com\/public\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.canchito-dev.com\/public\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.canchito-dev.com\/public\/blog\/wp-json\/wp\/v2\/comments?post=263"}],"version-history":[{"count":8,"href":"https:\/\/www.canchito-dev.com\/public\/blog\/wp-json\/wp\/v2\/posts\/263\/revisions"}],"predecessor-version":[{"id":547,"href":"https:\/\/www.canchito-dev.com\/public\/blog\/wp-json\/wp\/v2\/posts\/263\/revisions\/547"}],"wp:attachment":[{"href":"https:\/\/www.canchito-dev.com\/public\/blog\/wp-json\/wp\/v2\/media?parent=263"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.canchito-dev.com\/public\/blog\/wp-json\/wp\/v2\/categories?post=263"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.canchito-dev.com\/public\/blog\/wp-json\/wp\/v2\/tags?post=263"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}