[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"blog-post-what-is-new-spring-boot-2":3,"blog-posts-all":1838},{"_id":4,"path":5,"title":6,"description":6,"meta":7,"body":16},"blog\u002Fblog\u002F2018\u002F03\u002F01\u002Fwhat-is-new-spring-boot-2.md","\u002Fblog\u002F2018\u002F03\u002F01\u002Fwhat-is-new-spring-boot-2","What's new in Spring Boot 2",{"slug":8,"date":9,"updatedOn":10,"published":11,"tags":12,"author":10,"cover":15,"video":10,"excerpt":10,"shortDesc":6},"what-is-new-spring-boot-2","2018-03-01T06:47:52-05:00",null,true,[13,14],"java","spring",".\u002Fpexels-photo-273238-2-760x507.jpeg",{"type":17,"value":18,"toc":1823},"minimark",[19,23,39,44,55,61,64,180,184,187,192,203,208,211,215,218,222,230,234,237,244,248,261,264,273,276,285,289,292,312,315,319,322,326,329,365,374,399,403,406,409,418,424,427,517,522,525,530,533,547,556,560,570,579,582,771,800,806,809,818,822,825,828,844,848,851,858,873,877,880,889,987,1001,1005,1008,1065,1070,1074,1077,1092,1095,1098,1114,1117,1125,1128,1131,1596,1599,1608,1625,1672,1675,1684,1687,1691,1694,1735,1739,1742,1751,1763,1767,1770,1774,1782,1791,1795,1808,1812,1819],[20,21,22],"p",{},"Spring Boot 2 was just released and I am so pumped to see it in action in the coming months. This release is the culmination of 17 months of work and over 6800 commits by 215 different individuals. There are some really great features to talk about so let's talk about What's new in Spring Boot 2. In this article we are going to look at:",[24,25,26,30,33,36],"ul",{},[27,28,29],"li",{},"The history of Spring Boot",[27,31,32],{},"What's new in Spring Boot",[27,34,35],{},"Spring Boot 2 Migration Guide",[27,37,38],{},"Resources",[40,41,43],"h2",{"id":42},"spring-boot-history","Spring Boot History",[20,45,46,47,54],{},"Before we dive into what’s new I want to take this chance to take a quick look at the history of Spring Boot. In a blog post published in August 2013, ",[48,49,53],"a",{"href":50,"rel":51},"https:\u002F\u002Fspring.io\u002Fblog\u002F2013\u002F08\u002F06\u002Fspring-boot-simplifying-spring-for-everyone\u002F",[52],"nofollow","Phil Webb announced the first milestone release of a new project called Spring Boot",".",[56,57,58],"blockquote",{},[20,59,60],{},"Spring Boot aims to make it easy to create Spring-powered, production-grade applications and services with minimum fuss. It takes an opinionated view of the Spring platform so that new and existing users can quickly get to the bits they need. You can use it to create stand-alone Java applications that can be started using ‘java -jar’ or more traditional WAR deployments. ",[20,62,63],{},"About 9 months later in April 2014 Spring Boot 1.0 was released. Since then there have been numerous minor releases that have brought us some really great features. ",[24,65,66,87,108,132,156],{},[27,67,68,73],{},[48,69,72],{"href":70,"rel":71},"https:\u002F\u002Fgithub.com\u002Fspring-projects\u002Fspring-boot\u002Fwiki\u002FSpring-Boot-1.1-Release-Notes",[52],"Spring Boot 1.1 (June 2014) ",[24,74,75,78,81,84],{},[27,76,77],{},"spring-boot-starter-test",[27,79,80],{},"Metrics & Health Endpoints",[27,82,83],{},"Elastic Search, Apache Solr, Spring Social & Spring Integration Auto-configuration ",[27,85,86],{},"Additional Templating support (Adding Freemaker, Groov, and Velocity)",[27,88,89,94],{},[48,90,93],{"href":91,"rel":92},"https:\u002F\u002Fgithub.com\u002Fspring-projects\u002Fspring-boot\u002Fwiki\u002Fspring-boot-1.2-release-notes",[52],"Spring Boot 1.2 (March 2015) ",[24,95,96,99,102,105],{},[27,97,98],{},"Servlet 3.1, Tomcat 8 & Jetty 9",[27,100,101],{},"Spring 4.1",[27,103,104],{},"@SpringBootApplication Annotation",[27,106,107],{},"Email Support",[27,109,110,115],{},[48,111,114],{"href":112,"rel":113},"https:\u002F\u002Fgithub.com\u002Fspring-projects\u002Fspring-boot\u002Fwiki\u002Fspring-boot-1.3-release-notes",[52],"Spring Boot 1.3 (December 2016)",[24,116,117,120,123,126,129],{},[27,118,119],{},"Upgrade to Spring Framework 4.2",[27,121,122],{},"Upgrade to Spring Security 4.0",[27,124,125],{},"Developer Tools",[27,127,128],{},"Caching Auto-configuration ",[27,130,131],{},"Fully executable JARs and service support",[27,133,134,139],{},[48,135,138],{"href":136,"rel":137},"https:\u002F\u002Fgithub.com\u002Fspring-projects\u002Fspring-boot\u002Fwiki\u002FSpring-Boot-1.4-Release-Notes",[52],"Spring Boot 1.4 (January 2017)",[24,140,141,144,147,150,153],{},[27,142,143],{},"Spring 4.3",[27,145,146],{},"Hibernate 5",[27,148,149],{},"Testing Improvements",[27,151,152],{},"Integration Starter",[27,154,155],{},"Couchbase and Neo4J Support",[27,157,158,163],{},[48,159,162],{"href":160,"rel":161},"https:\u002F\u002Fgithub.com\u002Fspring-projects\u002Fspring-boot\u002Fwiki\u002FSpring-Boot-1.5-Release-Notes",[52],"Spring Boot 1.5 (February 2017)",[24,164,165,168,171,174,177],{},[27,166,167],{},"Loggers endpoint",[27,169,170],{},"Apache Kafka support",[27,172,173],{},"Cloud Foundry actuator extensions",[27,175,176],{},"LDAP support",[27,178,179],{},"Testing updates",[40,181,183],{"id":182},"whats-new-in-spring","What's new in Spring ",[20,185,186],{},"What's new in Spring Boot 2? If we are going to talk about the biggest feature we need to start with the upgrade to Spring Framework 5. While Spring Framework 5 has been out since September 2017, most developers (like me) have been waiting for the release of Spring Boot 2. Spring Framework 5 introduces a long list of new features but I just want to touch on a few of the major ones here.",[188,189,191],"h3",{"id":190},"whats-new-in-spring-framework-5","What’s new in Spring Framework 5",[20,193,194],{},[48,195,198],{"href":196,"rel":197},"https:\u002F\u002Ftherealdanvega.com\u002Fwp-content\u002Fuploads\u002F2018\u002F02\u002Fmark-solarski-209233-unsplash.jpg",[52],[199,200],"img",{"alt":201,"src":202},"",".\u002Fmark-solarski-209233-unsplash-1024x682.jpg",[204,205,207],"h4",{"id":206},"java-8-baseline","Java 8+ Baseline",[20,209,210],{},"If you wish to build Spring Framework applications going forward you must be on a minimum of Java 8. Your first thought might be this is a great change for all of us but in fact its an even bigger one for the Spring team. This gave them a chance to make some major changes to update the code base to all the new features in Java 8 like Lambdas and streams. This not only ads readability throughout the code but also offers some performance improvements to the core of the framework. ",[204,212,214],{"id":213},"java-9-support","Java 9 Support",[20,216,217],{},"If you want to use Java 9 you will need to update to Spring Framework 5 and therefore need to update to Spring Boot 2. I know many of us might not be on the latest and greatest version of Java in production but this is a great chance for you to play around with all the cool new toys. This works pretty seamlessly out of the box using the standard classpath but I have read a few people having issues moving to Java 9 modules. ",[204,219,221],{"id":220},"spring-mvc","Spring MVC",[20,223,224,225,54],{},"While Spring MVC isn't the main character in this story there were some nice upgrades. I won't go through them all here so head over to ",[48,226,229],{"href":227,"rel":228},"https:\u002F\u002Fgithub.com\u002Fspring-projects\u002Fspring-framework\u002Fwiki\u002FWhat%27s-New-in-Spring-Framework-5.x#spring-web-mvc",[52],"documentation for Spring Framework 5",[204,231,233],{"id":232},"spring-webflux","Spring Webflux",[20,235,236],{},"The reactive stack is our main character in the story of Spring Framework 5. This is a different way of thinking but fortunately for us, we don't have to learn a whole new way of writing applications. Spring WebFlux is a fully asynchronous and non-blocking web framework built from the ground up allowing us to handle a massive number of concurrent connections. While this is a complete paradigm shift it is really easy to get started. ",[20,238,239],{},[48,240,242],{"href":241},".\u002Freactive_stack.png",[199,243],{"alt":201,"src":241},[204,245,247],{"id":246},"kotlin-support","Kotlin Support",[20,249,250,251,255,256,54],{},"Kotlin support was added to ",[48,252,253],{"href":253,"rel":254},"http:\u002F\u002Fstart.spring.io",[52]," but in Spring Framework 5 there is dedicated support for the language. With the dedicated support came some nice features that you can ",[48,257,260],{"href":258,"rel":259},"https:\u002F\u002Fgithub.com\u002Fspring-projects\u002Fspring-framework\u002Fwiki\u002FWhat%27s-New-in-Spring-Framework-5.x#kotlin-support",[52],"read about here",[204,262,149],{"id":263},"testing-improvements",[20,265,266,267,272],{},"The biggest change in the testing landscape is the complete support for ",[48,268,271],{"href":269,"rel":270},"http:\u002F\u002Fjunit.org\u002Fjunit5\u002F",[52],"JUnit 5","'s Jupiter programming and extension model. I will mention this again later but when you fire up a new Spring Boot 2 application you are still using JUnit 4 by default however it is a simple change if you want to start using JUnit 5. ",[188,274,6],{"id":275},"whats-new-in-spring-boot-2",[20,277,278],{},[48,279,282],{"href":280,"rel":281},"https:\u002F\u002Ftherealdanvega.com\u002Fwp-content\u002Fuploads\u002F2018\u002F02\u002Fjon-tyson-520864-unsplash.jpg",[52],[199,283],{"alt":201,"src":284},".\u002Fjon-tyson-520864-unsplash-1024x768.jpg",[204,286,288],{"id":287},"third-party-library-upgrades","Third-party Library Upgrades",[20,290,291],{},"With any new release of Spring Boot, the Spring team has an opportunity to update various dependencies. ",[24,293,294,297,300,303,306,309],{},[27,295,296],{},"Thymeleaf 3 * ",[27,298,299],{},"Jetty 9.4",[27,301,302],{},"Tomcat 8.5",[27,304,305],{},"Hibernate 5.2",[27,307,308],{},"Flyway 5",[27,310,311],{},"Gradle 4",[20,313,314],{},"* The Thymeleaf starter now includes thymeleaf-extras-java8time out of the box.",[204,316,318],{"id":317},"reactive-spring-data-spring-security","Reactive Spring Data & Spring Security ",[20,320,321],{},"With the move to Spring WebFlux, Spring Data also provides support for reactive applications. Currently, Cassandra, MongoDB, Couchbase and Redis all have reactive API support. Spring Boot includes starter-POMs for all of these which should make getting started really easy.  We also gain the ability to use Spring Security 5.0 in our reactive applications. When Spring Security is on the classpath auto-configuration is provided for WebFlux applications.",[204,323,325],{"id":324},"actuator","Actuator",[20,327,328],{},"Spring Boot Actuator is nothing new but it has been rewritten from the ground up. If you're not familiar with the Actuator project it automatically exposes endpoints to get information about that status of your application. The Actuator in Spring Boot 1.x was written against the servlet API and with the new reactive stack, the Spring team needed a solution that would work with both. Along with that, there were many changes to Actuator: ",[24,330,331,334,337,340,348,351],{},[27,332,333],{},"Redesign for both servlet & reactive",[27,335,336],{},"Status & health (all the details) were separated out",[27,338,339],{},"Simplified Security model",[27,341,342,343],{},"Move to micrometer (think SLF4J ",[344,345,347],"span",{"style":346},"font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', sans-serif;","but for metrics)",[27,349,350],{},"Improved JSON Structures",[27,352,353,354],{},"Simplified process for creating User-Defined Endpoints.\n",[24,355,356,359,362],{},[27,357,358],{},"@Endpoint",[27,360,361],{},"@WebEndpoint",[27,363,364],{},"@JmxEndpoint",[20,366,367],{},[48,368,371],{"href":369,"rel":370},"https:\u002F\u002Ftherealdanvega.com\u002Fwp-content\u002Fuploads\u002F2018\u002F02\u002Fpexels-photo-241544.jpeg",[52],[199,372],{"alt":201,"src":373},".\u002Fpexels-photo-241544-1024x683.jpeg",[20,375,376,377,381,382,385,386,388,389,392,393,398],{},"This might be an area that folks have some trouble upgrading because of the security model changes which we will talk about those in a few. By default, all web endpoints are available beneath the path  ",[378,379,380],"code",{},"\u002Factuator","  with URLs of the form  ",[378,383,384],{},"\u002Factuator\u002F{id}"," . The  ",[378,387,380],{},"  base path can be configured by using the  ",[378,390,391],{},"management.endpoints.web.base-path","  property. There is a ",[48,394,397],{"href":395,"rel":396},"https:\u002F\u002Fdocs.spring.io\u002Fspring-boot\u002Fdocs\u002F2.0.x\u002Factuator-api\u002Fhtml\u002F",[52],"dedicated detailed document for Spring Boot Actuator Web API Endpoints"," and this is a great place to start. ",[204,400,402],{"id":401},"gradle-plugin","Gradle Plugin",[20,404,405],{},"I have always been a big fan of Gradle and I am really excited to see that the team took this opportunity to rewrite the Gradle plugin. ",[20,407,408],{},"he Spring Boot Gradle Plugin provides Spring Boot support in Gradle, allowing you to package executable jar or war archives, run Spring Boot applications, and use the dependency management provided by spring-boot-dependencies. Spring Boot’s Gradle plugin requires Gradle 4.0 or later.",[20,410,411],{},[48,412,415],{"href":413,"rel":414},"https:\u002F\u002Ftherealdanvega.com\u002Fwp-content\u002Fuploads\u002F2018\u002F02\u002Fpexels-photo-209728.jpeg",[52],[199,416],{"alt":201,"src":417},".\u002Fpexels-photo-209728-1024x687.jpeg",[20,419,420],{},[421,422,423],"strong",{},"Getting Started",[20,425,426],{},"To get started with the plugin it needs to be applied to your project.",[428,429,432],"pre",{"className":430,"code":431,"language":13,"meta":201,"style":201},"language-java shiki shiki-themes github-light github-dark github-light","buildscript {\n  repositories {\n    maven { url 'https:\u002F\u002Frepo.spring.io\u002Flibs-milestone' }\n  }\n\n  dependencies {\n    classpath 'org.springframework.boot:spring-boot-gradle-plugin:2.0.0.RC1'\n  }\n}\n\napply plugin: 'org.springframework.boot'\n",[378,433,434,442,448,461,467,473,479,488,493,499,504],{"__ignoreMap":201},[344,435,438],{"class":436,"line":437},"line",1,[344,439,441],{"class":440},"s-uPX","buildscript {\n",[344,443,445],{"class":436,"line":444},2,[344,446,447],{"class":440},"  repositories {\n",[344,449,451,454,458],{"class":436,"line":450},3,[344,452,453],{"class":440},"    maven { url ",[344,455,457],{"class":456},"suV6U","'https:\u002F\u002Frepo.spring.io\u002Flibs-milestone'",[344,459,460],{"class":440}," }\n",[344,462,464],{"class":436,"line":463},4,[344,465,466],{"class":440},"  }\n",[344,468,470],{"class":436,"line":469},5,[344,471,472],{"emptyLinePlaceholder":11},"\n",[344,474,476],{"class":436,"line":475},6,[344,477,478],{"class":440},"  dependencies {\n",[344,480,482,485],{"class":436,"line":481},7,[344,483,484],{"class":440},"    classpath ",[344,486,487],{"class":456},"'org.springframework.boot:spring-boot-gradle-plugin:2.0.0.RC1'\n",[344,489,491],{"class":436,"line":490},8,[344,492,466],{"class":440},[344,494,496],{"class":436,"line":495},9,[344,497,498],{"class":440},"}\n",[344,500,502],{"class":436,"line":501},10,[344,503,472],{"emptyLinePlaceholder":11},[344,505,507,510,514],{"class":436,"line":506},11,[344,508,509],{"class":440},"apply plugin",[344,511,513],{"class":512},"sibLe",":",[344,515,516],{"class":456}," 'org.springframework.boot'\n",[20,518,519],{},[421,520,521],{},"Building executable jars and wars",[20,523,524],{},"The bootRepackage task has been replaced with bootJar and bootWar tasks for building executable jars and wars respectively. Both tasks extend their equivalent standard Gradle jar or war task, giving you access to all of the usual configuration options and behavior.",[20,526,527],{},[421,528,529],{},"Dependency management",[20,531,532],{},"Spring Boot’s Gradle plugin no longer automatically applies the dependency management plugin. Instead, Spring Boot’s plugin now reacts to the dependency management plugin being applied by importing the correct version of the spring-boot-dependencies BOM. This gives you more control over how and when dependency management is configured. For most applications applying the dependency management plugin will be sufficient:",[428,534,536],{"className":430,"code":535,"language":13,"meta":201,"style":201},"apply plugin: 'io.spring.dependency-management'\n",[378,537,538],{"__ignoreMap":201},[344,539,540,542,544],{"class":436,"line":437},[344,541,509],{"class":440},[344,543,513],{"class":512},[344,545,546],{"class":456}," 'io.spring.dependency-management'\n",[20,548,549,550,555],{},"The ",[48,551,554],{"href":552,"rel":553},"https:\u002F\u002Fdocs.spring.io\u002Fspring-boot\u002Fdocs\u002F2.0.x\u002Fgradle-plugin\u002Freference\u002Fhtml\u002F",[52],"Gradle Plugin also has its own documentation"," and there is some really great information in there. Anyone that wants to get started using Gradle should start by checking out the link below. ",[204,557,559],{"id":558},"simplified-security","Simplified Security ",[20,561,562,563,566,567,54],{},"In Spring Boot 2.x, one of the main goals was to simplify security configuration and make adding custom security easy. By default, everything is secured, including static resources and Actuator endpoints. If Spring Security is on the classpath, Spring Boot will add  ",[421,564,565],{},"@EnableWebSecurity","  and rely on Spring Security's content-negoation to decide which authentication mechanism to use. Once users decide that they want to add custom security, the default security configuration provided by Spring Boot will back off completely. At this point, users need to explicitly define all the bits they want to secure. This means security configuration is now in one place and avoids any kind of ordering issues with existing  ",[421,568,569],{},"WebSecurityConfigurerAdapter",[20,571,572],{},[48,573,576],{"href":574,"rel":575},"https:\u002F\u002Ftherealdanvega.com\u002Fwp-content\u002Fuploads\u002F2018\u002F02\u002Fpexels-photo-113726.jpeg",[52],[199,577],{"alt":201,"src":578},".\u002Fpexels-photo-113726-1024x683.jpeg",[20,580,581],{},"Here is an example of a custom security:",[428,583,585],{"className":430,"code":584,"language":13,"meta":201,"style":201},"http\n    .authorizeRequests()\n        \u002F\u002F 1\n        .requestMatchers(EndpointRequest.to(\"status\", \"info\"))\n            .permitAll()\n        \u002F\u002F 2\n        .requestMatchers(EndpointRequest.toAnyEndpoint())\n            .hasRole(\"ACTUATOR\")\n        \u002F\u002F 3 \n        .requestMatchers(StaticResourceRequest.toCommonLocations())\n            .permitAll()\n        \u002F\u002F 4\n        .antMatchers(\"\u002F\\*\\*\")\n            .hasRole(\"USER\")\n    .and()\n  ... \u002F\u002F additional configuration\n",[378,586,587,592,604,610,639,649,654,668,683,688,702,710,716,738,752,762],{"__ignoreMap":201},[344,588,589],{"class":436,"line":437},[344,590,591],{"class":440},"http\n",[344,593,594,597,601],{"class":436,"line":444},[344,595,596],{"class":440},"    .",[344,598,600],{"class":599},"sZnax","authorizeRequests",[344,602,603],{"class":440},"()\n",[344,605,606],{"class":436,"line":450},[344,607,609],{"class":608},"s4-Ip","        \u002F\u002F 1\n",[344,611,612,615,618,621,624,627,630,633,636],{"class":436,"line":463},[344,613,614],{"class":440},"        .",[344,616,617],{"class":599},"requestMatchers",[344,619,620],{"class":440},"(EndpointRequest.",[344,622,623],{"class":599},"to",[344,625,626],{"class":440},"(",[344,628,629],{"class":456},"\"status\"",[344,631,632],{"class":440},", ",[344,634,635],{"class":456},"\"info\"",[344,637,638],{"class":440},"))\n",[344,640,641,644,647],{"class":436,"line":469},[344,642,643],{"class":440},"            .",[344,645,646],{"class":599},"permitAll",[344,648,603],{"class":440},[344,650,651],{"class":436,"line":475},[344,652,653],{"class":608},"        \u002F\u002F 2\n",[344,655,656,658,660,662,665],{"class":436,"line":481},[344,657,614],{"class":440},[344,659,617],{"class":599},[344,661,620],{"class":440},[344,663,664],{"class":599},"toAnyEndpoint",[344,666,667],{"class":440},"())\n",[344,669,670,672,675,677,680],{"class":436,"line":490},[344,671,643],{"class":440},[344,673,674],{"class":599},"hasRole",[344,676,626],{"class":440},[344,678,679],{"class":456},"\"ACTUATOR\"",[344,681,682],{"class":440},")\n",[344,684,685],{"class":436,"line":495},[344,686,687],{"class":608},"        \u002F\u002F 3 \n",[344,689,690,692,694,697,700],{"class":436,"line":501},[344,691,614],{"class":440},[344,693,617],{"class":599},[344,695,696],{"class":440},"(StaticResourceRequest.",[344,698,699],{"class":599},"toCommonLocations",[344,701,667],{"class":440},[344,703,704,706,708],{"class":436,"line":506},[344,705,643],{"class":440},[344,707,646],{"class":599},[344,709,603],{"class":440},[344,711,713],{"class":436,"line":712},12,[344,714,715],{"class":608},"        \u002F\u002F 4\n",[344,717,719,721,724,726,729,733,736],{"class":436,"line":718},13,[344,720,614],{"class":440},[344,722,723],{"class":599},"antMatchers",[344,725,626],{"class":440},[344,727,728],{"class":456},"\"\u002F",[344,730,732],{"class":731},"sECI1","\\*\\*",[344,734,735],{"class":456},"\"",[344,737,682],{"class":440},[344,739,741,743,745,747,750],{"class":436,"line":740},14,[344,742,643],{"class":440},[344,744,674],{"class":599},[344,746,626],{"class":440},[344,748,749],{"class":456},"\"USER\"",[344,751,682],{"class":440},[344,753,755,757,760],{"class":436,"line":754},15,[344,756,596],{"class":440},[344,758,759],{"class":599},"and",[344,761,603],{"class":440},[344,763,765,768],{"class":436,"line":764},16,[344,766,767],{"class":440},"  ... ",[344,769,770],{"class":608},"\u002F\u002F additional configuration\n",[772,773,774,784,791,794],"ol",{},[27,775,776,779,780,783],{},[378,777,778],{},"\u002Fstatus","  and  ",[378,781,782],{},"\u002Finfo","  endpoints do not require authentication.",[27,785,786,787,790],{},"All other actuator endpoints are protected by the  ",[378,788,789],{},"ACTUATOR","  role.",[27,792,793],{},"Common static resource locations are open to all.",[27,795,796,797,790],{},"All other application endpoints are protected by the  ",[378,798,799],{},"USER",[20,801,802,805],{},[421,803,804],{},"Actuator Security"," With the actuator endpoints locked down, you will need to include or exclude the endpoints you want to see. These are the properties that now control that and have changed since 1.x ",[20,807,808],{},"# ENDPOINTS WEB CONFIGURATION (WebEndpointProperties)\nmanagement.endpoints.web.exposure.include=info,health # Endpoint IDs that should be included or '*' for all.\nmanagement.endpoints.web.exposure.exclude= # Endpoint IDs that should be excluded.\nmanagement.endpoints.web.base-path=\u002Factuator # Base path for Web endpoints. Relative to server.servlet.context-path or management.server.servlet.context-path if management.server.port is configured.\nmanagement.endpoints.web.path-mapping= # Mapping between endpoint IDs and the path that should expose them.",[20,810,811,812,817],{},"If you're ever unsure what properties to use bookmark the ",[48,813,816],{"href":814,"rel":815},"https:\u002F\u002Fdocs.spring.io\u002Fspring-boot\u002Fdocs\u002F2.0.x\u002Freference\u002Fhtml\u002Fcommon-application-properties.html",[52],"common application properties documentation",". ",[204,819,821],{"id":820},"http2-support","HTTP\u002F2 Support",[20,823,824],{},"It's hard to believe but the HTTP 1.1 specification was released back in 1996. I think this comes without saying but the web is very different today. If you want to enable HTTP\u002F2 in your Spring MVC or WebFlux applications you can use the following property. ",[20,826,827],{},"server.http2.enabled=true",[20,829,830,831,836,837],{},"This support depends on the chosen web server and the application environment since that protocol is not supported out-of-the-box by JDK8. Please ",[48,832,835],{"href":833,"rel":834},"https:\u002F\u002Fdocs.spring.io\u002Fspring-boot\u002Fdocs\u002F2.0.x\u002Freference\u002Fhtml\u002Fhowto-embedded-web-servers.html#howto-configure-http2",[52],"check out the documentation"," for more details.  ",[48,838,841],{"href":839,"rel":840},"https:\u002F\u002Ftherealdanvega.com\u002Fwp-content\u002Fuploads\u002F2018\u002F02\u002Fmac-freelancer-macintosh-macbook-40185.jpeg",[52],[199,842],{"alt":201,"src":843},".\u002Fmac-freelancer-macintosh-macbook-40185-1024x634.jpeg",[204,845,847],{"id":846},"configuration-properties","Configuration Properties",[20,849,850],{},"In Spring Boot 1.x this notion of relaxed binding was supported and all that meant is there were multiple ways you could create a property name (camel case, underscore, hyphen) and that property would all bind to the same property. ",[20,852,853,854,857],{},"This still works the same but what they did tighten up was the way that you read variables in your own code. The  ",[378,855,856],{},"@Value","  annotation is a core container feature, and it does not provide the same features as type-safe configuration properties.",[20,859,860,868,869],{},[48,861,864],{"href":862,"rel":863},"https:\u002F\u002Ftherealdanvega.com\u002Fwp-content\u002Fuploads\u002F2018\u002F02\u002F2018-02-28_07-12-58.png",[52],[199,865],{"alt":866,"src":867},"What's new in Spring Boot 2 - Configuration Properties",".\u002F2018-02-28_07-12-58-1024x180.png"," ",[48,870,871],{"href":871,"rel":872},"https:\u002F\u002Fdocs.spring.io\u002Fspring-boot\u002Fdocs\u002F2.0.x\u002Freference\u002Fhtml\u002Fboot-features-external-config.html#boot-features-external-config-relaxed-binding",[52],[204,874,876],{"id":875},"metrics","Metrics",[20,878,879],{},"Spring Boot’s own metrics have been replaced by Micrometer. This is being developed by Pivotal and quickly being adopted across projects within Pivotal. ",[20,881,882,883,888],{},"Spring Boot Actuator provides dependency management and auto-configuration for ",[48,884,887],{"href":885,"rel":886},"https:\u002F\u002Fmicrometer.io\u002F",[52],"Micrometer",", an application metrics facade that supports numerous monitoring systems, including:",[24,890,891,899,907,915,923,931,939,947,955,963,971,979],{},[27,892,893],{},[48,894,898],{"href":895,"rel":896,"title":897},"https:\u002F\u002Fdocs.spring.io\u002Fspring-boot\u002Fdocs\u002F2.0.x\u002Freference\u002Fhtml\u002Fproduction-ready-metrics.html#production-ready-metrics-export-atlas",[52],"54.2.1 Atlas","Atlas",[27,900,901],{},[48,902,906],{"href":903,"rel":904,"title":905},"https:\u002F\u002Fdocs.spring.io\u002Fspring-boot\u002Fdocs\u002F2.0.x\u002Freference\u002Fhtml\u002Fproduction-ready-metrics.html#production-ready-metrics-export-datadog",[52],"54.2.2 Datadog","Datadog",[27,908,909],{},[48,910,914],{"href":911,"rel":912,"title":913},"https:\u002F\u002Fdocs.spring.io\u002Fspring-boot\u002Fdocs\u002F2.0.x\u002Freference\u002Fhtml\u002Fproduction-ready-metrics.html#production-ready-metrics-export-ganglia",[52],"54.2.3 Ganglia","Ganglia",[27,916,917],{},[48,918,922],{"href":919,"rel":920,"title":921},"https:\u002F\u002Fdocs.spring.io\u002Fspring-boot\u002Fdocs\u002F2.0.x\u002Freference\u002Fhtml\u002Fproduction-ready-metrics.html#production-ready-metrics-export-graphite",[52],"54.2.4 Graphite","Graphite",[27,924,925],{},[48,926,930],{"href":927,"rel":928,"title":929},"https:\u002F\u002Fdocs.spring.io\u002Fspring-boot\u002Fdocs\u002F2.0.x\u002Freference\u002Fhtml\u002Fproduction-ready-metrics.html#production-ready-metrics-export-influx",[52],"54.2.5 Influx","Influx",[27,932,933],{},[48,934,938],{"href":935,"rel":936,"title":937},"https:\u002F\u002Fdocs.spring.io\u002Fspring-boot\u002Fdocs\u002F2.0.x\u002Freference\u002Fhtml\u002Fproduction-ready-metrics.html#production-ready-metrics-export-jmx",[52],"54.2.6 JMX","JMX",[27,940,941],{},[48,942,946],{"href":943,"rel":944,"title":945},"https:\u002F\u002Fdocs.spring.io\u002Fspring-boot\u002Fdocs\u002F2.0.x\u002Freference\u002Fhtml\u002Fproduction-ready-metrics.html#production-ready-metrics-export-newrelic",[52],"54.2.7 New Relic","New Relic",[27,948,949],{},[48,950,954],{"href":951,"rel":952,"title":953},"https:\u002F\u002Fdocs.spring.io\u002Fspring-boot\u002Fdocs\u002F2.0.x\u002Freference\u002Fhtml\u002Fproduction-ready-metrics.html#production-ready-metrics-export-prometheus",[52],"54.2.8 Prometheus","Prometheus",[27,956,957],{},[48,958,962],{"href":959,"rel":960,"title":961},"https:\u002F\u002Fdocs.spring.io\u002Fspring-boot\u002Fdocs\u002F2.0.x\u002Freference\u002Fhtml\u002Fproduction-ready-metrics.html#production-ready-metrics-export-signalfx",[52],"54.2.9 SignalFx","SignalFx",[27,964,965],{},[48,966,970],{"href":967,"rel":968,"title":969},"https:\u002F\u002Fdocs.spring.io\u002Fspring-boot\u002Fdocs\u002F2.0.x\u002Freference\u002Fhtml\u002Fproduction-ready-metrics.html#production-ready-metrics-export-simple",[52],"54.2.10 Simple","Simple (in-memory)",[27,972,973],{},[48,974,978],{"href":975,"rel":976,"title":977},"https:\u002F\u002Fdocs.spring.io\u002Fspring-boot\u002Fdocs\u002F2.0.x\u002Freference\u002Fhtml\u002Fproduction-ready-metrics.html#production-ready-metrics-export-statsd",[52],"54.2.11 StatsD","StatsD",[27,980,981],{},[48,982,986],{"href":983,"rel":984,"title":985},"https:\u002F\u002Fdocs.spring.io\u002Fspring-boot\u002Fdocs\u002F2.0.x\u002Freference\u002Fhtml\u002Fproduction-ready-metrics.html#production-ready-metrics-export-wavefront",[52],"54.2.12 Wavefront","Wavefront",[20,988,989,996,997,1000],{},[48,990,993],{"href":991,"rel":992},"https:\u002F\u002Ftherealdanvega.com\u002Fwp-content\u002Fuploads\u002F2018\u002F02\u002F2018-02-28_06-59-52.png",[52],[199,994],{"alt":201,"src":995},".\u002F2018-02-28_06-59-52-1024x579.png"," To learn more about Micrometer visit ",[48,998,885],{"href":885,"rel":999},[52]," This might cause a little bit of an upgrade pain for those doing a ton of logging of custom metrics.",[204,1002,1004],{"id":1003},"quartz-scheduler","Quartz Scheduler",[20,1006,1007],{},"Spring Boot 2 provides support for the Quartz scheduler that can be used via the spring-boot-starter-quartz dedicated starter. Both in-memory and JDBC stores can be configured.",[428,1009,1013],{"className":1010,"code":1011,"language":1012,"meta":201,"style":201},"language-xml shiki shiki-themes github-light github-dark github-light","\u003Cdependency>\n    \u003CgroupId>org.springframework.boot\u003C\u002FgroupId>\n    \u003CartifactId>spring-boot-starter-quartz\u003C\u002FartifactId>\n\u003C\u002Fdependency>\n","xml",[378,1014,1015,1027,1042,1056],{"__ignoreMap":201},[344,1016,1017,1020,1024],{"class":436,"line":437},[344,1018,1019],{"class":440},"\u003C",[344,1021,1023],{"class":1022},"suaqH","dependency",[344,1025,1026],{"class":440},">\n",[344,1028,1029,1032,1035,1038,1040],{"class":436,"line":444},[344,1030,1031],{"class":440},"    \u003C",[344,1033,1034],{"class":1022},"groupId",[344,1036,1037],{"class":440},">org.springframework.boot\u003C\u002F",[344,1039,1034],{"class":1022},[344,1041,1026],{"class":440},[344,1043,1044,1046,1049,1052,1054],{"class":436,"line":450},[344,1045,1031],{"class":440},[344,1047,1048],{"class":1022},"artifactId",[344,1050,1051],{"class":440},">spring-boot-starter-quartz\u003C\u002F",[344,1053,1048],{"class":1022},[344,1055,1026],{"class":440},[344,1057,1058,1061,1063],{"class":436,"line":463},[344,1059,1060],{"class":440},"\u003C\u002F",[344,1062,1023],{"class":1022},[344,1064,1026],{"class":440},[20,1066,1067],{},[199,1068],{"alt":201,"src":1069},".\u002Fpexels-photo-768472-1024x768.jpeg",[204,1071,1073],{"id":1072},"hikaricp-connection-pool","HikariCP Connection Pool",[20,1075,1076],{},"The default connection pool has switched from Tomcat to HikariCP. If you used spring.datasource.type to force the use of Hikari in a Tomcat-based application, you can now remove that override. Similarly, if you want to stay with the Tomcat connection pool, simply add the following to your configuration:",[428,1078,1082],{"className":1079,"code":1080,"language":1081,"meta":201,"style":201},"language-bash shiki shiki-themes github-light github-dark github-light","spring.datasource.type=org.apache.tomcat.jdbc.pool.DataSource\n","bash",[378,1083,1084],{"__ignoreMap":201},[344,1085,1086,1089],{"class":436,"line":437},[344,1087,1088],{"class":599},"spring.datasource.type",[344,1090,1091],{"class":456},"=org.apache.tomcat.jdbc.pool.DataSource\n",[204,1093,125],{"id":1094},"developer-tools",[20,1096,1097],{},"By default, each time your application restarts, a report showing the condition evaluation delta is logged. The report shows the changes to your application’s auto-configuration as you make changes such as adding or removing beans and setting configuration properties. To disable the logging of the report, set the following property:",[428,1099,1101],{"className":1079,"code":1100,"language":1081,"meta":201,"style":201},"spring.devtools.restart.log-condition-evaluation-delta=false\n",[378,1102,1103],{"__ignoreMap":201},[344,1104,1105,1108,1111],{"class":436,"line":437},[344,1106,1107],{"class":599},"spring.devtools.restart.log-condition-evaluation-delta",[344,1109,1110],{"class":456},"=",[344,1112,1113],{"class":731},"false\n",[204,1115,247],{"id":1116},"kotlin-support-1",[20,1118,1119,1120,817],{},"We talked earlier in this article about the official support for Kotlin. There is also a ",[48,1121,1124],{"href":1122,"rel":1123},"https:\u002F\u002Fdocs.spring.io\u002Fspring-boot\u002Fdocs\u002F2.0.x\u002Freference\u002Fhtml\u002Fboot-features-kotlin.html",[52],"dedicated portion of the documentation to Kotlin",[204,1126,271],{"id":1127},"junit-5",[20,1129,1130],{},"As I said earlier the default for a Spring Boot application is to still use JUnit 4. If you want to switch to JUnit 5 you will need to exclude JUnit 4 from the spring boot starter test and add the required dependencies. You will also need to add the plugin listed below. ",[428,1132,1134],{"className":1010,"code":1133,"language":1012,"meta":201,"style":201},"\u003Cdependencies>\n    \u003Cdependency>\n        \u003CgroupId>org.springframework.boot\u003C\u002FgroupId>\n        \u003CartifactId>spring-boot-starter-test\u003C\u002FartifactId>\n        \u003Cscope>test\u003C\u002Fscope>\n        \u003Cexclusions>\n            \u003Cexclusion>\n                \u003CgroupId>junit\u003C\u002FgroupId>\n                \u003CartifactId>junit\u003C\u002FartifactId>\n            \u003C\u002Fexclusion>\n        \u003C\u002Fexclusions>\n    \u003C\u002Fdependency>\n    \u003Cdependency>\n        \u003CgroupId>org.junit.jupiter\u003C\u002FgroupId>\n        \u003CartifactId>junit-jupiter-api\u003C\u002FartifactId>\n        \u003Cscope>test\u003C\u002Fscope>\n    \u003C\u002Fdependency>\n    \u003Cdependency>\n        \u003CgroupId>org.junit.jupiter\u003C\u002FgroupId>\n        \u003CartifactId>junit-jupiter-engine\u003C\u002FartifactId>\n        \u003Cscope>test\u003C\u002Fscope>\n    \u003C\u002Fdependency>\n\u003C\u002Fdependencies>\n\u003Cbuild>\n\u003Cplugins>\n    \u003Cplugin>\n        \u003CgroupId>org.springframework.boot\u003C\u002FgroupId>\n        \u003CartifactId>spring-boot-maven-plugin\u003C\u002FartifactId>\n    \u003C\u002Fplugin>\n    \u003Cplugin>\n        \u003CgroupId>org.apache.maven.plugins\u003C\u002FgroupId>\n        \u003CartifactId>maven-surefire-plugin\u003C\u002FartifactId>\n        \u003Cdependencies>\n            \u003Cdependency>\n                \u003CgroupId>org.junit.platform\u003C\u002FgroupId>\n                \u003CartifactId>junit-platform-surefire-provider\u003C\u002FartifactId>\n                \u003Cversion>${junit-platform.version}\u003C\u002Fversion>\n            \u003C\u002Fdependency>\n        \u003C\u002Fdependencies>\n    \u003C\u002Fplugin>\n\u003C\u002Fplugins>\n\u003C\u002Fbuild>\n",[378,1135,1136,1145,1153,1166,1179,1193,1202,1212,1226,1238,1247,1256,1265,1273,1286,1299,1311,1320,1329,1342,1356,1369,1378,1387,1397,1407,1417,1430,1444,1453,1462,1476,1490,1499,1508,1522,1536,1551,1560,1569,1578,1587],{"__ignoreMap":201},[344,1137,1138,1140,1143],{"class":436,"line":437},[344,1139,1019],{"class":440},[344,1141,1142],{"class":1022},"dependencies",[344,1144,1026],{"class":440},[344,1146,1147,1149,1151],{"class":436,"line":444},[344,1148,1031],{"class":440},[344,1150,1023],{"class":1022},[344,1152,1026],{"class":440},[344,1154,1155,1158,1160,1162,1164],{"class":436,"line":450},[344,1156,1157],{"class":440},"        \u003C",[344,1159,1034],{"class":1022},[344,1161,1037],{"class":440},[344,1163,1034],{"class":1022},[344,1165,1026],{"class":440},[344,1167,1168,1170,1172,1175,1177],{"class":436,"line":463},[344,1169,1157],{"class":440},[344,1171,1048],{"class":1022},[344,1173,1174],{"class":440},">spring-boot-starter-test\u003C\u002F",[344,1176,1048],{"class":1022},[344,1178,1026],{"class":440},[344,1180,1181,1183,1186,1189,1191],{"class":436,"line":469},[344,1182,1157],{"class":440},[344,1184,1185],{"class":1022},"scope",[344,1187,1188],{"class":440},">test\u003C\u002F",[344,1190,1185],{"class":1022},[344,1192,1026],{"class":440},[344,1194,1195,1197,1200],{"class":436,"line":475},[344,1196,1157],{"class":440},[344,1198,1199],{"class":1022},"exclusions",[344,1201,1026],{"class":440},[344,1203,1204,1207,1210],{"class":436,"line":481},[344,1205,1206],{"class":440},"            \u003C",[344,1208,1209],{"class":1022},"exclusion",[344,1211,1026],{"class":440},[344,1213,1214,1217,1219,1222,1224],{"class":436,"line":490},[344,1215,1216],{"class":440},"                \u003C",[344,1218,1034],{"class":1022},[344,1220,1221],{"class":440},">junit\u003C\u002F",[344,1223,1034],{"class":1022},[344,1225,1026],{"class":440},[344,1227,1228,1230,1232,1234,1236],{"class":436,"line":495},[344,1229,1216],{"class":440},[344,1231,1048],{"class":1022},[344,1233,1221],{"class":440},[344,1235,1048],{"class":1022},[344,1237,1026],{"class":440},[344,1239,1240,1243,1245],{"class":436,"line":501},[344,1241,1242],{"class":440},"            \u003C\u002F",[344,1244,1209],{"class":1022},[344,1246,1026],{"class":440},[344,1248,1249,1252,1254],{"class":436,"line":506},[344,1250,1251],{"class":440},"        \u003C\u002F",[344,1253,1199],{"class":1022},[344,1255,1026],{"class":440},[344,1257,1258,1261,1263],{"class":436,"line":712},[344,1259,1260],{"class":440},"    \u003C\u002F",[344,1262,1023],{"class":1022},[344,1264,1026],{"class":440},[344,1266,1267,1269,1271],{"class":436,"line":718},[344,1268,1031],{"class":440},[344,1270,1023],{"class":1022},[344,1272,1026],{"class":440},[344,1274,1275,1277,1279,1282,1284],{"class":436,"line":740},[344,1276,1157],{"class":440},[344,1278,1034],{"class":1022},[344,1280,1281],{"class":440},">org.junit.jupiter\u003C\u002F",[344,1283,1034],{"class":1022},[344,1285,1026],{"class":440},[344,1287,1288,1290,1292,1295,1297],{"class":436,"line":754},[344,1289,1157],{"class":440},[344,1291,1048],{"class":1022},[344,1293,1294],{"class":440},">junit-jupiter-api\u003C\u002F",[344,1296,1048],{"class":1022},[344,1298,1026],{"class":440},[344,1300,1301,1303,1305,1307,1309],{"class":436,"line":764},[344,1302,1157],{"class":440},[344,1304,1185],{"class":1022},[344,1306,1188],{"class":440},[344,1308,1185],{"class":1022},[344,1310,1026],{"class":440},[344,1312,1314,1316,1318],{"class":436,"line":1313},17,[344,1315,1260],{"class":440},[344,1317,1023],{"class":1022},[344,1319,1026],{"class":440},[344,1321,1323,1325,1327],{"class":436,"line":1322},18,[344,1324,1031],{"class":440},[344,1326,1023],{"class":1022},[344,1328,1026],{"class":440},[344,1330,1332,1334,1336,1338,1340],{"class":436,"line":1331},19,[344,1333,1157],{"class":440},[344,1335,1034],{"class":1022},[344,1337,1281],{"class":440},[344,1339,1034],{"class":1022},[344,1341,1026],{"class":440},[344,1343,1345,1347,1349,1352,1354],{"class":436,"line":1344},20,[344,1346,1157],{"class":440},[344,1348,1048],{"class":1022},[344,1350,1351],{"class":440},">junit-jupiter-engine\u003C\u002F",[344,1353,1048],{"class":1022},[344,1355,1026],{"class":440},[344,1357,1359,1361,1363,1365,1367],{"class":436,"line":1358},21,[344,1360,1157],{"class":440},[344,1362,1185],{"class":1022},[344,1364,1188],{"class":440},[344,1366,1185],{"class":1022},[344,1368,1026],{"class":440},[344,1370,1372,1374,1376],{"class":436,"line":1371},22,[344,1373,1260],{"class":440},[344,1375,1023],{"class":1022},[344,1377,1026],{"class":440},[344,1379,1381,1383,1385],{"class":436,"line":1380},23,[344,1382,1060],{"class":440},[344,1384,1142],{"class":1022},[344,1386,1026],{"class":440},[344,1388,1390,1392,1395],{"class":436,"line":1389},24,[344,1391,1019],{"class":440},[344,1393,1394],{"class":1022},"build",[344,1396,1026],{"class":440},[344,1398,1400,1402,1405],{"class":436,"line":1399},25,[344,1401,1019],{"class":440},[344,1403,1404],{"class":1022},"plugins",[344,1406,1026],{"class":440},[344,1408,1410,1412,1415],{"class":436,"line":1409},26,[344,1411,1031],{"class":440},[344,1413,1414],{"class":1022},"plugin",[344,1416,1026],{"class":440},[344,1418,1420,1422,1424,1426,1428],{"class":436,"line":1419},27,[344,1421,1157],{"class":440},[344,1423,1034],{"class":1022},[344,1425,1037],{"class":440},[344,1427,1034],{"class":1022},[344,1429,1026],{"class":440},[344,1431,1433,1435,1437,1440,1442],{"class":436,"line":1432},28,[344,1434,1157],{"class":440},[344,1436,1048],{"class":1022},[344,1438,1439],{"class":440},">spring-boot-maven-plugin\u003C\u002F",[344,1441,1048],{"class":1022},[344,1443,1026],{"class":440},[344,1445,1447,1449,1451],{"class":436,"line":1446},29,[344,1448,1260],{"class":440},[344,1450,1414],{"class":1022},[344,1452,1026],{"class":440},[344,1454,1456,1458,1460],{"class":436,"line":1455},30,[344,1457,1031],{"class":440},[344,1459,1414],{"class":1022},[344,1461,1026],{"class":440},[344,1463,1465,1467,1469,1472,1474],{"class":436,"line":1464},31,[344,1466,1157],{"class":440},[344,1468,1034],{"class":1022},[344,1470,1471],{"class":440},">org.apache.maven.plugins\u003C\u002F",[344,1473,1034],{"class":1022},[344,1475,1026],{"class":440},[344,1477,1479,1481,1483,1486,1488],{"class":436,"line":1478},32,[344,1480,1157],{"class":440},[344,1482,1048],{"class":1022},[344,1484,1485],{"class":440},">maven-surefire-plugin\u003C\u002F",[344,1487,1048],{"class":1022},[344,1489,1026],{"class":440},[344,1491,1493,1495,1497],{"class":436,"line":1492},33,[344,1494,1157],{"class":440},[344,1496,1142],{"class":1022},[344,1498,1026],{"class":440},[344,1500,1502,1504,1506],{"class":436,"line":1501},34,[344,1503,1206],{"class":440},[344,1505,1023],{"class":1022},[344,1507,1026],{"class":440},[344,1509,1511,1513,1515,1518,1520],{"class":436,"line":1510},35,[344,1512,1216],{"class":440},[344,1514,1034],{"class":1022},[344,1516,1517],{"class":440},">org.junit.platform\u003C\u002F",[344,1519,1034],{"class":1022},[344,1521,1026],{"class":440},[344,1523,1525,1527,1529,1532,1534],{"class":436,"line":1524},36,[344,1526,1216],{"class":440},[344,1528,1048],{"class":1022},[344,1530,1531],{"class":440},">junit-platform-surefire-provider\u003C\u002F",[344,1533,1048],{"class":1022},[344,1535,1026],{"class":440},[344,1537,1539,1541,1544,1547,1549],{"class":436,"line":1538},37,[344,1540,1216],{"class":440},[344,1542,1543],{"class":1022},"version",[344,1545,1546],{"class":440},">${junit-platform.version}\u003C\u002F",[344,1548,1543],{"class":1022},[344,1550,1026],{"class":440},[344,1552,1554,1556,1558],{"class":436,"line":1553},38,[344,1555,1242],{"class":440},[344,1557,1023],{"class":1022},[344,1559,1026],{"class":440},[344,1561,1563,1565,1567],{"class":436,"line":1562},39,[344,1564,1251],{"class":440},[344,1566,1142],{"class":1022},[344,1568,1026],{"class":440},[344,1570,1572,1574,1576],{"class":436,"line":1571},40,[344,1573,1260],{"class":440},[344,1575,1414],{"class":1022},[344,1577,1026],{"class":440},[344,1579,1581,1583,1585],{"class":436,"line":1580},41,[344,1582,1060],{"class":440},[344,1584,1404],{"class":1022},[344,1586,1026],{"class":440},[344,1588,1590,1592,1594],{"class":436,"line":1589},42,[344,1591,1060],{"class":440},[344,1593,1394],{"class":1022},[344,1595,1026],{"class":440},[40,1597,35],{"id":1598},"spring-boot-2-migration-guide",[20,1600,1601,1602,1607],{},"It probably goes without saying but with any major release like this simply flipping the version number in production isn't your best upgrade path. The first thing I would do is read through the ",[48,1603,1606],{"href":1604,"rel":1605},"https:\u002F\u002Fgithub.com\u002Fspring-projects\u002Fspring-boot\u002Fwiki\u002FSpring-Boot-2.0-Migration-Guide",[52],"Spring Boot 2.0 Migration Guide",". For me I found most of my issues revolved around the simplified security model changes and property changes. The migration guide includes an awesome tip for migrating your property files. ",[56,1609,1610],{},[20,1611,1612,1613,1616,1617,1620,1621,1624],{},"With Spring Boot 2.0, many configuration properties were renamed\u002Fremoved and developers need to update their  ",[378,1614,1615],{},"application.properties"," \u002F ",[378,1618,1619],{},"application.yml","  accordingly. To help you with that, Spring Boot ships a new  ",[378,1622,1623],{},"spring-boot-properties-migrator","  module. Once added as a dependency to your project, this will not only analyze your application’s environment and print diagnostics at startup, but also temporarily migrate properties at runtime for you. This is a must have during your application migration:",[428,1626,1628],{"className":1010,"code":1627,"language":1012,"meta":201,"style":201},"\u003Cdependency>\n  \u003CgroupId>org.springframework.boot\u003C\u002FgroupId>\n  \u003CartifactId>spring-boot-properties-migrator\u003C\u002FartifactId>\n\u003C\u002Fdependency>\n",[378,1629,1630,1638,1651,1664],{"__ignoreMap":201},[344,1631,1632,1634,1636],{"class":436,"line":437},[344,1633,1019],{"class":440},[344,1635,1023],{"class":1022},[344,1637,1026],{"class":440},[344,1639,1640,1643,1645,1647,1649],{"class":436,"line":444},[344,1641,1642],{"class":440},"  \u003C",[344,1644,1034],{"class":1022},[344,1646,1037],{"class":440},[344,1648,1034],{"class":1022},[344,1650,1026],{"class":440},[344,1652,1653,1655,1657,1660,1662],{"class":436,"line":450},[344,1654,1642],{"class":440},[344,1656,1048],{"class":1022},[344,1658,1659],{"class":440},">spring-boot-properties-migrator\u003C\u002F",[344,1661,1048],{"class":1022},[344,1663,1026],{"class":440},[344,1665,1666,1668,1670],{"class":436,"line":463},[344,1667,1060],{"class":440},[344,1669,1023],{"class":1022},[344,1671,1026],{"class":440},[20,1673,1674],{},"I am not sure what your thoughts are on this but I would certainly start playing with Spring Boot 2 and working on migrating your code over to it but with any major release, I usually wait until the next point release. This isn't just for Spring, I do this with pretty much everything from Apple to Pivotal to Angry Birds! ",[20,1676,1677],{},[48,1678,1681],{"href":1679,"rel":1680},"https:\u002F\u002Ftherealdanvega.com\u002Fwp-content\u002Fuploads\u002F2018\u002F02\u002Fpexels-photo-860379.jpeg",[52],[199,1682],{"alt":201,"src":1683},".\u002Fpexels-photo-860379-1024x659.jpeg",[40,1685,38],{"id":1686},"resources",[188,1688,1690],{"id":1689},"documentation","Documentation",[20,1692,1693],{},"There are a ton of great resources out there but I want to start with the documentation. The documentation for Spring Framework and Spring Boot has really improved over the years. I love some of the dedicated guides we got this time around with Actuator and the Gradle Plugin. ",[24,1695,1696,1703,1710,1716,1722,1729],{},[27,1697,1698,1699],{},"Spring Boot Reference Guide: ",[48,1700,1701],{"href":1701,"rel":1702},"https:\u002F\u002Fdocs.spring.io\u002Fspring-boot\u002Fdocs\u002F2.0.x\u002Freference\u002Fhtml\u002F",[52],[27,1704,1705,1706],{},"Spring Boot API: ",[48,1707,1708],{"href":1708,"rel":1709},"https:\u002F\u002Fdocs.spring.io\u002Fspring-boot\u002Fdocs\u002F2.0.x\u002Fapi\u002F",[52],[27,1711,1712,1713],{},"Spring Boot Actuator Web API: ",[48,1714,395],{"href":395,"rel":1715},[52],[27,1717,1718,1719],{},"Spring Boot Gradle Plugin Reference: ",[48,1720,552],{"href":552,"rel":1721},[52],[27,1723,1724,1725],{},"Spring Boot Maven Plugin Reference: ",[48,1726,1727],{"href":1727,"rel":1728},"https:\u002F\u002Fdocs.spring.io\u002Fspring-boot\u002Fdocs\u002F2.0.x\u002Fmaven-plugin\u002F",[52],[27,1730,1731,1732],{},"Common Application Properties: ",[48,1733,814],{"href":814,"rel":1734},[52],[188,1736,1738],{"id":1737},"books","Books",[20,1740,1741],{},"I have both of these books and think they both have some really good value. If you're looking for more of a reactive path check out Learning Spring Boot 2.0. ",[20,1743,1744],{},[48,1745,1748],{"href":1746,"rel":1747},"https:\u002F\u002Fwww.amazon.com\u002FLearning-Spring-Boot-2-0-microservices\u002Fdp\u002F1786463784\u002Fref=as_li_ss_il?ie=UTF8&qid=1519826464&sr=8-1-spons&keywords=spring+boot+2&psc=1&linkCode=li3&tag=therealdanveg-20&linkId=02c093ca835465896029afb5ff59d6ce",[52],[199,1749],{"alt":201,"src":1750},"\u002F\u002Fws-na.amazon-adsystem.com\u002Fwidgets\u002Fq?_encoding=UTF8&ASIN=1786463784&Format=_SL250_&ID=AsinImage&MarketPlace=US&ServiceVersion=20070822&WS=1&tag=therealdanveg-20",[20,1752,1753,1760],{},[48,1754,1757],{"href":1755,"rel":1756},"https:\u002F\u002Fwww.amazon.com\u002FBeginning-Spring-Boot-Applications-Microservices\u002Fdp\u002F1484229304\u002Fref=as_li_ss_il?ie=UTF8&qid=1519826464&sr=8-3&keywords=spring+boot+2&linkCode=li3&tag=therealdanveg-20&linkId=431754c7b1270cf3b194761f5df51b34",[52],[199,1758],{"alt":201,"src":1759},"\u002F\u002Fws-na.amazon-adsystem.com\u002Fwidgets\u002Fq?_encoding=UTF8&ASIN=1484229304&Format=_SL250_&ID=AsinImage&MarketPlace=US&ServiceVersion=20070822&WS=1&tag=therealdanveg-20",[199,1761],{"alt":201,"src":1762},"https:\u002F\u002Fir-na.amazon-adsystem.com\u002Fe\u002Fir?t=therealdanveg-20&l=li3&o=1&a=1484229304",[188,1764,1766],{"id":1765},"courses","Courses",[20,1768,1769],{},"I am working on wrapping up my next course titled \"Getting Started with Spring Boot 2\".",[204,1771,1773],{"id":1772},"course-overview","Course Overview",[20,1775,1776,1777,817],{},"This course offers hands-on experience building Spring Framework applications using Spring Boot. The first thing that is going to stand out is that we are going to move away from the boring, non-useful demos. In the new course, we are going to build a practical application from start to finish. This will allow you to see the process I use for building applications from idea to launch.  One of the big thing I heard from my students in my first course is that they wanted more information on how to go into production. A great application isn’t that useful if we can deploy it into a production environment. We will take a look at using one of the most popular cloud services around, Amazon Web Services (AWS). On completion, students will have the foundation they need to build enterprise-ready Java applications.  If you're interested in signing up for the waitlist and receive an introductory discount ",[48,1778,1781],{"href":1779,"rel":1780},"https:\u002F\u002Ftherealdanvega.com\u002Fspring-boot-2",[52],"please head over to the course page",[20,1783,1784],{},[48,1785,1788],{"href":1786,"rel":1787},"https:\u002F\u002Ftherealdanvega.com\u002Fwp-content\u002Fuploads\u002F2018\u002F02\u002Fgetting_started_spring_boot_2.png",[52],[199,1789],{"alt":201,"src":1790},".\u002Fgetting_started_spring_boot_2-1024x304.png",[188,1792,1794],{"id":1793},"me-me-me","Me, Me, Me",[20,1796,1797,1798,1803,1804],{},"Please consider signing up for my mailing list (below) to be notified when I publish new content. I am making a large push towards more video and less long blog posts (like this one) so ",[48,1799,1802],{"href":1800,"rel":1801},"http:\u002F\u002Fwww.youtube.com\u002Ftherealdanvega",[52],"please consider subscribing to my YouTube Channel"," as well. A video of me talking about this blog post. ",[48,1805,1806],{"href":1806,"rel":1807},"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=91n6y-T-PC8",[52],[40,1809,1811],{"id":1810},"conclusion","Conclusion",[20,1813,1814,1815,1818],{},"I have been looking forward to this release for a long time now and If you can't tell, I am super excited.  _",[421,1816,1817],{},"Question:"," What are your favorite features in Spring Boot 2? _",[1820,1821,1822],"style",{},"html pre.shiki code .s-uPX, html code.shiki .s-uPX{--shiki-default:#24292E;--shiki-dark:#E1E4E8;--shiki-sepia:#24292E}html pre.shiki code .suV6U, html code.shiki .suV6U{--shiki-default:#032F62;--shiki-dark:#9ECBFF;--shiki-sepia:#032F62}html pre.shiki code .sibLe, html code.shiki .sibLe{--shiki-default:#D73A49;--shiki-dark:#F97583;--shiki-sepia:#D73A49}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html.sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html pre.shiki code .sZnax, html code.shiki .sZnax{--shiki-default:#6F42C1;--shiki-dark:#B392F0;--shiki-sepia:#6F42C1}html pre.shiki code .s4-Ip, html code.shiki .s4-Ip{--shiki-default:#6A737D;--shiki-dark:#6A737D;--shiki-sepia:#6A737D}html pre.shiki code .sECI1, html code.shiki .sECI1{--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-sepia:#005CC5}html pre.shiki code .suaqH, html code.shiki .suaqH{--shiki-default:#22863A;--shiki-dark:#85E89D;--shiki-sepia:#22863A}",{"title":201,"searchDepth":444,"depth":444,"links":1824},[1825,1826,1830,1831,1837],{"id":42,"depth":444,"text":43},{"id":182,"depth":444,"text":183,"children":1827},[1828,1829],{"id":190,"depth":450,"text":191},{"id":275,"depth":450,"text":6},{"id":1598,"depth":444,"text":35},{"id":1686,"depth":444,"text":38,"children":1832},[1833,1834,1835,1836],{"id":1689,"depth":450,"text":1690},{"id":1737,"depth":450,"text":1738},{"id":1765,"depth":450,"text":1766},{"id":1793,"depth":450,"text":1794},{"id":1810,"depth":444,"text":1811},[1839,1856,1869,1884,1898,1913,1926,1940,1954,1967,1979,1991,2003,2015,2028,2042,2054,2067,2081,2095,2107,2120,2132,2145,2159,2171,2185,2198,2210,2224,2237,2249,2263,2274,2286,2298,2310,2322,2333,2346,2359,2371,2385,2396,2409,2422,2433,2445,2457,2469,2481,2492,2505,2517,2529,2540,2552,2563,2576,2589,2602,2613,2624,2635,2646,2657,2668,2679,2690,2701,2713,2724,2737,2748,2759,2770,2781,2792,2803,2814,2825,2836,2847,2859,2871,2883,2896,2909,2922,2934,2946,2958,2970,2981,2992,3003,3015,3027,3039,3051,3063,3075,3088,3102,3113,3124,3136,3148,3160,3172,3185,3197,3209,3221,3233,3246,3258,3272,3285,3297,3309,3322,3333,3345,3357,3370,3382,3394,3406,3418,3430,3443,3457,3469,3481,3492,3503,3516,3529,3543,3555,3566,3577,3588,3600,3612,3625,3638,3651,3663,3675,3689,3700,3711,3722,3733,3745,3756,3767,3779,3791,3803,3815,3827,3840,3852,3865,3877,3888,3899,3911,3923,3935,3946,3957,3968,3979,3990,4001,4012,4024,4035,4046,4057,4067,4077,4089,4099,4110,4120,4131,4142,4146,4155,4165,4175,4185,4196,4206,4217,4228,4238,4248,4258,4268,4278,4289,4299,4310,4320,4330,4340,4351,4361,4371,4381,4392,4401,4411,4421,4431,4442,4453,4463,4472,4481,4492,4503,4513,4522,4532,4542,4552,4563,4573,4583,4593,4604,4613,4623,4634,4646,4657,4667,4678,4689,4699,4709,4721,4732,4743,4754,4764,4774,4785,4796,4806,4816,4826,4837,4846,4855,4864,4873,4882,4891,4900,4909,4918],{"_id":1840,"path":1841,"title":1842,"description":1843,"meta":1844,"readingTime":1854},"blog\u002Fblog\u002F2026\u002F08\u002F05\u002Ffive-steps-of-ai-adoption.md","\u002Fblog\u002F2026\u002F08\u002F05\u002Ffive-steps-of-ai-adoption","The 5 Steps of AI Adoption: Which One Are You On?","Learn the 5 steps of AI adoption mapped out by Boris Cherny, creator of Claude Code, and how to move from copy-pasting code to supervised autonomy.",{"slug":1845,"date":1846,"published":11,"tags":1847,"author":1851,"cover":1852,"video":1853,"excerpt":10,"shortDesc":1843},"five-steps-of-ai-adoption","2026-08-05T09:00:00.000Z",[1848,1849,1850],"AI","Spring Boot","Java","Dan Vega","five-steps-of-ai-adoption.png","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002Fg12mC2J11d0",{"minutes":712,"text":1855},"12 min read",{"_id":1857,"path":1858,"title":1859,"description":1860,"meta":1861,"readingTime":1867},"blog\u002Fblog\u002F2026\u002F07\u002F31\u002Fcan-you-trust-ai-generated-code.md","\u002Fblog\u002F2026\u002F07\u002F31\u002Fcan-you-trust-ai-generated-code","Can You Trust AI-Generated Code?","Can you trust AI-generated code? It depends on what you already know. A look at why AI code feels great in unfamiliar stacks and how to verify it.",{"slug":1862,"date":1863,"published":11,"tags":1864,"author":1851,"cover":1865,"video":1866,"excerpt":10,"shortDesc":1860},"can-you-trust-ai-generated-code","2026-07-31T09:00:00.000Z",[1849,1850,1848],"can-you-trust-ai-generated-code.png","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FUuM2-nRsLuA",{"minutes":718,"text":1868},"13 min read",{"_id":1870,"path":1871,"title":1872,"description":1873,"meta":1874,"readingTime":1882},"blog\u002Fblog\u002F2026\u002F07\u002F30\u002Fupgrading-dependencies-with-ai.md","\u002Fblog\u002F2026\u002F07\u002F30\u002Fupgrading-dependencies-with-ai","Upgrading Dependencies with AI: A Practical Guide","Learn a practical workflow for upgrading dependencies with AI, using scope, scale, and stakes to decide when to reach for an LLM to patch your projects.",{"slug":1875,"date":1876,"published":11,"tags":1877,"author":1851,"cover":1880,"video":1881,"excerpt":10,"shortDesc":1873},"upgrading-dependencies-with-ai","2026-07-30T09:00:00.000Z",[1848,1878,1879],"Web Development","Nuxt","upgrading-dependencies-with-ai.png","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FMYtia9xsTrQ",{"minutes":506,"text":1883},"11 min read",{"_id":1885,"path":1886,"title":1887,"description":1888,"meta":1889,"readingTime":1896},"blog\u002Fblog\u002F2026\u002F07\u002F28\u002Fspring-ai-guardrails-safeguard-advisor.md","\u002Fblog\u002F2026\u002F07\u002F28\u002Fspring-ai-guardrails-safeguard-advisor","Spring AI: Build Real Guardrails that hold","Learn how to build Spring AI guardrails with SafeGuardAdvisor, custom PII masking, and output rails to stop prompt injection and data leaks.",{"slug":1890,"date":1891,"published":11,"tags":1892,"author":1851,"cover":1894,"video":1895,"excerpt":10,"shortDesc":1888},"spring-ai-guardrails-safeguard-advisor","2026-07-28T09:00:00.000Z",[1893,1849,1850],"Spring AI","spring-ai-guardrails-safeguard-advisor.png","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FEZ6Uh1-8Ui4",{"minutes":1358,"text":1897},"21 min read",{"_id":1899,"path":1900,"title":1901,"description":1902,"meta":1903,"readingTime":1911},"blog\u002Fblog\u002F2026\u002F07\u002F27\u002Fdocker-compose-for-java-developers.md","\u002Fblog\u002F2026\u002F07\u002F27\u002Fdocker-compose-for-java-developers","Docker Compose for Java Developers, Explained","Learn what that docker-compose.yml in every Java repo actually does. Spin up Postgres with one command and run any project you clone with zero setup.",{"slug":1904,"date":1905,"published":11,"tags":1906,"author":1851,"cover":1909,"video":1910,"excerpt":10,"shortDesc":1902},"docker-compose-for-java-developers","2026-07-27T09:00:00.000Z",[1850,1907,1908],"Docker","Postgres","docker-compose-for-java-developers.png","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002F0LNVXHKKJb8",{"minutes":1313,"text":1912},"17 min read",{"_id":1914,"path":1915,"title":1916,"description":1917,"meta":1918,"readingTime":1924},"blog\u002Fblog\u002F2026\u002F07\u002F24\u002Fspring-ai-tool-calling-advisor-2-0.md","\u002Fblog\u002F2026\u002F07\u002F24\u002Fspring-ai-tool-calling-advisor-2-0","Spring AI 2.0 Tool Calling: Build a Live Claude-Style UI","Build a Claude-style 'Calling tool...' UI with Spring AI 2.0's ToolCallingAdvisor. Stream live tool call events over SSE from the ChatClient advisor chain.",{"slug":1919,"date":1920,"published":11,"tags":1921,"author":1851,"cover":1922,"video":1923,"excerpt":10,"shortDesc":1917},"spring-ai-tool-calling-advisor-2-0","2026-07-24T09:00:00.000Z",[1893,1849,1850],"spring-ai-tool-calling-advisor-2-0.jpeg","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002Fg6IhOsFKM7c",{"minutes":1331,"text":1925},"19 min read",{"_id":1927,"path":1928,"title":1929,"description":1930,"meta":1931,"readingTime":1939},"blog\u002Fblog\u002F2026\u002F07\u002F20\u002Fembabel-1-0-ga.md","\u002Fblog\u002F2026\u002F07\u002F20\u002Fembabel-1-0-ga","Embabel 1.0 Is Here: AI Agent Framework for Java Goes GA","Embabel 1.0 is GA. What Rod Johnson's AI agent framework for the JVM means for Java developers, what changed on the road to 1.0, and how to get started.",{"slug":1932,"date":1933,"published":11,"tags":1934,"author":10,"cover":1938,"video":10,"excerpt":10,"shortDesc":1930},"embabel-1-0-ga","2026-07-20T09:00:00.000Z",[13,1935,1936,1937],"spring-ai","embabel","ai-agents","embabel-1-0-ga-brutalist.png",{"minutes":712,"text":1855},{"_id":1941,"path":1942,"title":1943,"description":1944,"meta":1945,"readingTime":1952},"blog\u002Fblog\u002F2026\u002F07\u002F18\u002Fcontent-creation-workflow.md","\u002Fblog\u002F2026\u002F07\u002F18\u002Fcontent-creation-workflow","My Content Creation Workflow: 10 Stages From Idea to Published","My complete 10-stage content creation workflow for YouTube: ideation, packaging, AI rough cuts, repurposing videos into blog posts, Shorts, and a newsletter.",{"slug":1946,"date":1947,"published":11,"tags":1948,"author":1851,"cover":1951,"video":10,"excerpt":10,"shortDesc":1944},"content-creation-workflow","2026-07-18T09:00:00.000Z",[1949,1950,1848],"YouTube","Blogging","content-creation-workflow-blueprint.png",{"minutes":490,"text":1953},"8 min read",{"_id":1955,"path":1956,"title":1957,"description":1958,"meta":1959,"readingTime":1965},"blog\u002Fblog\u002F2026\u002F07\u002F17\u002Fself-correcting-structured-output.md","\u002Fblog\u002F2026\u002F07\u002F17\u002Fself-correcting-structured-output","Self-Correcting Structured Output in Spring AI 2.0","Learn how Spring AI 2.0 validates LLM JSON against your schema and automatically retries failures with self-correcting structured output. A beginner guide.",{"slug":1960,"date":1961,"published":11,"tags":1962,"author":1851,"cover":1963,"video":1964,"excerpt":10,"shortDesc":1958},"self-correcting-structured-output","2026-07-17T09:00:00.000Z",[1893,1849,1850],"self-correcting-structured-output.jpg","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FvxOeeNyOtZY",{"minutes":764,"text":1966},"16 min read",{"_id":1968,"path":1969,"title":1970,"description":1971,"meta":1972,"readingTime":1977},"blog\u002Fblog\u002F2026\u002F07\u002F15\u002Fcan-you-use-java-for-ai.md","\u002Fblog\u002F2026\u002F07\u002F15\u002Fcan-you-use-java-for-ai","Can You Use Java for AI? Why Java Is Better Positioned Than You Think","Can you use Java for AI? Yes. For building real AI applications it might be the better choice. Why the JVM, Spring AI, and your existing team are enough.",{"slug":1973,"date":1974,"published":11,"tags":1975,"author":1851,"cover":1976,"video":10,"excerpt":10,"shortDesc":1971},"can-you-use-java-for-ai","2026-07-15T09:00:00.000Z",[1850,1848,1893],"can-you-use-java-for-ai-editorial.png",{"minutes":740,"text":1978},"14 min read",{"_id":1980,"path":1981,"title":1982,"description":1983,"meta":1984,"readingTime":1990},"blog\u002Fblog\u002F2026\u002F07\u002F14\u002Fspring-boot-end-of-life.md","\u002Fblog\u002F2026\u002F07\u002F14\u002Fspring-boot-end-of-life","Spring Boot End of Life: Every 3.x Branch Is Now Unsupported","Spring Boot 3.5 reached end of life in June 2026 and every 3.x branch is now unsupported. What that means, and how to plan your Spring Boot 4 upgrade.",{"slug":1985,"date":1986,"published":11,"tags":1987,"author":1851,"cover":1989,"video":10,"excerpt":10,"shortDesc":1983},"spring-boot-end-of-life","2026-07-14T13:00:00.000Z",[1849,1850,1988,1848],"Spring Boot 4","spring-boot-end-of-life-terminal.png",{"minutes":506,"text":1883},{"_id":1992,"path":1993,"title":1994,"description":1995,"meta":1996,"readingTime":2001},"blog\u002Fblog\u002F2026\u002F07\u002F14\u002Fkill-process-on-port.md","\u002Fblog\u002F2026\u002F07\u002F14\u002Fkill-process-on-port","How to Kill a Process Running on a Port (Windows, macOS & Linux)","Port 8080 already in use? Learn how to find and kill the process running on a port on Windows, macOS, and Linux—with copy-paste commands for each.",{"slug":1997,"date":1998,"published":11,"tags":1999,"author":1851,"cover":2000,"video":10,"excerpt":10,"shortDesc":1995},"kill-process-on-port","2026-07-14T09:00:00.000Z",[1850,1849],"kill-process-on-port.png",{"minutes":481,"text":2002},"7 min read",{"_id":2004,"path":2005,"title":2006,"description":2007,"meta":2008,"readingTime":2014},"blog\u002Fblog\u002F2026\u002F07\u002F09\u002Fspring-ai-tool-search.md","\u002Fblog\u002F2026\u002F07\u002F09\u002Fspring-ai-tool-search","Spring AI Tool Search: Stop Wasting Tokens on Tools You Don't Need","Spring AI 2.0's tool search brings dynamic tool discovery to Spring Boot—load tools on demand instead of into every request to cut token usage and cost.",{"slug":2009,"date":2010,"published":11,"tags":2011,"author":1851,"cover":2012,"video":2013,"excerpt":10,"shortDesc":2007},"spring-ai-tool-search","2026-07-09T09:00:00.000Z",[1893,1849],"spring-ai-tool-search.jpg","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FVG00DildlvY",{"minutes":1313,"text":1912},{"_id":2016,"path":2017,"title":2018,"description":2019,"meta":2020,"readingTime":2026},"blog\u002Fblog\u002F2026\u002F07\u002F08\u002Fspring-ai-custom-advisors-tool-logging-token-counter.md","\u002Fblog\u002F2026\u002F07\u002F08\u002Fspring-ai-custom-advisors-tool-logging-token-counter","Building Custom Spring AI Advisors for Tool Logging and Token Tracking","Learn to build custom Spring AI advisors with the BaseAdvisor interface to log available tools, track tool invocations, and count token usage on every LLM call.",{"slug":2021,"date":2022,"published":11,"tags":2023,"author":1851,"cover":2024,"video":2025,"excerpt":10,"shortDesc":2019},"spring-ai-custom-advisors-tool-logging-token-counter","2026-07-08T09:00:00.000Z",[1893,1849,1850],"spring-ai-custom-advisors-tool-logging-token-counter.jpg","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FWNJFR-_N9bc",{"minutes":1389,"text":2027},"24 min read",{"_id":2029,"path":2030,"title":2031,"description":2032,"meta":2033,"readingTime":2040},"blog\u002Fblog\u002F2026\u002F07\u002F07\u002Fui-dot-sh-agent-skills-for-building-beautiful-uis.md","\u002Fblog\u002F2026\u002F07\u002F07\u002Fui-dot-sh-agent-skills-for-building-beautiful-uis","UI.sh: Agent Skills That Actually Make AI-Generated UIs Look Good","UI.sh is a collection of agent skills from the Tailwind CSS and Refactoring UI team that give Claude Code and Codex the polish of a senior UI designer.",{"slug":2034,"date":2035,"published":11,"tags":2036,"author":1851,"cover":2038,"video":2039,"excerpt":10,"shortDesc":2032},"ui-dot-sh-agent-skills-for-building-beautiful-uis","2026-07-07T09:00:00.000Z",[1848,2037],"Tailwind CSS","ui-dot-sh-agent-skills-for-building-beautiful-uis.jpeg","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002F-B7uyMp54S4",{"minutes":495,"text":2041},"9 min read",{"_id":2043,"path":2044,"title":2045,"description":2046,"meta":2047,"readingTime":2053},"blog\u002Fblog\u002F2026\u002F07\u002F02\u002Fchatclient-vs-chatmodel-spring-ai.md","\u002Fblog\u002F2026\u002F07\u002F02\u002Fchatclient-vs-chatmodel-spring-ai","ChatClient vs ChatModel: Which Spring AI API Should You Actually Use?","Spring AI gives you two ways to call an LLM. Learn the difference between ChatClient and ChatModel, when to use each, and see both in action with code examples.",{"slug":2048,"date":2049,"published":11,"tags":2050,"author":1851,"cover":2051,"video":2052,"excerpt":10,"shortDesc":2046},"chatclient-vs-chatmodel-spring-ai","2026-07-02T09:00:00.000Z",[1893,1849],"chatclient-vs-chatmodel-spring-ai.jpg","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FIdIDI71sGZM",{"minutes":740,"text":1978},{"_id":2055,"path":2056,"title":2057,"description":2058,"meta":2059,"readingTime":2066},"blog\u002Fblog\u002F2026\u002F07\u002F01\u002Fx-twitter-mcp-servers-spring-ai.md","\u002Fblog\u002F2026\u002F07\u002F01\u002Fx-twitter-mcp-servers-spring-ai","X (Twitter) MCP Servers with Spring AI: Search Posts and Query Docs Programmatically","X released MCP servers for its API and docs. Build a Spring Boot MCP client with Spring AI 2.0 to search X posts and query the X API docs programmatically.",{"slug":2060,"date":2061,"published":11,"tags":2062,"author":1851,"cover":2064,"video":2065,"excerpt":10,"shortDesc":2058},"x-twitter-mcp-servers-spring-ai","2026-07-01T09:00:00.000Z",[1893,2063,1849],"MCP","x-twitter-mcp-servers-spring-ai.jpeg","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002Fj4chxGtqkY8",{"minutes":1331,"text":1925},{"_id":2068,"path":2069,"title":2070,"description":2071,"meta":2072,"readingTime":2079},"blog\u002Fblog\u002F2026\u002F06\u002F30\u002Ftype-safe-property-paths-spring-boot-4-1.md","\u002Fblog\u002F2026\u002F06\u002F30\u002Ftype-safe-property-paths-spring-boot-4-1","Type Safe Property Paths in Spring Boot 4.1","Spring Boot 4.1 adds type-safe property paths to Spring Data, replacing stringly typed references in sorting, criteria queries, and composite paths.",{"slug":2073,"date":2074,"published":11,"tags":2075,"author":1851,"cover":2077,"video":2078,"excerpt":10,"shortDesc":2071},"type-safe-property-paths-spring-boot-4-1","2026-06-30T09:00:00.000Z",[1849,2076],"Spring Data","type-safe-property-paths-spring-boot-4-1.jpeg","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FqBC-TrIzsPg",{"minutes":1322,"text":2080},"18 min read",{"_id":2082,"path":2083,"title":2084,"description":2085,"meta":2086,"readingTime":2093},"blog\u002Fblog\u002F2026\u002F06\u002F29\u002Fredis-listener-spring-boot-4-1.md","\u002Fblog\u002F2026\u002F06\u002F29\u002Fredis-listener-spring-boot-4-1","The New @RedisListener Annotation in Spring Boot 4.1","Spring Boot 4.1 adds @RedisListener, one annotation that brings Redis Pub\u002FSub in line with @KafkaListener and @RabbitListener. No container wiring needed.",{"slug":2087,"date":2088,"published":11,"tags":2089,"author":1851,"cover":2091,"video":2092,"excerpt":10,"shortDesc":2085},"redis-listener-spring-boot-4-1","2026-06-29T09:00:00.000Z",[1849,2090],"Redis","redis-listener-spring-boot-4-1.jpg","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FlMbgBYlUtfc",{"minutes":501,"text":2094},"10 min read",{"_id":2096,"path":2097,"title":2098,"description":2099,"meta":2100,"readingTime":2106},"blog\u002Fblog\u002F2026\u002F06\u002F26\u002Fspring-boot-ssrf-protection-inet-address-filter.md","\u002Fblog\u002F2026\u002F06\u002F26\u002Fspring-boot-ssrf-protection-inet-address-filter","SSRF Protection in Spring Boot 4.1 with InetAddressFilter","Learn how Spring Boot 4.1's new InetAddressFilter protects your applications against Server-Side Request Forgery (SSRF) attacks with a single bean definition.",{"slug":2101,"date":2102,"published":11,"tags":2103,"author":1851,"cover":2104,"video":2105,"excerpt":10,"shortDesc":2099},"spring-boot-ssrf-protection-inet-address-filter","2026-06-26T09:00:00.000Z",[1849,1850],"spring-boot-ssrf-protection-inet-address-filter.jpeg","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FPDbBG_GrcwU",{"minutes":718,"text":1868},{"_id":2108,"path":2109,"title":2110,"description":2111,"meta":2112,"readingTime":2118},"blog\u002Fblog\u002F2026\u002F06\u002F25\u002Flazy-jdbc-connections-spring-boot-4-1.md","\u002Fblog\u002F2026\u002F06\u002F25\u002Flazy-jdbc-connections-spring-boot-4-1","Lazy JDBC Connections in Spring Boot 4.1: One Property, Massive Performance Win","Spring Boot 4.1 adds lazy JDBC connection fetching via spring.datasource.connection-fetch. See how it cuts connection hold time from 2 seconds to 15ms.",{"slug":2113,"date":2114,"published":11,"tags":2115,"author":1851,"cover":2116,"video":2117,"excerpt":10,"shortDesc":2111},"lazy-jdbc-connections-spring-boot-4-1","2026-06-25T09:00:00.000Z",[1849,2076],"lazy-jdbc-connections-spring-boot-4-1.jpeg","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FlsaBN1U2EB8",{"minutes":754,"text":2119},"15 min read",{"_id":2121,"path":2122,"title":2123,"description":2124,"meta":2125,"readingTime":2131},"blog\u002Fblog\u002F2026\u002F06\u002F24\u002Fspring-grpc-spring-boot-4-1.md","\u002Fblog\u002F2026\u002F06\u002F24\u002Fspring-grpc-spring-boot-4-1","Getting Started with Spring gRPC in Spring Boot 4.1","Build a gRPC server and client in Spring Boot 4.1 with Spring gRPC — using @GrpcService, protobuf, and the new starters from start.spring.io.",{"slug":2126,"date":2127,"published":11,"tags":2128,"author":1851,"cover":2129,"video":2130,"excerpt":10,"shortDesc":2124},"spring-grpc-spring-boot-4-1","2026-06-24T09:00:00.000Z",[],"spring-grpc-spring-boot-4-1.jpeg","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FMPHuBNqbYPM",{"minutes":718,"text":1868},{"_id":2133,"path":2134,"title":2135,"description":2136,"meta":2137,"readingTime":2144},"blog\u002Fblog\u002F2026\u002F05\u002F20\u002Fspring-modulith-externalized-events.md","\u002Fblog\u002F2026\u002F05\u002F20\u002Fspring-modulith-externalized-events","Spring Modulith Externalized Events: Publishing Events to Kafka","Learn how to externalize Spring Modulith application events to Apache Kafka so other systems can react to changes happening inside your modular monolith.",{"slug":2138,"date":2139,"published":11,"tags":2140,"author":1851,"cover":2142,"video":2143,"excerpt":10,"shortDesc":2136},"spring-modulith-externalized-events","2026-05-20T09:00:00.000Z",[2141],"Spring Modulith","spring-modulith-externalized-events.jpeg","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002F8sJIWwc7Jss",{"minutes":1313,"text":1912},{"_id":2146,"path":2147,"title":2148,"description":2149,"meta":2150,"readingTime":2158},"blog\u002Fblog\u002F2026\u002F05\u002F18\u002Fspring-boot-kafka-in-10-minutes-your-first-message.md","\u002Fblog\u002F2026\u002F05\u002F18\u002Fspring-boot-kafka-in-10-minutes-your-first-message","Spring Boot + Kafka in 10 Minutes: Sending Your First Message","Produce and consume your first Apache Kafka message with Spring Boot. Covers Docker Compose, KafkaTemplate, @KafkaListener, and Embedded Kafka for tests.",{"slug":2151,"date":2152,"published":11,"tags":2153,"author":1851,"cover":2156,"video":2157,"excerpt":10,"shortDesc":2149},"spring-boot-kafka-quick-start","2026-05-18T08:00:00.000Z",[1849,2154,2155],"Apache Kafka","Spring for Apache Kafka","spring-boot-kafka-in-10-minutes-your-first-message.jpg","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002F5XW3f_39ipY",{"minutes":1322,"text":2080},{"_id":2160,"path":2161,"title":2162,"description":2163,"meta":2164,"readingTime":2170},"blog\u002Fblog\u002F2026\u002F05\u002F14\u002Fspring-modulith-durable-events.md","\u002Fblog\u002F2026\u002F05\u002F14\u002Fspring-modulith-durable-events","Spring Modulith Durable Events: Reliable Event Processing Without a Message Broker","Learn how Spring Modulith's event publication registry persists and replays failed events across restarts, giving you a transactional outbox with no message broker.",{"slug":2165,"date":2166,"published":11,"tags":2167,"author":1851,"cover":2168,"video":2169,"excerpt":10,"shortDesc":2163},"spring-modulith-durable-events","2026-05-14T09:00:00.000Z",[1849,2141],"spring-modulith-durable-events.jpg","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FKLX9ulb2AfM",{"minutes":1358,"text":1897},{"_id":2172,"path":2173,"title":2174,"description":2175,"meta":2176,"readingTime":2183},"blog\u002Fblog\u002F2026\u002F04\u002F30\u002Fintroduction-to-spring-modulith.md","\u002Fblog\u002F2026\u002F04\u002F30\u002Fintroduction-to-spring-modulith","Introduction to Spring Modulith: Building Modular Monoliths with Spring Boot","Learn how Spring Modulith helps you build a modular monolith in Spring Boot with enforced module boundaries, application events, and verified architecture.",{"slug":2177,"date":2178,"published":11,"tags":2179,"author":1851,"cover":2181,"video":2182,"excerpt":10,"shortDesc":2175},"introduction-to-spring-modulith","2026-04-30T09:00:00.000Z",[1849,2141,1850,2180],"Modular Monolith","introduction-to-spring-modulith.jpg","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FxHlDyKVyvig",{"minutes":1371,"text":2184},"22 min read",{"_id":2186,"path":2187,"title":2188,"description":2189,"meta":2190,"readingTime":2197},"blog\u002Fblog\u002F2026\u002F04\u002F10\u002Fembabel-tools-mcp.md","\u002Fblog\u002F2026\u002F04\u002F10\u002Fembabel-tools-mcp","Embabel MCP Servers and Tools for Agentic Flows on the JVM","Add tools and MCP servers to your Embabel agents in Java. Build a blog writing agent that researches topics, calculates reading time, and generates front matter.",{"slug":2191,"date":2192,"published":11,"tags":2193,"author":10,"cover":2195,"video":2196,"excerpt":10,"shortDesc":2189},"embabel-mcp-servers-and-tools","2026-04-10T08:00:00.000Z",[1893,2194,1850],"Embabel","embabel_tools_mcp.jpg","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002F2mGr7kdstJs",{"minutes":764,"text":1966},{"_id":2199,"path":2200,"title":2201,"description":2202,"meta":2203,"readingTime":2209},"blog\u002Fblog\u002F2026\u002F04\u002F02\u002Fembabel-first-look.md","\u002Fblog\u002F2026\u002F04\u002F02\u002Fembabel-first-look","Embabel First Look: Building Agentic Flows on the JVM","A first look at Embabel, Rod Johnson's framework for building agentic AI flows on the JVM. Build a blog writing agent using goal-oriented action planning (GOAP).",{"slug":2204,"date":2205,"published":11,"tags":2206,"author":10,"cover":2207,"video":2208,"excerpt":10,"shortDesc":2202},"embabel-first-look","2026-04-02T08:00:00.000Z",[1893,1850],"EmbabelFirstLook.jpg","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FG5VDQCZu6t0",{"minutes":1358,"text":1897},{"_id":2211,"path":2212,"title":2213,"description":2214,"meta":2215,"readingTime":2222},"blog\u002Fblog\u002F2026\u002F04\u002F01\u002Fgraphql-for-java-developers-course.md","\u002Fblog\u002F2026\u002F04\u002F01\u002Fgraphql-for-java-developers-course","GraphQL for Java Developers with Spring Boot","Build GraphQL APIs in Java with Spring Boot 4 and Spring for GraphQL. A free course covering schema-first design, batch loading, unions, and AOT repositories.",{"slug":2216,"date":2217,"published":11,"tags":2218,"author":1851,"cover":2220,"video":2221,"excerpt":10,"shortDesc":2214},"getting-started-with-graphql-for-java-developers","2026-04-01T08:00:00.000Z",[1849,1850,2219],"GraphQL","graphql-java-developers-cover.jpg","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FxZSv67a9OYA",{"minutes":1492,"text":2223},"33 min read",{"_id":2225,"path":2226,"title":2227,"description":2228,"meta":2229,"readingTime":2235},"blog\u002Fblog\u002F2026\u002F03\u002F31\u002Fsprig-build-me-a-coding-agent.md","\u002Fblog\u002F2026\u002F03\u002F31\u002Fsprig-build-me-a-coding-agent","Spring, Build Me a Coding Agent","Build an autonomous coding agent in Spring AI with the Spring AI Agent Utils library. This tutorial adds file system tools, shell commands, and agent skills.",{"slug":2230,"date":2231,"published":11,"tags":2232,"author":1851,"cover":2233,"video":2234,"excerpt":10,"shortDesc":2228},"spring-building-me-a-coding-agent","2026-03-31T08:00:00.000Z",[1893,1849,1850],".\u002Fcoding_agent_cover.jpg","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FP8s65qu-LZI",{"minutes":1409,"text":2236},"26 min read",{"_id":2238,"path":2239,"title":2240,"description":2241,"meta":2242,"readingTime":2248},"blog\u002Fblog\u002F2026\u002F03\u002F27\u002Fspring-ai-deep-research-agent.md","\u002Fblog\u002F2026\u002F03\u002F27\u002Fspring-ai-deep-research-agent","Spring AI Deep Research Agent","AI Agent Search",{"slug":2243,"date":2244,"published":11,"tags":2245,"author":1851,"cover":2246,"video":2247,"excerpt":10,"shortDesc":2241},"spring-ai-deep-research-agent","2026-03-27T09:00:00.000Z",[1848],"spring-ai-deep-research-agent.jpeg","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002F_amdeuCM-aY",{"minutes":1358,"text":1897},{"_id":2250,"path":2251,"title":2252,"description":2253,"meta":2254,"readingTime":2262},"blog\u002Fblog\u002F2026\u002F03\u002F26\u002Frest-client-error-handling.md","\u002Fblog\u002F2026\u002F03\u002F26\u002Frest-client-error-handling","Getting Started with Error Handling in the RestClient","Learn best practices for error handling with Spring's RestClient, including global exception handlers, custom exceptions, Problem Detail responses, and built-in retry with resilience methods in Spring Framework 7.",{"slug":2255,"date":2256,"published":11,"tags":2257,"author":1851,"cover":2260,"video":2261,"excerpt":10,"shortDesc":2253},"rest-client-error-handling","2026-03-26T09:00:00.000Z",[1849,2258,2259,1850],"Spring Framework","REST Client","rest-client-error-handling.jpg","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FMuYzEZk6-zI",{"minutes":1322,"text":2080},{"_id":2264,"path":2265,"title":2266,"description":2267,"meta":2268,"readingTime":2273},"blog\u002Fblog\u002F2026\u002F03\u002F25\u002Fbrowswerbase-spring-boot-starter.md","\u002Fblog\u002F2026\u002F03\u002F25\u002Fbrowswerbase-spring-boot-starter","Giving Your Spring AI Agents a Real Browser with the Browserbase Spring Boot Starter","Most AI agents can search the web. But what happens when they need to actually use it? I built a Spring Boot Starter for Browserbase that gives your agents a real, headless browser in three lines of configuration, plus a deep research agent to show it off.",{"slug":2269,"date":2270,"published":11,"tags":2271,"author":1851,"cover":2272,"video":10,"excerpt":10,"shortDesc":2267},"browserbase-spring-boot-starter","2026-03-25T08:00:00.000Z",[1849,1893],"browswerbase_spring_boot_starter_cover.png",{"minutes":1331,"text":1925},{"_id":2275,"path":2276,"title":2277,"description":2278,"meta":2279,"readingTime":2285},"blog\u002Fblog\u002F2026\u002F03\u002F20\u002Fjdk-26-final-means-final.md","\u002Fblog\u002F2026\u002F03\u002F20\u002Fjdk-26-final-means-final","JEP 500: Prepare to Make Final Mean Final in JDK 26","JDK 26 introduces JEP 500, which warns developers when final fields are mutated through reflection. Here's what this means for your Java code and how to prepare for the future.",{"slug":2280,"date":2281,"published":11,"tags":2282,"author":1851,"cover":2283,"video":2284,"excerpt":10,"shortDesc":2278},"jdk-26-final-means-final","2026-03-20T10:00:00.000Z",[1850],"java-26-final-means-final.jpg","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002Fj-y0m6j6TBc",{"minutes":506,"text":1883},{"_id":2287,"path":2288,"title":2289,"description":2290,"meta":2291,"readingTime":2297},"blog\u002Fblog\u002F2026\u002F03\u002F14\u002Fspring-initializr-tui.md","\u002Fblog\u002F2026\u002F03\u002F14\u002Fspring-initializr-tui","Building a Spring Initializr Terminal UI with Java","How I built a terminal user interface for the Spring Initializr using Tambu UI, a new Java TUI framework, and GraalVM native images to streamline my development workflow.",{"slug":2292,"date":2293,"published":11,"tags":2294,"author":1851,"cover":2295,"video":2296,"excerpt":10,"shortDesc":2290},"spring-initializr-tui","2026-03-14T10:00:00.000Z",[1850,1849],"spring-init-tui-cover.jpg","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FJ9C2MiQTIYs",{"minutes":501,"text":2094},{"_id":2299,"path":2300,"title":2301,"description":2302,"meta":2303,"readingTime":2309},"blog\u002Fblog\u002F2026\u002F02\u002F08\u002Fspring-ai-prompt-caching.md","\u002Fblog\u002F2026\u002F02\u002F08\u002Fspring-ai-prompt-caching","Spring AI Prompt Caching: Stop Wasting Money on Repeated Tokens","Spring AI prompt caching cuts your Anthropic Claude API costs. Use AnthropicCacheStrategy to cache system prompts and tools that don't change between requests.",{"slug":2304,"date":2305,"published":11,"tags":2306,"author":1851,"cover":2307,"video":2308,"excerpt":10,"shortDesc":2302},"spring-ai-prompt-caching","2026-02-08T09:00:00.000Z",[1893],"spring-ai-prompt-caching.jpg","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FeYb7BKW4QcU",{"minutes":740,"text":1978},{"_id":2311,"path":2312,"title":2313,"description":2314,"meta":2315,"readingTime":2321},"blog\u002Fblog\u002F2026\u002F02\u002F05\u002Fopenai-codex-first-look.md","\u002Fblog\u002F2026\u002F02\u002F05\u002Fopenai-codex-first-look","I Tried OpenAI's New Codex Agent. Here are my First Impressions (It's Really Good)","OpenAI released Codex, a new GUI for their coding agent. I put it to the test by building a vending machine CLI application in Java 25 with Maven, JUnit 6, and JSpecify null safety annotations.",{"slug":2316,"date":2317,"published":11,"tags":2318,"author":1851,"cover":2319,"video":2320,"excerpt":10,"shortDesc":2314},"openai-codex-first-look","2026-02-05T09:00:00.000Z",[1850,1848],"codex_thumbnail.jpg","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FQ44TPEtNcNo",{"minutes":501,"text":2094},{"_id":2323,"path":2324,"title":2325,"description":2326,"meta":2327,"readingTime":2332},"blog\u002Fblog\u002F2026\u002F02\u002F05\u002Fralph-loop.md","\u002Fblog\u002F2026\u002F02\u002F05\u002Fralph-loop","The Ralph Loop: Automate AI Coding Tasks in Java","The Ralph Loop is a bash script that runs your AI coding agent with a fresh context every iteration. Here's how it works and how I used it to build a Java CLI.",{"slug":2328,"date":2317,"published":11,"tags":2329,"author":1851,"cover":2330,"video":2331,"excerpt":10,"shortDesc":2326},"ralph-loop",[1848,1850],"ralph-loop.jpg","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FCV97l0GkPHo",{"minutes":764,"text":1966},{"_id":2334,"path":2335,"title":2336,"description":2337,"meta":2338,"readingTime":2345},"blog\u002Fblog\u002F2025\u002F12\u002F23\u002Fopentelemetry-spring-boot.md","\u002Fblog\u002F2025\u002F12\u002F23\u002Fopentelemetry-spring-boot","OpenTelemetry with Spring Boot 4: The New Starter","Learn how to use the new spring-boot-starter-opentelemetry in Spring Boot 4 to add observability with traces, metrics, and logs—no Actuator required.",{"slug":2339,"date":2340,"published":11,"tags":2341,"author":1851,"cover":2343,"video":2344,"excerpt":10,"shortDesc":2337},"opentelemetry-spring-boot","2025-12-23T09:00:00.000Z",[1849,2342],"Observability","spring-boot-open-telemetry.jpg","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002F6_Y41z7OIv8",{"minutes":712,"text":1855},{"_id":2347,"path":2348,"title":2349,"description":2350,"meta":2351,"readingTime":2358},"blog\u002Fblog\u002F2025\u002F12\u002F18\u002Fspring-boot-4-rest-api.md","\u002Fblog\u002F2025\u002F12\u002F18\u002Fspring-boot-4-rest-api","Building a Spring Boot 4 REST API the Fast Way","Learn how to build a REST API with Spring Boot 4 in minutes. This tutorial shows you how to create CRUD endpoints using Java records and the @RestController annotation.",{"slug":2352,"date":2353,"published":11,"tags":2354,"author":1851,"cover":2356,"video":2357,"excerpt":10,"shortDesc":2350},"spring-boot-4-rest-api","2025-12-18T09:00:00.000Z",[1849,1850,2355],"REST API","spring-boot-rest-api-easy.jpeg","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FklnxzL8oQdM",{"minutes":1331,"text":1925},{"_id":2360,"path":2361,"title":2362,"description":2363,"meta":2364,"readingTime":2370},"blog\u002Fblog\u002F2025\u002F12\u002F17\u002Floading-spring-resources.md","\u002Fblog\u002F2025\u002F12\u002F17\u002Floading-spring-resources","Loading Resources in Spring Boot","Learn how to load resources in Spring Boot using the Resource interface. This tutorial covers three approaches for loading files from the classpath, filesystem, and URLs.",{"slug":2365,"date":2366,"published":11,"tags":2367,"author":1851,"cover":2368,"video":2369,"excerpt":10,"shortDesc":2363},"loading-spring-resources","2025-12-17T09:00:00.000Z",[1849,2258],"spring_resources_cover.png","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FHmcgwj65Unw",{"minutes":1331,"text":1925},{"_id":2372,"path":2373,"title":2374,"description":2375,"meta":2376,"readingTime":2383},"blog\u002Fblog\u002F2025\u002F12\u002F16\u002Fspring-security-7-multi-factor-authentication.md","\u002Fblog\u002F2025\u002F12\u002F16\u002Fspring-security-7-multi-factor-authentication","Spring Security 7 Multi-Factor Authentication: Complete Tutorial with @EnableMultiFactorAuthentication","Learn how to implement multi-factor authentication (MFA) in Spring Boot 4 using Spring Security 7's new @EnableMultiFactorAuthentication annotation. Step-by-step tutorial with one-time token login and custom PIN codes.",{"slug":2377,"date":2378,"published":11,"tags":2379,"author":1851,"cover":2381,"video":2382,"excerpt":10,"shortDesc":2375},"spring-security-7-multi-factor-authentication","2025-12-16T09:00:00.000Z",[1849,2380],"Spring Security","spring_security_mfa_cover.png","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FKmNAqlaKwjw",{"minutes":1432,"text":2384},"28 min read",{"_id":2386,"path":2387,"title":2388,"description":2389,"meta":2390,"readingTime":2395},"blog\u002Fblog\u002F2025\u002F12\u002F12\u002Fspring-boot-4-modularization.md","\u002Fblog\u002F2025\u002F12\u002F12\u002Fspring-boot-4-modularization","Spring Boot 4 Modularization: Fix Missing Auto-Configuration","Spring Boot 4 broke your auto-configuration? Learn which modular starters you now need—Flyway, H2, and the test starters behind @AutoConfigureMockMvc.",{"slug":2391,"date":2392,"published":11,"tags":2393,"author":1851,"cover":10,"video":2394,"excerpt":10,"shortDesc":2389},"spring-boot-4-modularization","2025-12-12T09:00:00.000Z",[1849,1988,1850],"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FkTLuhE7_jGU",{"minutes":740,"text":1978},{"_id":2397,"path":2398,"title":2399,"description":2400,"meta":2401,"readingTime":2407},"blog\u002Fblog\u002F2025\u002F12\u002F10\u002Fmock-vs-rest.md","\u002Fblog\u002F2025\u002F12\u002F10\u002Fmock-vs-rest","MockMvcTester vs RestTestClient: Which one Should You Use in Spring Boot 4?","A comparison of MockMvcTester and RestTestClient for testing Spring Boot web applications, exploring when to use each approach and their key differences.",{"slug":2402,"date":2403,"published":11,"tags":2404,"author":1851,"cover":2405,"video":2406,"excerpt":10,"shortDesc":2400},"mock-vs-rest","2025-12-10T09:00:00.000Z",[1849],".\u002Fmock-vs-rest.png","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FxWcqvrpj2PM",{"minutes":1380,"text":2408},"23 min read",{"_id":2410,"path":2411,"title":2412,"description":2413,"meta":2414,"readingTime":2421},"blog\u002Fblog\u002F2025\u002F12\u002F05\u002Fjms-client.md","\u002Fblog\u002F2025\u002F12\u002F05\u002Fjms-client","Spring JMS Client: A Complete Guide to JmsClient in Spring Boot 4","Master the Spring JMS Client with this complete Spring Boot 4 JmsClient tutorial. Learn when to choose JMS over Kafka, configure message conversion, and send messages using Spring's fluent API.",{"slug":2415,"date":2416,"published":11,"tags":2417,"author":1851,"cover":2419,"video":2420,"excerpt":10,"shortDesc":2413},"jms-client","2025-12-05T09:00:00.000Z",[1850,1849,2418],"JMS",".\u002Fjms_client_cover.png","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002F91xVrWlzIe4",{"minutes":1313,"text":1912},{"_id":2423,"path":2424,"title":2425,"description":2426,"meta":2427,"readingTime":2432},"blog\u002Fblog\u002F2025\u002F11\u002F25\u002Fspring-data-aot-repositories.md","\u002Fblog\u002F2025\u002F11\u002F25\u002Fspring-data-aot-repositories","Spring Data AOT Repositories: Faster Startup and Build-Time Query Validation","Learn how Spring Data AOT Repositories move query processing from runtime to compile time, reducing startup times and memory usage, plus how to validate repository methods at build time.",{"slug":2428,"date":2429,"published":11,"tags":2430,"author":1851,"cover":2431,"video":10,"excerpt":10,"shortDesc":2426},"spring-data-aot-repositories","2025-11-25T10:00:00.000Z",[1849,2076],"spring-data-aot-repositories.png",{"minutes":754,"text":2119},{"_id":2434,"path":2435,"title":2436,"description":2437,"meta":2438,"readingTime":2444},"blog\u002Fblog\u002F2025\u002F11\u002F24\u002Fspring-boot-4-is-here.md","\u002Fblog\u002F2025\u002F11\u002F24\u002Fspring-boot-4-is-here","Spring Boot 4: Everything You Need to Know (4.0 and 4.1)","Everything new in Spring Boot 4 and 4.1, from null safety and HTTP interfaces to modularization and gRPC, plus the upgrade path from Spring Boot 3.",{"slug":2439,"date":2440,"published":11,"tags":2441,"author":1851,"cover":2443,"video":10,"excerpt":10,"shortDesc":2437},"spring-boot-4-is-here","2025-11-24T09:00:00.000Z",[1849,1988,2442,1850],"Spring","spring-boot-4-is-here.png",{"minutes":1492,"text":2223},{"_id":2446,"path":2447,"title":2448,"description":2449,"meta":2450,"readingTime":2456},"blog\u002Fblog\u002F2025\u002F11\u002F13\u002Fspring-boot-4-native-retry-support.md","\u002Fblog\u002F2025\u002F11\u002F13\u002Fspring-boot-4-native-retry-support","Native Retry Support in Spring Boot 4: No External Dependencies Required","Spring Boot 4 includes native retry support with @Retryable, RetryTemplate, and @ConcurrencyLimit. Learn how to add resilience without the spring-retry dependency.",{"slug":2451,"date":2452,"published":11,"tags":2453,"author":1851,"cover":2454,"video":2455,"excerpt":10,"shortDesc":2449},"spring-boot-4-native-retry-support","2025-11-13T09:00:00.000Z",[1849,1988,1850],"spring_resilience_features_cover.png","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FCT1wGTwOfg0",{"minutes":1432,"text":2384},{"_id":2458,"path":2459,"title":2460,"description":2461,"meta":2462,"readingTime":2468},"blog\u002Fblog\u002F2025\u002F11\u002F10\u002Fjackson-3-spring-boot-4.md","\u002Fblog\u002F2025\u002F11\u002F10\u002Fjackson-3-spring-boot-4","Jackson 3 in Spring Boot 4: JsonMapper, JSON Views, and What's Changed","Learn how to use Jackson 3 in Spring Boot 4 with the new JsonMapper, immutable configuration, unchecked exceptions, and JSON Views with the hint() method.",{"slug":2463,"date":2464,"published":11,"tags":2465,"author":1851,"cover":2466,"video":2467,"excerpt":10,"shortDesc":2461},"jackson-3-spring-boot-4","2025-11-10T09:00:00.000Z",[1849,1988],"jackson_3_cover.png","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002F4cvP_qroLH4",{"minutes":1432,"text":2384},{"_id":2470,"path":2471,"title":2472,"description":2473,"meta":2474,"readingTime":2480},"blog\u002Fblog\u002F2025\u002F11\u002F06\u002Fhttp-interfaces-spring-boot-4.md","\u002Fblog\u002F2025\u002F11\u002F06\u002Fhttp-interfaces-spring-boot-4","HTTP Interfaces in Spring Boot 4: Say Goodbye to Boilerplate","Learn how HTTP interfaces let you define declarative HTTP clients in Spring Boot, and discover how Spring Framework 7 eliminates the configuration boilerplate with @ImportHttpServices.",{"slug":2475,"date":2476,"published":11,"tags":2477,"author":1851,"cover":2478,"video":2479,"excerpt":10,"shortDesc":2473},"http-interfaces-spring-boot-4","2025-11-06T09:00:00.000Z",[1849,1988,2258],"http_interfaces_cover.png","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FTEd5e4Thu7M",{"minutes":1331,"text":1925},{"_id":2482,"path":2483,"title":2484,"description":2485,"meta":2486,"readingTime":2491},"blog\u002Fblog\u002F2025\u002F11\u002F05\u002Fspring-boot-4-null-safety.md","\u002Fblog\u002F2025\u002F11\u002F05\u002Fspring-boot-4-null-safety","Stop NullPointerExceptions Before Production with Spring Boot 4's Null Safety","Discover how Spring Boot 4 and JSpecify annotations catch NullPointerExceptions at compile-time instead of runtime. Learn to implement @NullMarked and @Nullable for bulletproof Java code with practical examples.",{"slug":2487,"date":2488,"published":11,"tags":2489,"author":1851,"cover":10,"video":2490,"excerpt":10,"shortDesc":2485},"spring-boot-4-null-safety","2025-11-05T09:00:00.000Z",[1850,1849,1988],"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FQlGnaRoujL8",{"minutes":1371,"text":2184},{"_id":2493,"path":2494,"title":2495,"description":2496,"meta":2497,"readingTime":2504},"blog\u002Fblog\u002F2025\u002F11\u002F01\u002Fprogrammatic-bean-registration.md","\u002Fblog\u002F2025\u002F11\u002F01\u002Fprogrammatic-bean-registration","Spring Boot 4's Bean Registrar: A Cleaner Way to Register Beans Programmatically","Learn how Spring Boot 4's new BeanRegistrar interface simplifies programmatic bean registration in Spring Framework 7. This tutorial demonstrates dynamic bean creation based on environment properties, conditional registration with complex logic, and performance optimization techniques. Discover when to use BeanRegistrar vs @Bean annotations with practical code examples and testing strategies for your Spring applications.",{"slug":2498,"date":2499,"published":11,"tags":2500,"author":1851,"cover":2501,"video":2502,"excerpt":10,"shortDesc":2503},"programmatic-bean-registration","2025-11-01T09:00:00.000Z",[1849,1988,2258],"spring_boot_4_bean_registrar.png","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002Fyh760wTFL_4","Learn how Spring Boot 4's new BeanRegistrar interface simplifies programmatic bean registration in Spring Framework 7. This tutorial demonstrates dynamic bean creation based on environment properties, conditional registration with complex logic, and performance optimization techniques. Discover when to use BeanRegistrar vs @Bean annotations with practical code examples and testing strategies...",{"minutes":712,"text":1855},{"_id":2506,"path":2507,"title":2508,"description":2509,"meta":2510,"readingTime":2516},"blog\u002Fblog\u002F2025\u002F10\u002F30\u002Fspring-framework-7-rest-test-client.md","\u002Fblog\u002F2025\u002F10\u002F30\u002Fspring-framework-7-rest-test-client","Testing Spring REST APIs with RestTestClient: A Complete Guide","Explore the new Rest Test Client in Spring Framework 7, a modern replacement for RestTemplate that provides a fluent API for testing REST APIs with improved type safety and better integration with modern testing practices.",{"slug":2511,"date":2512,"published":11,"tags":2513,"author":1851,"cover":2515,"video":10,"excerpt":10,"shortDesc":2509},"spring-framework-7-rest-test-client","2025-10-30T09:00:00.000Z",[2258,1849,2514],"Testing","spring_boot_4_rest-test-client.png",{"minutes":1371,"text":2184},{"_id":2518,"path":2519,"title":2520,"description":2521,"meta":2522,"readingTime":2528},"blog\u002Fblog\u002F2025\u002F10\u002F28\u002Fspring-ai-mcp-client.md","\u002Fblog\u002F2025\u002F10\u002F28\u002Fspring-ai-mcp-client","Building MCP Clients with Spring AI: Augmenting LLMs with Custom Context","Learn how to build MCP (Model Context Protocol) clients using Spring AI to augment Large Language Models with custom context and functionality for your applications.",{"slug":2523,"date":2524,"published":11,"tags":2525,"author":1851,"cover":2526,"video":2527,"excerpt":10,"shortDesc":2521},"spring-ai-mcp-client","2025-10-28T09:00:00.000Z",[1893],"spring_ai_mcp_client.png","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FTSFkdlreRMQ",{"minutes":740,"text":1978},{"_id":2530,"path":2531,"title":2532,"description":2533,"meta":2534,"readingTime":2539},"blog\u002Fblog\u002F2025\u002F09\u002F30\u002Fapi-versioning-with-graphql.md","\u002Fblog\u002F2025\u002F09\u002F30\u002Fapi-versioning-with-graphql","Evolving your API without Versioning in GraphQL","Explore modern approaches to API versioning in GraphQL, including schema evolution strategies, deprecation patterns, and best practices for maintaining backward compatibility while evolving your API.",{"slug":2535,"date":2536,"published":11,"tags":2537,"author":1851,"cover":2538,"video":10,"excerpt":10,"shortDesc":2533},"api-versioning-with-graphql","2025-09-30T09:00:00.000Z",[1849,2219],"api_versioning_graphql.png",{"minutes":754,"text":2119},{"_id":2541,"path":2542,"title":2543,"description":2544,"meta":2545,"readingTime":2550},"blog\u002Fblog\u002F2025\u002F09\u002F25\u002Fspring-boot-4-api-versioning.md","\u002Fblog\u002F2025\u002F09\u002F25\u002Fspring-boot-4-api-versioning","First-Class API Versioning in Spring Boot 4","Learn how to implement API versioning strategies in Spring Boot 4 applications, including best practices for managing backwards compatibility and evolution of your REST APIs.",{"slug":2546,"date":2547,"published":11,"tags":2548,"author":1851,"cover":2549,"video":201,"excerpt":10,"shortDesc":2544},"spring-boot-4-api-versioning","2025-09-25T09:00:00.000Z",[1849,1988,2258],"spring_boot_4_api_versioning.png",{"minutes":1399,"text":2551},"25 min read",{"_id":2553,"path":2554,"title":2555,"description":2556,"meta":2557,"readingTime":2562},"blog\u002Fblog\u002F2025\u002F09\u002F24\u002Fcyc-mcp-server-spring-ai.md","\u002Fblog\u002F2025\u002F09\u002F24\u002Fcyc-mcp-server-spring-ai","My CYC 2025 Demo: Why Building MCP Servers in Java Just Got Ridiculously Simple","Learn how Spring AI 1.1.0-M2 makes building MCP servers in Java incredibly simple with just annotations. No callbacks, no complex setup. Includes complete code from my Commit Your Code 2025 conference demo, showing how to expose your Java application's data to Claude and other AI assistants.",{"slug":2558,"date":2559,"published":11,"tags":2560,"author":1851,"cover":2561,"video":10,"excerpt":10,"shortDesc":2556},"cyc-mcp-server-spring-ai","2025-09-24T09:00:00.000Z",[2442,1893,1848,2063,1850],"spring_ai_mcp_servers_cover.png",{"minutes":1358,"text":1897},{"_id":2564,"path":2565,"title":2566,"description":2567,"meta":2568,"readingTime":2573},"blog\u002Fblog\u002F2025\u002F09\u002F17\u002Fspring-boot-3-features.md","\u002Fblog\u002F2025\u002F09\u002F17\u002Fspring-boot-3-features","Spring Boot 3.x Features: A Complete Guide (3.0 to 3.5)","Every major Spring Boot 3.x feature from 3.0 to 3.5—Java 17, GraalVM native images, virtual threads, Docker Compose, Testcontainers, and structured logging.",{"slug":2569,"date":2570,"published":11,"tags":2571,"author":1851,"cover":2572,"video":10,"excerpt":10,"shortDesc":2567},"spring-boot-3-features","2025-09-17T09:00:00.000Z",[1849,1850,2258],"spring_boot_3_features_cover.png",{"minutes":2574,"text":2575},52,"52 min read",{"_id":2577,"path":2578,"title":2579,"description":2580,"meta":2581,"readingTime":2588},"blog\u002Fblog\u002F2025\u002F04\u002F09\u002Fjdk-24-virtual-threads-without-pinning.md","\u002Fblog\u002F2025\u002F04\u002F09\u002Fjdk-24-virtual-threads-without-pinning","JDK 24's Major Improvement: Virtual Threads Without Pinning","Discover JDK 24's breakthrough enhancement that eliminates virtual thread pinning with synchronized blocks and methods. This comprehensive guide explores how this change revolutionizes Java concurrency, dramatically improving scalability for Spring Boot applications with legacy synchronized code. You'll learn about the technical details of thread pinning, see practical performance comparisons, and get hands-on examples showing how to leverage this feature in real-world applications for maximum throughput and efficiency.",{"slug":2582,"date":2583,"published":11,"tags":2584,"author":1851,"cover":2585,"video":2586,"excerpt":10,"shortDesc":2587},"jdk-24-virtual-threads-without-pinning","2025-04-09T17:00:00.000Z",[1850,2442],".\u002Fjdk_24_virtual_threads_pinning_cover_image.png","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FV4gsffMge7E","Discover JDK 24's breakthrough enhancement that eliminates virtual thread pinning with synchronized blocks and methods. This comprehensive guide explores how this change revolutionizes Java concurrency, dramatically improving scalability for Spring Boot applications with legacy synchronized code. You'll learn about the technical details of thread pinning, see practical performance comparisons, and...",{"minutes":1322,"text":2080},{"_id":2590,"path":2591,"title":2592,"description":2593,"meta":2594,"readingTime":2601},"blog\u002Fblog\u002F2025\u002F04\u002F07\u002Fdocker-model-runner.md","\u002Fblog\u002F2025\u002F04\u002F07\u002Fdocker-model-runner","Running AI Models Locally with Docker and Spring AI","Master Docker Desktop's revolutionary Model Runner feature and discover how to build privacy-first AI applications with Spring Boot. This complete tutorial shows you how to run powerful open-source AI models like Gemma locally on your machine, eliminating API costs, protecting sensitive data, and simplifying development workflows. You'll get step-by-step instructions for setting up local AI models, integrating with Spring AI, and building production-ready applications that respect privacy while delivering exceptional AI capabilities without monthly subscription fees.",{"slug":2595,"date":2596,"published":11,"tags":2597,"author":1851,"cover":2598,"video":2599,"excerpt":10,"shortDesc":2600},"docker-model-runner","2025-04-07T17:00:00.000Z",[1893],".\u002Frunning_with_docker_and_spring_ai_cover.png","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002F6E6JFLMHcoQ","Master Docker Desktop's revolutionary Model Runner feature and discover how to build privacy-first AI applications with Spring Boot. This complete tutorial shows you how to run powerful open-source AI models like Gemma locally on your machine, eliminating API costs, protecting sensitive data, and simplifying development workflows. You'll get step-by-step instructions...",{"minutes":740,"text":1978},{"_id":2603,"path":2604,"title":2605,"description":2606,"meta":2607,"readingTime":2612},"blog\u002Fblog\u002F2025\u002F03\u002F26\u002Fcreating-your-first-mcp-server-java.md","\u002Fblog\u002F2025\u002F03\u002F26\u002Fcreating-your-first-mcp-server-java","Creating Your First MCP Server in Java with Spring Boot","Build your first Model Context Protocol (MCP) server in Java using Spring Boot and Spring AI, exposing tools that let Claude and other AI models call your code.",{"slug":2608,"date":2609,"published":11,"tags":2610,"author":1851,"cover":10,"video":2611,"excerpt":10,"shortDesc":2606},"creating-your-first-mcp-server-java","2025-03-26T17:00:00.000Z",[1850,2442,2063],"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002Fw5YVHG1j3Co",{"minutes":764,"text":1966},{"_id":2614,"path":2615,"title":2616,"description":2617,"meta":2618,"readingTime":2622},"blog\u002Fblog\u002F2025\u002F03\u002F21\u002Fstream-gatherers.md","\u002Fblog\u002F2025\u002F03\u002F21\u002Fstream-gatherers","Stream Gatherers in JDK 24: Building Custom Intermediate Operations for the Stream API","Discover how the new Stream Gatherers feature in JDK 24 provides a more elegant solution for processing blog content compared to traditional stream operations.",{"slug":2619,"date":2620,"published":11,"tags":2621,"author":1851,"cover":10,"video":10,"excerpt":10,"shortDesc":2617},"stream-gatherers","2025-03-21T09:00:00.000Z",[1850],{"minutes":1464,"text":2623},"31 min read",{"_id":2625,"path":2626,"title":2627,"description":2628,"meta":2629,"readingTime":2634},"blog\u002Fblog\u002F2025\u002F03\u002F11\u002Fmodel-context-protocol-introduction.md","\u002Fblog\u002F2025\u002F03\u002F11\u002Fmodel-context-protocol-introduction","Supercharge Your LLM Applications with Model Context Protocol (MCP)","Learn how Model Context Protocol (MCP) enables LLMs to access external data sources and tools, with practical implementation guides for getting started today.",{"slug":2630,"date":2631,"published":11,"tags":2632,"author":1851,"cover":10,"video":2633,"excerpt":10,"shortDesc":2628},"model-context-protocol-introduction","2025-03-11T17:00:00.000Z",[1893,2063],"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FnNLshWCoe0o",{"minutes":740,"text":1978},{"_id":2636,"path":2637,"title":2638,"description":2639,"meta":2640,"readingTime":2644},"blog\u002Fblog\u002F2025\u002F02\u002F27\u002Fai-powered-dev-hacks-confoo-2025.md","\u002Fblog\u002F2025\u002F02\u002F27\u002Fai-powered-dev-hacks-confoo-2025","AI-Powered Dev Hacks at ConFoo 2025","Recently, I had the pleasure of presenting on a topic that I'm pretty passionate about: how artificial intelligence can amplify developer productivity and creativity.",{"slug":2641,"date":2642,"published":11,"tags":2643,"author":1851,"cover":10,"video":10,"excerpt":10,"shortDesc":2639},"ai-powered-dev-hacks-confoo-2025","2025-02-27T09:00:00.000Z",[1848],{"minutes":475,"text":2645},"6 min read",{"_id":2647,"path":2648,"title":2649,"description":2650,"meta":2651,"readingTime":2656},"blog\u002Fblog\u002F2024\u002F12\u002F02\u002Fspring-boot-graphql-query-by-example.md","\u002Fblog\u002F2024\u002F12\u002F02\u002Fspring-boot-graphql-query-by-example","Building Dynamic GraphQL APIs with Spring Boot and Query by Example","Learn how to build flexible and maintainable GraphQL APIs using Spring Boot's Query by Example support, reducing boilerplate code while enabling powerful search capabilities.",{"slug":2652,"date":2653,"published":11,"tags":2654,"author":1851,"cover":10,"video":2655,"excerpt":10,"shortDesc":2650},"spring-boot-graphql-query-by-example","2024-12-02T09:00:00.000Z",[2219,1849],"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FJ8vC8RflPPY",{"minutes":495,"text":2041},{"_id":2658,"path":2659,"title":2660,"description":2661,"meta":2662,"readingTime":2667},"blog\u002Fblog\u002F2024\u002F11\u002F11\u002Fno-lombok.md","\u002Fblog\u002F2024\u002F11\u002F11\u002Fno-lombok","Modern Java: Why You Might Not Need Lombok Anymore","A detailed exploration of why Java developers should reconsider using Project Lombok, examining its drawbacks and modern alternatives in Java development.",{"slug":2663,"date":2664,"published":11,"tags":2665,"author":1851,"cover":2666,"video":10,"excerpt":10,"shortDesc":2661},"no-lombok","2024-11-11T09:00:00.000Z",[1850],".\u002Fno_lombok_cover.png",{"minutes":712,"text":1855},{"_id":2669,"path":2670,"title":2671,"description":2672,"meta":2673,"readingTime":2678},"blog\u002Fblog\u002F2024\u002F11\u002F08\u002Fspring-data-jpa-query-by-example.md","\u002Fblog\u002F2024\u002F11\u002F08\u002Fspring-data-jpa-query-by-example","Query By Example in Spring Data JPA: A Clean Approach to Dynamic Queries","Learn how to simplify your Spring Data JPA queries using Query By Example (QBE) and create dynamic, type-safe queries without the boilerplate code.",{"slug":2674,"date":2675,"published":11,"tags":2676,"author":1851,"cover":10,"video":2677,"excerpt":10,"shortDesc":2672},"spring-data-jpa-query-by-example","2024-11-08T17:00:00.000Z",[1849,2076],"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FNGVWHdGNbiI",{"minutes":495,"text":2041},{"_id":2680,"path":2681,"title":2682,"description":2683,"meta":2684,"readingTime":2689},"blog\u002Fblog\u002F2024\u002F11\u002F05\u002Frest-client-oauth2-support.md","\u002Fblog\u002F2024\u002F11\u002F05\u002Frest-client-oauth2-support","RestClient OAuth2 Support in Spring Security 6.4: A Complete Guide","Learn how to implement OAuth2 authentication in your Spring applications using the new RestClient OAuth2 support in Spring Security 6.4. This guide covers architecture, implementation, and best practices for secure service-to-service communication.",{"slug":2685,"date":2686,"published":11,"tags":2687,"author":1851,"cover":10,"video":2688,"excerpt":10,"shortDesc":2683},"rest-client-oauth2-support","2024-11-05T17:00:00.000Z",[1849,2380],"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FnFKcJDpUuZ8",{"minutes":501,"text":2094},{"_id":2691,"path":2692,"title":2693,"description":2694,"meta":2695,"readingTime":2700},"blog\u002Fblog\u002F2024\u002F11\u002F01\u002Fspring-ai-tokens.md","\u002Fblog\u002F2024\u002F11\u002F01\u002Fspring-ai-tokens","Understanding Tokens in Large Language Models with Spring AI","Learn how to track and manage token usage in Spring AI applications, including implementing custom response types and automated logging with AOP.",{"slug":2696,"date":2697,"published":11,"tags":2698,"author":1851,"cover":10,"video":2699,"excerpt":10,"shortDesc":2694},"spring-ai-tokens","2024-11-01T17:00:00.000Z",[1893],"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FZUCVRppXPSc",{"minutes":718,"text":1868},{"_id":2702,"path":2703,"title":2704,"description":2705,"meta":2706,"readingTime":2712},"blog\u002Fblog\u002F2024\u002F10\u002F31\u002Fspring-boot-rest-client-logging.md","\u002Fblog\u002F2024\u002F10\u002F31\u002Fspring-boot-rest-client-logging","Implementing Request\u002FResponse Logging with Spring Boot's Rest Client","Learn how to implement clean and efficient request\u002Fresponse logging for Spring Boot's Rest Client, including both inline and interceptor-based approaches.",{"slug":2707,"date":2708,"published":11,"tags":2709,"author":1851,"cover":10,"video":2711,"excerpt":10,"shortDesc":2705},"spring-boot-rest-client-logging","2024-10-31T09:00:00.000Z",[1849,2710],"Rest Client","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002Fl35P5GylXN8",{"minutes":754,"text":2119},{"_id":2714,"path":2715,"title":2716,"description":2717,"meta":2718,"readingTime":2723},"blog\u002Fblog\u002F2024\u002F10\u002F29\u002Fspring-boot-environment-variables.md","\u002Fblog\u002F2024\u002F10\u002F29\u002Fspring-boot-environment-variables","Using Environment Variables in Spring Boot","Learn how to effectively manage configuration and secure sensitive data using environment variables in Spring Boot applications. This comprehensive guide covers best practices, security considerations, and practical examples.",{"slug":2719,"date":2720,"published":11,"tags":2721,"author":1851,"cover":10,"video":2722,"excerpt":10,"shortDesc":2717},"spring-boot-environment-variables","2024-10-29T17:00:00.000Z",[1849],"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FrQV76dufxz4",{"minutes":481,"text":2002},{"_id":2725,"path":2726,"title":2727,"description":2728,"meta":2729,"readingTime":2735},"blog\u002Fblog\u002F2024\u002F10\u002F24\u002Fspring-boot-oauth-demo.md","\u002Fblog\u002F2024\u002F10\u002F24\u002Fspring-boot-oauth-demo","Building a Spring Security Login Form with JTE","Learn how to create a secure login form using Spring Security and JTE (Java Template Engine) with support for both traditional authentication and OAuth2 providers.",{"slug":2730,"date":2731,"published":11,"tags":2732,"author":1851,"cover":2733,"video":2734,"excerpt":10,"shortDesc":2728},"spring-boot-oauth-demo","2024-10-24T17:00:00.000Z",[1849,2380],".\u002Fspring-security-jte-login.png","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002Ff1h4GkhxMp8",{"minutes":1344,"text":2736},"20 min read",{"_id":2738,"path":2739,"title":2740,"description":2741,"meta":2742,"readingTime":2747},"blog\u002Fblog\u002F2024\u002F10\u002F22\u002Fgetting-started-with-spring-ai-rag.md","\u002Fblog\u002F2024\u002F10\u002F22\u002Fgetting-started-with-spring-ai-rag","Getting Started with Spring AI and RAG: A Practical Guide","Learn how to build intelligent applications using Retrieval Augmented Generation (RAG) with Spring AI. This practical guide covers everything from understanding tokens and context windows to implementing a full RAG solution.",{"slug":2743,"date":2744,"published":11,"tags":2745,"author":1851,"cover":10,"video":2746,"excerpt":10,"shortDesc":2741},"getting-started-with-spring-ai-rag","2024-10-22T09:00:00.000Z",[14,1935,13],"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002F6Pgmr7xMjiY",{"minutes":495,"text":2041},{"_id":2749,"path":2750,"title":2751,"description":2752,"meta":2753,"readingTime":2758},"blog\u002Fblog\u002F2024\u002F10\u002F15\u002Fai-java-developers.md","\u002Fblog\u002F2024\u002F10\u002F15\u002Fai-java-developers","Building Generative AI Applications in Java: From Simple Scripts to Spring Boot","Explore how Java developers can leverage generative AI, from basic curl commands to robust Spring Boot applications. Learn to integrate OpenAI's GPT models, use Java's HTTP client, and harness the power of Spring AI for structured output and simplified AI integration.",{"slug":2754,"date":2755,"published":11,"tags":2756,"author":1851,"cover":10,"video":2757,"excerpt":10,"shortDesc":2752},"ai-java-developers","2024-10-15T09:00:00.000Z",[1850,1849,1848],"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FuoOwVWVl_eU",{"minutes":495,"text":2041},{"_id":2760,"path":2761,"title":2762,"description":2763,"meta":2764,"readingTime":2769},"blog\u002Fblog\u002F2024\u002F10\u002F14\u002Fspring-ai-multiple-llms.md","\u002Fblog\u002F2024\u002F10\u002F14\u002Fspring-ai-multiple-llms","Calling Multiple LLMs with Spring AI: A Practical Guide","Learn how to integrate and call multiple Large Language Models (LLMs) like OpenAI's GPT-4 and Anthropic's Claude in a single Spring Boot application using Spring AI. This tutorial covers project setup, configuration, and implementation of separate controllers for each LLM.",{"slug":2765,"date":2766,"published":11,"tags":2767,"author":1851,"cover":10,"video":2768,"excerpt":10,"shortDesc":2763},"spring-ai-multiple-llms","2024-10-14T09:00:00.000Z",[1849,1850,1893],"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FbK1MTlEDQvk",{"minutes":495,"text":2041},{"_id":2771,"path":2772,"title":2773,"description":2774,"meta":2775,"readingTime":2780},"blog\u002Fblog\u002F2024\u002F10\u002F11\u002Fspring-ai-chat-memory.md","\u002Fblog\u002F2024\u002F10\u002F11\u002Fspring-ai-chat-memory","Building Intelligent Chatbots with Spring AI: Implementing Chat Memory","Learn how to create a context-aware chatbot using Spring AI and OpenAI. This tutorial covers implementing chat memory, handling token usage, and managing context window limitations for more engaging AI conversations.",{"slug":2776,"date":2777,"published":11,"tags":2778,"author":1851,"cover":10,"video":2779,"excerpt":10,"shortDesc":2774},"spring-ai-chat-memory","2024-10-11T09:00:00.000Z",[1849,1850,1893],"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002F6VdM1MOOMrw",{"minutes":506,"text":1883},{"_id":2782,"path":2783,"title":2784,"description":2785,"meta":2786,"readingTime":2791},"blog\u002Fblog\u002F2024\u002F10\u002F08\u002Fspring-ai-streaming-chatbot.md","\u002Fblog\u002F2024\u002F10\u002F08\u002Fspring-ai-streaming-chatbot","Building a Streaming Chat Bot with Spring Boot and Spring AI","Learn how to create a responsive and engaging chat bot using Spring Boot and Spring AI, featuring both traditional and streaming response capabilities for an enhanced user experience.",{"slug":2787,"date":2788,"published":11,"tags":2789,"author":1851,"cover":10,"video":2790,"excerpt":10,"shortDesc":2785},"spring-ai-streaming-chatbot","2024-10-08T20:00:00.000Z",[1849,1850,1893],"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002Fq2p0mG4RICM",{"minutes":1331,"text":1925},{"_id":2793,"path":2794,"title":2795,"description":2796,"meta":2797,"readingTime":2802},"blog\u002Fblog\u002F2024\u002F10\u002F07\u002Fjte-forms.md","\u002Fblog\u002F2024\u002F10\u002F07\u002Fjte-forms","Building Dynamic Forms with Spring Boot and JTE: A Practical Guide","Learn how to create interactive web forms using Spring Boot and Java Template Engine (JTE) in this comprehensive tutorial.",{"slug":2798,"date":2799,"published":11,"tags":2800,"author":1851,"cover":10,"video":2801,"excerpt":10,"shortDesc":2796},"jte-forms","2024-10-07T20:00:00.000Z",[1849,1850],"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002Fifnv4kGtZgo",{"minutes":495,"text":2041},{"_id":2804,"path":2805,"title":2806,"description":2807,"meta":2808,"readingTime":2813},"blog\u002Fblog\u002F2024\u002F10\u002F06\u002Fspring-boot-jte-htmx.md","\u002Fblog\u002F2024\u002F10\u002F06\u002Fspring-boot-jte-htmx","Building a Dynamic Task Manager with Spring Boot, JTE, and HTMX","Learn how to build a dynamic Task manager using Spring Boot, Java Template Engine (JTE), HTMX and Tailwind CSS.",{"slug":2809,"date":2810,"published":11,"tags":2811,"author":1851,"cover":10,"video":2812,"excerpt":10,"shortDesc":2807},"spring-boot-jte-htmx","2024-10-06T20:00:00.000Z",[1849,1850],"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FkFksiDRZ824",{"minutes":764,"text":1966},{"_id":2815,"path":2816,"title":2817,"description":2818,"meta":2819,"readingTime":2824},"blog\u002Fblog\u002F2024\u002F10\u002F03\u002Fjte-layouts.md","\u002Fblog\u002F2024\u002F10\u002F03\u002Fjte-layouts","Getting started with Java Template Engine (JTE) layouts in Spring Boot","Learn how to use layouts with Java Template Engine in your next Spring Boot Application",{"slug":2820,"date":2821,"published":11,"tags":2822,"author":1851,"cover":10,"video":2823,"excerpt":10,"shortDesc":2818},"jte-layouts","2024-10-03T20:00:00.000Z",[1849,1850],"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FdWe-C3-YQEg",{"minutes":506,"text":1883},{"_id":2826,"path":2827,"title":2828,"description":2829,"meta":2830,"readingTime":2835},"blog\u002Fblog\u002F2024\u002F10\u002F01\u002Fhello-jte.md","\u002Fblog\u002F2024\u002F10\u002F01\u002Fhello-jte","Introducing JTE: The Latest Template Engine in Spring Boot","Explore JTE, the new Java Template Engine now available in Spring Initializer. Learn its benefits, how to get started, and why you might choose it for your next Spring Boot project.",{"slug":2831,"date":2832,"published":11,"tags":2833,"author":1851,"cover":10,"video":2834,"excerpt":10,"shortDesc":2829},"hello-jte","2024-10-01T20:00:00.000Z",[1849,1850],"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FKoWgHSWA1cc",{"minutes":495,"text":2041},{"_id":2837,"path":2838,"title":2839,"description":2840,"meta":2841,"readingTime":2846},"blog\u002Fblog\u002F2024\u002F09\u002F12\u002Fjdk-23-first-look.md","\u002Fblog\u002F2024\u002F09\u002F12\u002Fjdk-23-first-look","What's new in JDK 23","Explore the exciting new features and improvements coming in Java 23, including primitive types in patterns, Markdown documentation comments, and enhancements to garbage collection and concurrency.",{"slug":2842,"date":2843,"published":11,"tags":2844,"author":1851,"cover":2845,"video":10,"excerpt":10,"shortDesc":2840},"jdk-23-first-look","2024-09-12T17:00:00.000Z",[13],".\u002Fjdk-23.png",{"minutes":1313,"text":1912},{"_id":2848,"path":2849,"title":2850,"description":2851,"meta":2852,"readingTime":2858},"blog\u002Fblog\u002F2024\u002F08\u002F07\u002Fclaude-sonnet-spring-ai.md","\u002Fblog\u002F2024\u002F08\u002F07\u002Fclaude-sonnet-spring-ai","Supercharge Your Spring Apps with AI - A Beginner's Guide to Claude 3.5 Sonnet and Spring AI","Unlock the power of artificial intelligence in your Java applications with Claude 3.5 Sonnet and Spring AI. This beginner-friendly guide walks you through integrating cutting-edge AI capabilities into your Spring projects, opening up a world of possibilities for smart, responsive applications.",{"slug":2853,"date":2854,"published":11,"tags":2855,"author":1851,"cover":2857,"video":10,"excerpt":10,"shortDesc":2851},"claude-sonnet-spring-ai","2024-08-07T17:00:00.000Z",[2856,1893,1850],"Artificial Intelligence (AI)",".\u002Fclaude_sonnet_spring_ai_cover.png",{"minutes":718,"text":1868},{"_id":2860,"path":2861,"title":2862,"description":2863,"meta":2864,"readingTime":2869},"blog\u002Fblog\u002F2024\u002F08\u002F06\u002Fclaude-sonnet-35.md","\u002Fblog\u002F2024\u002F08\u002F06\u002Fclaude-sonnet-35","Claude 3.5 Sonnet - AI Assistance with Speed and Artifacts","Claude 3.5 Sonnet, Anthropic's latest AI model, sets new benchmarks in intelligence, speed, and capabilities across various domains. This blog post explores the key features of Claude 3.5 Sonnet, including its enhanced performance and the groundbreaking Artifacts feature, which enables real-time collaboration between users and AI.",{"slug":2865,"date":2866,"published":11,"tags":2867,"author":1851,"cover":2868,"video":10,"excerpt":10,"shortDesc":2863},"claude-sonnet-35","2024-08-06T17:00:00.000Z",[2856],".\u002Fclaude-sonnet-35.jpeg",{"minutes":1455,"text":2870},"30 min read",{"_id":2872,"path":2873,"title":2874,"description":2875,"meta":2876,"readingTime":2882},"blog\u002Fblog\u002F2024\u002F08\u002F05\u002Follama-web-ui.md","\u002Fblog\u002F2024\u002F08\u002F05\u002Follama-web-ui","Harnessing Local LLMs - A Practical Guide to Ollama and Open Web UI","This guide introduces Ollama, a tool for running large language models (LLMs) locally, and its integration with Open Web UI. It highlights the cost and security benefits of local LLM deployment, providing setup instructions for Ollama and demonstrating how to use Open Web UI for enhanced model interaction.",{"slug":2877,"date":2878,"published":11,"tags":2879,"author":1851,"cover":2880,"video":2881,"excerpt":10,"shortDesc":2875},"ollama-web-ui","2024-08-05T09:00:00.000Z",[1848],"ollama_web_ui.jpeg","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FBzFafshQkWw",{"minutes":490,"text":1953},{"_id":2884,"path":2885,"title":2886,"description":2887,"meta":2888,"readingTime":2895},"blog\u002Fblog\u002F2024\u002F08\u002F01\u002Fjava-method-references.md","\u002Fblog\u002F2024\u002F08\u002F01\u002Fjava-method-references","Method References in Java: A Beginner's Guide (Java 8+)","Learn what method references are in Java, when to use them, and all four types—static, instance, arbitrary object, and constructor—with clear :: examples.",{"slug":2889,"date":2890,"published":11,"tags":2891,"author":1851,"cover":2893,"video":2894,"excerpt":10,"shortDesc":2887},"java-method-references","2024-08-01T09:00:00.000Z",[1850,2892],"Functional Programming","java_method_references_with_me.png","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FDELCbBuCHHE",{"minutes":490,"text":1953},{"_id":2897,"path":2898,"title":2899,"description":2900,"meta":2901,"readingTime":2908},"blog\u002Fblog\u002F2024\u002F07\u002F18\u002Fspring-boot-tailwind.md","\u002Fblog\u002F2024\u002F07\u002F18\u002Fspring-boot-tailwind","How to add Tailwind CSS to your Spring Boot Application","This is an example of how to use Tailwind CSS in your next Spring Boot application. If you just want to get up and running with Tailwind CSS you can use a CDN but this should only be used for prototyping because you will end up shipping a very large css file to production. In this tutorial you will learn how to introduce a build process to only use the styles you are using.",{"slug":2902,"date":2903,"published":11,"tags":2904,"author":1851,"cover":2905,"video":2906,"excerpt":10,"shortDesc":2907},"spring-boot-tailwind","2024-07-18T17:00:00.000Z",[1849,2037],".\u002Fspring-boot-tailwind.jpeg","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002F6_6AIzxPXvQ","This is an example of how to use Tailwind CSS in your next Spring Boot application. If you just want to get up and running with Tailwind CSS you can use a CDN but this should only be used for prototyping because you will end up shipping a very large...",{"minutes":764,"text":1966},{"_id":2910,"path":2911,"title":2912,"description":2913,"meta":2914,"readingTime":2921},"blog\u002Fblog\u002F2024\u002F07\u002F10\u002Fjava-gpt-4o.md","\u002Fblog\u002F2024\u002F07\u002F10\u002Fjava-gpt-4o","Getting Started with Open AI's GPT-4o in Java","In this tutorial you will learn how to access OpenAI's newest model, GPT-4o in Java without using any dependencies. As a Java developer, there are several highlights you would be excited about – 50% lower pricing, two times faster latency, and five times the rate limits.",{"slug":2915,"date":2916,"published":11,"tags":2917,"author":1851,"cover":2919,"video":2920,"excerpt":10,"shortDesc":2913},"java-gpt-4o","2024-07-10T17:00:00.000Z",[1850,2918,2856],"OpenAI",".\u002Fjava-gpt-4o-cover.jpg","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FEDJLHWcFvpQ",{"minutes":506,"text":1883},{"_id":2923,"path":2924,"title":2925,"description":2926,"meta":2927,"readingTime":2933},"blog\u002Fblog\u002F2024\u002F06\u002F20\u002Fspring-ai-m1.md","\u002Fblog\u002F2024\u002F06\u002F20\u002Fspring-ai-m1","What's New in Spring AI 1.0.0 M1","In this article you learn about what is new in the latest release of Spring AI, 1.0.0 M1. The milestone comes packed full of features headlined by the new Chat Client that has a fluent API.",{"slug":2928,"date":2929,"published":11,"tags":2930,"author":1851,"cover":2931,"video":2932,"excerpt":10,"shortDesc":2926},"spring-ai-m1","2024-06-20T17:00:00.000Z",[1849,1893],".\u002Fspring_ai_m1_03.png","https:\u002F\u002Fyoutube.com\u002Fembed\u002FDe9a-TaJImI",{"minutes":754,"text":2119},{"_id":2935,"path":2936,"title":2937,"description":2938,"meta":2939,"readingTime":2945},"blog\u002Fblog\u002F2024\u002F06\u002F03\u002Fspring-io-2024.md","\u002Fblog\u002F2024\u002F06\u002F03\u002Fspring-io-2024","Spring I\u002FO 2024","I just returned from my very first Spring I\u002FO and I thought this would be a great opportunity to tell you about one of the best conferences I have eve been to. I am very fortunate to be able to travel the world visiting customers and conferences but this was by far one of my favorite trips ever.",{"slug":2940,"date":2941,"published":11,"tags":2942,"author":1851,"cover":2943,"video":10,"excerpt":10,"shortDesc":2944},"spring-io-2024","2024-06-03T17:00:00.000Z",[1849],".\u002Fspring_io_cover.jpeg","I just returned from my very first Spring I\u002FO and I thought this would be a great opportunity to tell you about one of the best conferences I have eve been to. I am very fortunate to be able to travel the world visiting customers and conferences but this was...",{"minutes":1358,"text":1897},{"_id":2947,"path":2948,"title":2949,"description":2950,"meta":2951,"readingTime":2957},"blog\u002Fblog\u002F2024\u002F01\u002F21\u002Fjava-champion.md","\u002Fblog\u002F2024\u002F01\u002F21\u002Fjava-champion","I'm a Java Champion","On Monday, January 8th, I woke up expecting just another day. Little did I know that this would become a day etched in my memory forever. In this post I would like to tell you about my career and how I became I Java Champion.",{"slug":2952,"date":2953,"published":11,"tags":2954,"author":1851,"cover":2956,"video":10,"excerpt":10,"shortDesc":2950},"java-champion","2024-01-21T17:00:00.000Z",[1850,2955],"Meta",".\u002Fjava-champion-cover.png",{"minutes":506,"text":1883},{"_id":2959,"path":2960,"title":2961,"description":2962,"meta":2963,"readingTime":2969},"blog\u002Fblog\u002F2024\u002F01\u002F15\u002Fdeveloper-advocate.md","\u002Fblog\u002F2024\u002F01\u002F15\u002Fdeveloper-advocate","What is Developer Relations and How do you define Developer Advocacy?","In this article, I'll provide an overview of Developer Relations (DevRel) and guide you on how to get started. If you're considering this as a potential career, I hope to inform and inspire you.",{"slug":2964,"date":2965,"published":11,"tags":2966,"author":1851,"cover":2968,"video":10,"excerpt":10,"shortDesc":2962},"developer-advocate","2024-01-15T17:00:00.000Z",[2967],"DevRel",".\u002Fdeveloper-advocate.png",{"minutes":1371,"text":2184},{"_id":2971,"path":2972,"title":2973,"description":2974,"meta":2975,"readingTime":2980},"blog\u002Fblog\u002F2024\u002F01\u002F01\u002Fhappy-new-year-2024.md","\u002Fblog\u002F2024\u002F01\u002F01\u002Fhappy-new-year-2024","Happy New Year 2024","In this article I will take a look at some goals and things I want to focus on in the new year.",{"slug":2976,"date":2977,"published":11,"tags":2978,"author":1851,"cover":2979,"video":10,"excerpt":10,"shortDesc":2974},"happy-new-year-2024","2024-01-01T17:00:00.000Z",[2955],"photo-1701170633885-7209b1bf10ee.jpeg",{"minutes":475,"text":2645},{"_id":2982,"path":2983,"title":2984,"description":2985,"meta":2986,"readingTime":2991},"blog\u002Fblog\u002F2023\u002F12\u002F30\u002F2023-year-in-review.md","\u002Fblog\u002F2023\u002F12\u002F30\u002F2023-year-in-review","2023 Year in Review","In this article I take a look back at 2023 and share some of the highlights from the year.",{"slug":2987,"date":2988,"published":11,"tags":2989,"author":1851,"cover":2990,"video":10,"excerpt":10,"shortDesc":2985},"2023-year-in-review","2023-12-30T17:00:00.000Z",[2955],"behnam-norouzi-f_Bo19fq4Oc-unsplash.jpg",{"minutes":495,"text":2041},{"_id":2993,"path":2994,"title":2995,"description":2996,"meta":2997,"readingTime":3002},"blog\u002Fblog\u002F2023\u002F12\u002F20\u002Fspring-boot-3-2.md","\u002Fblog\u002F2023\u002F12\u002F20\u002Fspring-boot-3-2","What's New in Spring Boot 3.2","This article highlights some of the new features in the latest releases of Spring Framework 6.1 and Spring Boot 3.2.",{"slug":2998,"date":2999,"published":11,"tags":3000,"author":1851,"cover":3001,"video":10,"excerpt":10,"shortDesc":2996},"spring-boot-3-2","2023-12-20T17:00:00.000Z",[1849],"whats-new.jpeg",{"minutes":1432,"text":2384},{"_id":3004,"path":3005,"title":3006,"description":3007,"meta":3008,"readingTime":3014},"blog\u002Fblog\u002F2023\u002F12\u002F14\u002Fvirtual-threads-spring-boot.md","\u002Fblog\u002F2023\u002F12\u002F14\u002Fvirtual-threads-spring-boot","Virtual Threads in Spring Boot","In this article, we will discuss Virtual Threads in Java, their significance for Spring Boot developers, and how they can enhance the performance of certain types of Spring Boot applications.",{"slug":3009,"date":3010,"published":11,"tags":3011,"author":1851,"cover":3012,"video":3013,"excerpt":10,"shortDesc":3007},"virtual-threads-spring-boot","2023-12-14T17:00:00.000Z",[1850,1849],"spring-boot-virtual-threads.png","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FTHavIYnlwck",{"minutes":718,"text":1868},{"_id":3016,"path":3017,"title":3018,"description":3019,"meta":3020,"readingTime":3026},"blog\u002Fblog\u002F2023\u002F09\u002F17\u002Fspring-boot-actuator.md","\u002Fblog\u002F2023\u002F09\u002F17\u002Fspring-boot-actuator","The Spring Boot Actuator is the one dependency you should include in every project","In this article, we will focus on the most important Spring Boot starter that you should include in all of your projects. The Spring Boot Actuator.",{"slug":3021,"date":3022,"published":11,"tags":3023,"author":1851,"cover":3024,"video":3025,"excerpt":10,"shortDesc":3019},"spring-boot-actuator","2023-09-17T17:00:00.000Z",[1849],"spring-boot-actuator.png","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002F4OVe0MWgZ4k",{"minutes":495,"text":2041},{"_id":3028,"path":3029,"title":3030,"description":3031,"meta":3032,"readingTime":3038},"blog\u002Fblog\u002F2023\u002F09\u002F11\u002Fspring-jdbc-client.md","\u002Fblog\u002F2023\u002F09\u002F11\u002Fspring-jdbc-client","A First Look at the new JDBC Client in Spring Boot 3.2","In this tutorial you will learn about the new JDBC Client in Spring Framework 6.1 and Spring Boot 3.2.",{"slug":3033,"date":3034,"published":11,"tags":3035,"author":1851,"cover":3036,"video":3037,"excerpt":10,"shortDesc":3031},"spring-jdbc-client","2023-09-11T17:00:00.000Z",[1849],".\u002Fspring-jdbc-client.png","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FJBu5GibEJ4k",{"minutes":1409,"text":2236},{"_id":3040,"path":3041,"title":3042,"description":3043,"meta":3044,"readingTime":3050},"blog\u002Fblog\u002F2023\u002F09\u002F08\u002Frest-client-first-look.md","\u002Fblog\u002F2023\u002F09\u002F08\u002Frest-client-first-look","A First Look at the new Rest Client in Spring Boot 3.2","This is my first look at the new Rest Client in Spring Boot 3.2. In this tutorial we will discuss what a client is, what are the different implementations of clients available and how to get started with the new Rest Client in Spring Framework 6.1 and Spring Boot 3.2",{"slug":3045,"date":3046,"published":11,"tags":3047,"author":1851,"cover":3048,"video":3049,"excerpt":10,"shortDesc":3043},"rest-client-first-look","2023-09-08T17:00:00.000Z",[1849],".\u002Fspring-boot-rest-client.png","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FUDNrJAvKc0k",{"minutes":1331,"text":1925},{"_id":3052,"path":3053,"title":3054,"description":3055,"meta":3056,"readingTime":3062},"blog\u002Fblog\u002F2023\u002F07\u002F17\u002Fpgadmin-docker-compose.md","\u002Fblog\u002F2023\u002F07\u002F17\u002Fpgadmin-docker-compose","Streamline Your Development: Spring Boot with PostgreSQL & pgAdmin in Docker","In this article you will learn about the new Docker Compose module in Spring Boot 3.1 and how to connect to a Postgres database from your application. You will also learn how to use psql in the shell and pgAdmin to manage your database.",{"slug":3057,"date":3058,"published":11,"tags":3059,"author":1851,"cover":3060,"video":3061,"excerpt":10,"shortDesc":3055},"pgadmin-docker-compose","2023-07-17T17:00:00.000Z",[1849],".\u002FpgAdminDockerCompose.png","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FXDlgWyVfSMA",{"minutes":712,"text":1855},{"_id":3064,"path":3065,"title":3066,"description":3067,"meta":3068,"readingTime":3074},"blog\u002Fblog\u002F2023\u002F07\u002F13\u002Fgraphql-schema-mapping-inspection.md","\u002Fblog\u002F2023\u002F07\u002F13\u002Fgraphql-schema-mapping-inspection","Spring for GraphQL Schema Mapping Inspection Report","Join VMware's Spring Developer Advocate, Dan Vega, as he explores the exciting new releases in Spring for GraphQL. Dive into the enhanced features of the inspection report, walk through how to create a project, and more!",{"slug":3069,"date":3070,"published":11,"tags":3071,"author":1851,"cover":3072,"video":3073,"excerpt":10,"shortDesc":3067},"graphql-schema-mapping-inspection","2023-07-13T15:00:00.000Z",[1849,2219],".\u002Fgraphql-schema-inspection.png","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FYBPG0JbHvpY",{"minutes":718,"text":1868},{"_id":3076,"path":3077,"title":3078,"description":3079,"meta":3080,"readingTime":3087},"blog\u002Fblog\u002F2023\u002F06\u002F30\u002Faws-lambda-spring-boot-3.md","\u002Fblog\u002F2023\u002F06\u002F30\u002Faws-lambda-spring-boot-3","Deploying Spring Boot 3 Applications to AWS Lambda","Discover effective solutions for hosting your personal spring boot projects without hefty costs. Boost your skills with Dan Vega, your spring developer advocate, while exploring the capabilities of AWS Lambda.",{"slug":3081,"date":3082,"published":11,"tags":3083,"author":1851,"cover":3085,"video":3086,"excerpt":10,"shortDesc":3079},"aws-lambda-spring-boot-3","2023-06-30T15:00:00.000Z",[1849,3084],"AWS",".\u002Faws-lambda-spring-boot-3-thumbnail.png","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FGGPPkUcHleQ",{"minutes":1313,"text":1912},{"_id":3089,"path":3090,"title":3091,"description":3092,"meta":3093,"readingTime":3100},"blog\u002Fblog\u002F2023\u002F06\u002F12\u002Fspring-http-interfaces-headers.md","\u002Fblog\u002F2023\u002F06\u002F12\u002Fspring-http-interfaces-headers","How to add Request Headers using HTTP Interfaces in Spring Boot 3","In this tutorial you will learn how to add a request header when using HTTP Interfaces in Spring Boot 3. This can be useful when you need to add a header to a single request or every single request. You will also learn how to view the headers that are sent to make sure everything is working properly.",{"slug":3094,"date":3095,"published":11,"tags":3096,"author":1851,"cover":3097,"video":3098,"excerpt":10,"shortDesc":3099},"spring-http-interfaces-headers","2023-06-14T08:00:00.000Z",[2258,1849],".\u002Fhttp-interface-request-headers.png","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FAOJzm7yFOl0","In this tutorial you will learn how to add a request header when using HTTP Interfaces in Spring Boot 3. This can be useful when you need to add a header to a single request or every single request. You will also learn how to view the headers that are...",{"minutes":469,"text":3101},"5 min read",{"_id":3103,"path":3104,"title":3105,"description":3106,"meta":3107,"readingTime":3112},"blog\u002Fblog\u002F2023\u002F06\u002F14\u002Fspring-http-interfaces.md","\u002Fblog\u002F2023\u002F06\u002F14\u002Fspring-http-interfaces","Spring HTTP Interface Clients: Consuming HTTP services in Spring Boot","Learn all about the new HTTP Interfaces in Spring Framework 6 and Spring Boot 3 by building out a real world example.",{"slug":3108,"date":3095,"published":11,"tags":3109,"author":1851,"cover":3110,"video":3111,"excerpt":10,"shortDesc":3106},"spring-http-interfaces",[2258,1849],".\u002Fhttp-interfaces-crud.png","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002F4U0hUyktpvg",{"minutes":740,"text":1978},{"_id":3114,"path":3115,"title":3116,"description":3117,"meta":3118,"readingTime":3123},"blog\u002Fblog\u002F2023\u002F05\u002F19\u002Faws-lambda-java-17.md","\u002Fblog\u002F2023\u002F05\u002F19\u002Faws-lambda-java-17","Java 17 🤝 AWS Lambda: Creating Serverless Functions in Java & Spring with Java 17","AWS has made a big announcement recently - Java 17 runtime is now supported on AWS Lambda. What this means is, you now have the freedom to write your lambda functions using Java in Spring and specifically target JDK 17.",{"slug":3119,"date":3120,"published":11,"tags":3121,"author":1851,"cover":3085,"video":3122,"excerpt":10,"shortDesc":3117},"aws-lambda-java-17","2023-05-19T08:00:00.000Z",[1849,3084,1850],"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FbxK4GscuVgs",{"minutes":506,"text":1883},{"_id":3125,"path":3126,"title":3127,"description":3128,"meta":3129,"readingTime":3135},"blog\u002Fblog\u002F2023\u002F05\u002F03\u002Fspring-session-introduction.md","\u002Fblog\u002F2023\u002F05\u002F03\u002Fspring-session-introduction","Demystifying Spring Session: A Comprehensive Introduction for Java Developers!","In this tutorial, we'll explore the powerful features of Spring Session and learn how to effectively manage user sessions in your Java web applications.",{"slug":3130,"date":3131,"published":11,"tags":3132,"author":1851,"cover":3133,"video":3134,"excerpt":10,"shortDesc":3128},"spring-session-introduction","2023-05-03T08:00:00.000Z",[2380],".\u002Fspring-session-thumbnail.png","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002Fk62bO-W6Sb0",{"minutes":495,"text":2041},{"_id":3137,"path":3138,"title":3139,"description":3140,"meta":3141,"readingTime":3147},"blog\u002Fblog\u002F2023\u002F04\u002F28\u002Fspring-security-oauth2-login.md","\u002Fblog\u002F2023\u002F04\u002F28\u002Fspring-security-oauth2-login","OAuth2 Login Made Easy in Java: A Spring Boot & Spring Security Walkthrough","In this tutorial, we will discuss how to set up OAuth 2 logins in Spring Security with Spring Boot.",{"slug":3142,"date":3143,"published":11,"tags":3144,"author":1851,"cover":3145,"video":3146,"excerpt":10,"shortDesc":3140},"spring-security-oauth2-login","2023-04-28T08:00:00.000Z",[2380],".\u002Fspring-security-oauth2-login.png","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002Fus0VjFiHogo",{"minutes":481,"text":2002},{"_id":3149,"path":3150,"title":3151,"description":3152,"meta":3153,"readingTime":3159},"blog\u002Fblog\u002F2023\u002F04\u002F26\u002Fspring-boot-docker-compose.md","\u002Fblog\u002F2023\u002F04\u002F26\u002Fspring-boot-docker-compose","🔥 New in Spring Boot 3.1 - Spring Boot Docker Compose Module","In this tutorial you will learn about the new Spring Boot Docker Compose Module. This module allows you to use Docker Compose files directly with Spring Boot applications.",{"slug":3154,"date":3155,"published":11,"tags":3156,"author":1851,"cover":3157,"video":3158,"excerpt":10,"shortDesc":3152},"spring-boot-docker-compose","2023-04-26T08:00:00.000Z",[1849],".\u002Fspring-boot-docker-compose.png","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FlS1GwdIfk0c",{"minutes":481,"text":2002},{"_id":3161,"path":3162,"title":3163,"description":3164,"meta":3165,"readingTime":3171},"blog\u002Fblog\u002F2023\u002F04\u002F20\u002Fmultiple-spring-security-configs.md","\u002Fblog\u002F2023\u002F04\u002F20\u002Fmultiple-spring-security-configs","Advanced Spring Security - How to create multiple Spring Security Configurations","In this tutorial, we will discuss how to create multiple Spring Security configurations and why you might want to do so.",{"slug":3166,"date":3167,"published":11,"tags":3168,"author":1851,"cover":3169,"video":3170,"excerpt":10,"shortDesc":3164},"multiple-spring-security-configs","2023-04-20T08:00:00.000Z",[2380],".\u002Fspring-security-multiple-configurations.png","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FPczgM2L3w60",{"minutes":718,"text":1868},{"_id":3173,"path":3174,"title":3175,"description":3176,"meta":3177,"readingTime":3184},"blog\u002Fblog\u002F2023\u002F04\u002F17\u002Fgraphql-client.md","\u002Fblog\u002F2023\u002F04\u002F17\u002Fgraphql-client","Create a GraphQL Client in Java with Spring Boot","If you're working on a Spring application and you need to call another REST API, you have tools such as RestTemplate or WebClient. But what if you need to call a GraphQL API? With Spring, a GraphQL Client is available. In this tutorial, you will learn how to include it in your project and use it by building a practical example.",{"slug":3178,"date":3179,"published":11,"tags":3180,"author":1851,"cover":3181,"video":3182,"excerpt":10,"shortDesc":3183},"graphql-client","2023-04-17T08:00:00.000Z",[1849,2219],".\u002Fgraphql-client-thumbnail.png","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FBuPItqaVeGo","If you're working on a Spring application and you need to call another REST API, you have tools such as RestTemplate or WebClient. But what if you need to call a GraphQL API? With Spring, a GraphQL Client is available. In this tutorial, you will learn how to include it...",{"minutes":490,"text":1953},{"_id":3186,"path":3187,"title":3188,"description":3189,"meta":3190,"readingTime":3196},"blog\u002Fblog\u002F2023\u002F04\u002F12\u002Fvirtual-threads-spring.md","\u002Fblog\u002F2023\u002F04\u002F12\u002Fvirtual-threads-spring","Project Loom Virtual Threads in Spring (JDK 19\u002F20 Preview)","Project Loom virtual threads explained for Spring developers: why thread-per-request breaks under load, and how to enable them in Spring on JDK 19\u002F20 preview.",{"slug":3191,"date":3192,"published":11,"tags":3193,"author":1851,"cover":3194,"video":3195,"excerpt":10,"shortDesc":3189},"virtual-threads-spring","2023-04-12T16:00:00.000Z",[1849,2219],".\u002Fvirtual-threads-spring-boot.png","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FIs5HXJhC3jE",{"minutes":481,"text":2002},{"_id":3198,"path":3199,"title":3200,"description":3201,"meta":3202,"readingTime":3208},"blog\u002Fblog\u002F2023\u002F03\u002F31\u002Fvideotap.md","\u002Fblog\u002F2023\u002F03\u002F31\u002Fvideotap","Why VideoTap is a Game-Changer for Content Creators: Convert Videos to Blog Posts in Minutes!","Are you a content creator who struggles to find enough time to produce written content alongside videos? Do you wish there was an easy way to transform your videos into compelling blog posts? Look no further than VideoTap!",{"slug":3203,"date":3204,"published":11,"tags":3205,"author":1851,"cover":3207,"video":10,"excerpt":10,"shortDesc":3201},"videotap","2023-03-31T16:00:00.000Z",[3206],"content",".\u002Fvideo-to-blogpost.png",{"minutes":475,"text":2645},{"_id":3210,"path":3211,"title":3212,"description":3213,"meta":3214,"readingTime":3220},"blog\u002Fblog\u002F2023\u002F03\u002F20\u002Fgraphql-mutations.md","\u002Fblog\u002F2023\u002F03\u002F20\u002Fgraphql-mutations","Working with GraphQL Mutations in Spring Boot","In this blog post, we'll be taking a look at mutations in GraphQL, specifically using Spring Boot, GraphQL Java, and Spring Data JPA.",{"slug":3215,"date":3216,"published":11,"tags":3217,"author":1851,"cover":3218,"video":3219,"excerpt":10,"shortDesc":3213},"graphql-mutations","2023-03-20T11:00:00.000Z",[2219,1849],".\u002Fgraphql-mutations.png","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002Fu3FFRq3-0CM",{"minutes":1358,"text":1897},{"_id":3222,"path":3223,"title":3224,"description":3225,"meta":3226,"readingTime":3232},"blog\u002Fblog\u002F2023\u002F03\u002F15\u002Fspring-security-lambda-dsl.md","\u002Fblog\u002F2023\u002F03\u002F15\u002Fspring-security-lambda-dsl","Spring Security Lambda DSL vs Chaining Configuration","Spring Security's Lambda DSL vs the older chaining style with and(). Configure a SecurityFilterChain both ways in Spring Boot and see which reads cleaner.",{"slug":3227,"date":3228,"published":11,"tags":3229,"author":1851,"cover":3230,"video":3231,"excerpt":10,"shortDesc":3225},"spring-security-lambda-dsl","2023-03-15T09:30:00.000Z",[2380],".\u002Fspring-security-lambda-dsl.png","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FPWnEZh_t0WI",{"minutes":501,"text":2094},{"_id":3234,"path":3235,"title":3236,"description":3237,"meta":3238,"readingTime":3245},"blog\u002Fblog\u002F2023\u002F03\u002F12\u002Fnotion-api-file-expired.md","\u002Fblog\u002F2023\u002F03\u002F12\u002Fnotion-api-file-expired","Notion API File URLs Expire: Fixing 403 Errors on Images","Notion API file URLs carry an expiry_time and expire after 1 hour, so your images start returning 403 Forbidden. Here's how I fixed it in a Nuxt 3 static site.",{"slug":3239,"date":3240,"published":11,"tags":3241,"author":1851,"cover":3244,"video":10,"excerpt":10,"shortDesc":3237},"notion-api-file-expired","2023-03-12T14:30:00.000Z",[3242,3243],"javascript","notion",".\u002Fnotion-cover-image.png",{"minutes":506,"text":1883},{"_id":3247,"path":3248,"title":3249,"description":3250,"meta":3251,"readingTime":3257},"blog\u002Fblog\u002F2023\u002F03\u002F09\u002Fspring-boot-crash-course.md","\u002Fblog\u002F2023\u002F03\u002F09\u002Fspring-boot-crash-course","Learn Spring & Spring Boot: A Free Crash Course for Beginners","New to Spring? This free crash course shows you where to start, whether to learn Spring or Spring Boot first, and how to build your first Spring Boot app.",{"slug":3252,"date":3253,"published":11,"tags":3254,"author":1851,"cover":3255,"video":3256,"excerpt":10,"shortDesc":3250},"spring-boot-crash-course","2023-03-09T11:30:00.000Z",[1849,2258],".\u002Fspring-boot-crash-course-new-thumbnail.png","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FUgX5lgv4uVM",{"minutes":718,"text":1868},{"_id":3259,"path":3260,"title":3261,"description":3262,"meta":3263,"readingTime":3271},"blog\u002Fblog\u002F2023\u002F03\u002F02\u002Fspring-shell-intro.md","\u002Fblog\u002F2023\u002F03\u002F02\u002Fspring-shell-intro","Building Command Line Applications in Spring with Spring Shell","In this introduction to Spring Shell, you will learn you how to build CLI applications in a familiar programming environment using Java + Spring.",{"slug":3264,"date":3265,"published":11,"tags":3266,"author":1851,"cover":3269,"video":3270,"excerpt":10,"shortDesc":3262},"spring-shell-intro","2023-03-02T11:00:00.000Z",[3267,3268],"spring shell","Spring boot",".\u002Fspring-shell-introduction.png","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002F8B0IjOIzicU",{"minutes":712,"text":1855},{"_id":3273,"path":3274,"title":3275,"description":3276,"meta":3277,"readingTime":3284},"blog\u002Fblog\u002F2023\u002F02\u002F03\u002Fnative-images-graalvm.md","\u002Fblog\u002F2023\u002F02\u002F03\u002Fnative-images-graalvm","Building Native Images in Java with GraalVM","Learn how to handle GraalVM Native Image reflection errors in Java by using the tracing agent to generate reachability metadata and fix ClassNotFoundException.",{"slug":3278,"date":3279,"published":11,"tags":3280,"author":1851,"cover":3282,"video":3283,"excerpt":10,"shortDesc":3276},"native-images-graalvm","2023-02-03T10:00:00.000Z",[13,3281],"graalvm",".\u002Fgraalvm-dynamic-new.png","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FRk4zfvVvRks",{"minutes":490,"text":1953},{"_id":3286,"path":3287,"title":3288,"description":3289,"meta":3290,"readingTime":3296},"blog\u002Fblog\u002F2023\u002F01\u002F31\u002Fgraphql-custom-scalars.md","\u002Fblog\u002F2023\u002F01\u002F31\u002Fgraphql-custom-scalars","GraphQL Scalars - How to use Custom Scalars in Java","Learn how to use GraphQL custom scalars in Java. We build a Spring Boot 3 app with Spring for GraphQL and register the BigDecimal and LocalDateTime scalars.",{"slug":3291,"date":3292,"published":11,"tags":3293,"author":1851,"cover":3294,"video":3295,"excerpt":10,"shortDesc":3289},"graphql-custom-scalars","2023-01-31T08:00:00.000Z",[1849,2219],".\u002Fgraphql-scalars-thumbnail.png","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002Fooknmgr4WiA",{"minutes":740,"text":1978},{"_id":3298,"path":3299,"title":3300,"description":3301,"meta":3302,"readingTime":3308},"blog\u002Fblog\u002F2023\u002F01\u002F27\u002Fjakarta-ee-10-uuid.md","\u002Fblog\u002F2023\u002F01\u002F27\u002Fjakarta-ee-10-uuid","Easily Implement UUIDs as Primary Keys in Spring Boot 3","In this tutorial you will learn how to use one of the new features in Jakarta EE 10 in a Spring Boot 3 application.",{"slug":3303,"date":3304,"published":11,"tags":3305,"author":1851,"cover":3306,"video":3307,"excerpt":10,"shortDesc":3301},"jakarta-ee-10-uuid","2023-01-27T10:00:00.000Z",[1849],".\u002Fjakarta_ee_10_uuid.png","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FZWwqcH__kr4",{"minutes":495,"text":2041},{"_id":3310,"path":3311,"title":3312,"description":3313,"meta":3314,"readingTime":3321},"blog\u002Fblog\u002F2023\u002F01\u002F01\u002Fhappy-new-year-2023.md","\u002Fblog\u002F2023\u002F01\u002F01\u002Fhappy-new-year-2023","Happy New Year 2023","Happy New Year! I want to take a few minutes and talk about a few of my priorities as we head into the new year.",{"slug":3315,"date":3316,"published":11,"tags":3317,"author":1851,"cover":3320,"video":10,"excerpt":10,"shortDesc":3313},"happy-new-year-2023","2023-01-01T10:00:00.000Z",[3318,3319],"meta","goals","kostiantyn-li-pTfOKdj8whk-unsplash.jpg",{"minutes":712,"text":1855},{"_id":3323,"path":3324,"title":3325,"description":3326,"meta":3327,"readingTime":3332},"blog\u002Fblog\u002F2022\u002F12\u002F29\u002F2022-reflections.md","\u002Fblog\u002F2022\u002F12\u002F29\u002F2022-reflections","2022 Reflections","In this article I am going to spend some time reflecting because I believe it's a good reminder of the good and the bad as I began to set some goals for next year.",{"slug":3328,"date":3329,"published":11,"tags":3330,"author":1851,"cover":3331,"video":10,"excerpt":10,"shortDesc":3326},"2022-reflections","2022-12-29T16:00:00.000Z",[3318],".\u002Fjose-m-reyes-0GBxtiFvzXE-unsplash.jpg",{"minutes":495,"text":2041},{"_id":3334,"path":3335,"title":3336,"description":3337,"meta":3338,"readingTime":3344},"blog\u002Fblog\u002F2022\u002F12\u002F19\u002Fspring-proxy-bean-methods.md","\u002Fblog\u002F2022\u002F12\u002F19\u002Fspring-proxy-bean-methods","Spring @Configuration proxyBeanMethods: Why Set It to False","Setting proxyBeanMethods = false on @Configuration drops the CGLIB proxy Spring adds. Learn why it matters for native images and how to refactor your beans.",{"slug":3339,"date":3340,"published":11,"tags":3341,"author":1851,"cover":3342,"video":3343,"excerpt":10,"shortDesc":3337},"spring-proxy-bean-methods","2022-12-19T10:00:00.000Z",[1849],".\u002Fproxy-bean-methods.png","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FVoK6-OiSPu4",{"minutes":495,"text":2041},{"_id":3346,"path":3347,"title":3348,"description":3349,"meta":3350,"readingTime":3356},"blog\u002Fblog\u002F2022\u002F12\u002F16\u002Fspring-response-entity.md","\u002Fblog\u002F2022\u002F12\u002F16\u002Fspring-response-entity","Spring Response Entity -  How to customize the response in Spring Boot","In this tutorial, you will learn what the ResponseEntity class is and how it can be used to customize the response in your Spring Boot application.",{"slug":3351,"date":3352,"published":11,"tags":3353,"author":1851,"cover":3354,"video":3355,"excerpt":10,"shortDesc":3349},"spring-response-entity","2022-12-16T12:00:00.000Z",[1849],".\u002Fspring-response-entity.png","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FB5Zrn1Tzyqw",{"minutes":475,"text":2645},{"_id":3358,"path":3359,"title":3360,"description":3361,"meta":3362,"readingTime":3368},"blog\u002Fblog\u002F2022\u002F12\u002F02\u002Faws-lambda-snapstart-spring.md","\u002Fblog\u002F2022\u002F12\u002F02\u002Faws-lambda-snapstart-spring","AWS Lambda SnapStart for Spring Developers","AWS Lambda SnapStart is a new performance optimization developed by AWS that can significantly improve the startup time for your applications.",{"slug":3363,"date":3364,"published":11,"tags":3365,"author":1851,"cover":3366,"video":3367,"excerpt":10,"shortDesc":3361},"aws-lambda-snapstart-spring","2022-12-02T08:00:00.000Z",[3084,1849],".\u002Faws_lambda_snapstart.png","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FisS6m6aj_Ak",{"minutes":463,"text":3369},"4 min read",{"_id":3371,"path":3372,"title":3373,"description":3374,"meta":3375,"readingTime":3381},"blog\u002Fblog\u002F2022\u002F12\u002F01\u002Fspring-security-6.md","\u002Fblog\u002F2022\u002F12\u002F01\u002Fspring-security-6","What's new in Spring Security 6","In this article we will discuss the new features of Spring Security 6 and create a new Spring Boot 3 project together.",{"slug":3376,"date":3377,"published":11,"tags":3378,"author":1851,"cover":3379,"video":3380,"excerpt":10,"shortDesc":3374},"spring-security-6","2022-12-01T16:00:00.000Z",[1849,2380],".\u002Fspring_security_6.png","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FTDOHbK39Oxg",{"minutes":475,"text":2645},{"_id":3383,"path":3384,"title":3385,"description":3386,"meta":3387,"readingTime":3393},"blog\u002Fblog\u002F2022\u002F11\u002F10\u002Faws-lambda-java-core.md","\u002Fblog\u002F2022\u002F11\u002F10\u002Faws-lambda-java-core","Building AWS Lambda Functions with Java: An Introduction to the AWS Lambda Core Java Library","In this tutorial you will learn how to build AWS Lambda functions with Java using the AWS Lambda Core Java Library.",{"slug":3388,"date":3389,"published":11,"tags":3390,"author":1851,"cover":3391,"video":3392,"excerpt":10,"shortDesc":3386},"aws-lambda-java-core","2022-11-10T08:00:00.000Z",[3084,13],".\u002Faws-lambda-java-core.png","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FkyWllXOGMWQ",{"minutes":718,"text":1868},{"_id":3395,"path":3396,"title":3397,"description":3398,"meta":3399,"readingTime":3405},"blog\u002Fblog\u002F2022\u002F11\u002F09\u002Fhello-aws-lambda-java.md","\u002Fblog\u002F2022\u002F11\u002F09\u002Fhello-aws-lambda-java","AWS Lambda Java: How to create your first AWS Lambda Function in Java","In this tutorial, I'll show you how to create a simple AWS Lambda function using Java.",{"slug":3400,"date":3401,"published":11,"tags":3402,"author":1851,"cover":3403,"video":3404,"excerpt":10,"shortDesc":3398},"hello-aws-lambda-java","2022-11-09T08:00:00.000Z",[3084,13],".\u002Fhello-aws-lambda.png","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FMaHxZEBRcT4",{"minutes":481,"text":2002},{"_id":3407,"path":3408,"title":3409,"description":3410,"meta":3411,"readingTime":3417},"blog\u002Fblog\u002F2022\u002F09\u002F29\u002Fdomain-class-converter.md","\u002Fblog\u002F2022\u002F09\u002F29\u002Fdomain-class-converter","Spring Boot REST API Domain Class Converter","In this tutorial, you will learn about a class called the Domain Class Converter in Spring Data. This class will allow you to take arbitrary input like an id from a path variable in a REST API and automatically create a domain object by using Spring Data's CrudRepository.",{"slug":3412,"date":3413,"published":11,"tags":3414,"author":1851,"cover":3415,"video":3416,"excerpt":10,"shortDesc":3410},"domain-class-converter","2022-09-29T11:00:00.000Z",[1849,2076],".\u002Fdomain-class-converter-thumbnail-small.png","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002F_QBe2ZiXV-0",{"minutes":506,"text":1883},{"_id":3419,"path":3420,"title":3421,"description":3422,"meta":3423,"readingTime":3429},"blog\u002Fblog\u002F2022\u002F09\u002F22\u002Fspring-security-cors.md","\u002Fblog\u002F2022\u002F09\u002F22\u002Fspring-security-cors","Spring Security CORS: How to Configure CORS in Spring Boot","Configure CORS in Spring Boot with @CrossOrigin, a WebMvcConfigurer, and a CorsConfigurationSource bean so Spring Security stops blocking preflight requests.",{"slug":3424,"date":3425,"published":11,"tags":3426,"author":1851,"cover":3427,"video":3428,"excerpt":10,"shortDesc":3422},"spring-security-cors","2022-09-22T08:00:00.000Z",[2380],".\u002Fss-cors-thumbnail.jpeg","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FHRwlT_etr60",{"minutes":718,"text":1868},{"_id":3431,"path":3432,"title":3433,"description":3434,"meta":3435,"readingTime":3441},"blog\u002Fblog\u002F2022\u002F09\u002F09\u002Fspring-security-jwt.md","\u002Fblog\u002F2022\u002F09\u002F09\u002Fspring-security-jwt","How to Secure your REST APIs with Spring Security & JSON Web Tokens (JWTs)","In this tutorial, you will learn how to secure REST APIs with Spring Security and JSON Web Tokens (JWTs).",{"slug":3436,"date":3437,"published":11,"tags":3438,"author":1851,"cover":3439,"video":3440,"excerpt":10,"shortDesc":3434},"spring-security-jwt","2022-09-09T16:00:00.000Z",[1849,2380],"spring-security-jwt-cover.jpeg","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FKYNR5js2cXE",{"minutes":1510,"text":3442},"35 min read",{"_id":3444,"path":3445,"title":3446,"description":3447,"meta":3448,"readingTime":3455},"blog\u002Fblog\u002F2022\u002F05\u002F17\u002Fspring-for-graphql.md","\u002Fblog\u002F2022\u002F05\u002F17\u002Fspring-for-graphql","GraphQL Spring Boot - Up and Running with Spring for GraphQL","In this tutorial you are going to learn how to get up and running with Spring for GraphQL.",{"slug":3449,"date":3450,"published":11,"tags":3451,"author":1851,"cover":3453,"video":3454,"excerpt":10,"shortDesc":3447},"spring-for-graphql","2022-05-17T16:00:00.000Z",[14,3452],"graphql",".\u002Fspring-for-graphql-thumbnail.png","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002F3PCNqXrU-2g",{"minutes":1562,"text":3456},"39 min read",{"_id":3458,"path":3459,"title":3460,"description":3461,"meta":3462,"readingTime":3468},"blog\u002Fblog\u002F2022\u002F05\u002F12\u002Fspring-data-jpa-pagination.md","\u002Fblog\u002F2022\u002F05\u002F12\u002Fspring-data-jpa-pagination","Spring Data JPA Pagination: Pageable and PageRequest Tutorial","Learn how to add pagination to a Spring Boot REST API with Spring Data JPA using Pageable, PageRequest, and the PagingAndSortingRepository, with code examples.",{"slug":3463,"date":3464,"published":11,"tags":3465,"author":1851,"cover":3466,"video":3467,"excerpt":10,"shortDesc":3461},"spring-data-jpa-pagination","2022-05-12T16:00:00.000Z",[2442,2076],".\u002Fspring-data-jpa-pagination-thumbnail.png","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002Foq-c3D67WqM",{"minutes":1409,"text":2236},{"_id":3470,"path":3471,"title":3472,"description":3473,"meta":3474,"readingTime":3480},"blog\u002Fblog\u002F2022\u002F05\u002F11\u002Fspring-boot-value-annotation.md","\u002Fblog\u002F2022\u002F05\u002F11\u002Fspring-boot-value-annotation","Spring Boot @Value Annotation","Learn how to use the Spring Boot @Value annotation to inject configuration properties, set default values, and understand property source order in Java.",{"slug":3475,"date":3476,"published":11,"tags":3477,"author":1851,"cover":3478,"video":3479,"excerpt":10,"shortDesc":3473},"spring-boot-value-annotation","2022-05-11T09:30:00.000Z",[14],".\u002Fspring-boot-value-annotation-thumbnail.png","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FvLSyFktOm4g",{"minutes":495,"text":2041},{"_id":3482,"path":3483,"title":3484,"description":3485,"meta":3486,"readingTime":3491},"blog\u002Fblog\u002F2022\u002F01\u002F24\u002Fim-joining-vmware.md","\u002Fblog\u002F2022\u002F01\u002F24\u002Fim-joining-vmware","Im Joining VMware","I'm so excited to announce that I am joining VMware as a Spring Developer Advocate!",{"slug":3487,"date":3488,"published":11,"tags":3489,"author":1851,"cover":3490,"video":10,"excerpt":10,"shortDesc":3485},"im-joining-vmware","2022-01-24T08:00:00.000Z",[3318],".\u002Fim-joining-vmware-cover.png",{"minutes":740,"text":1978},{"_id":3493,"path":3494,"title":3495,"description":3496,"meta":3497,"readingTime":3502},"blog\u002Fblog\u002F2022\u002F01\u002F01\u002Fhappy-new-year-2022.md","\u002Fblog\u002F2022\u002F01\u002F01\u002Fhappy-new-year-2022","Happy New Year 2022","Happy New Year! I want to take a few minutes and reflect on the year that was 2021 and look ahead to 2022.",{"slug":3498,"date":3499,"published":11,"tags":3500,"author":1851,"cover":3501,"video":10,"excerpt":10,"shortDesc":3496},"happy-new-year-2022","2022-01-01T11:00:00.000Z",[3319],".\u002Fkelly-sikkema-PXl_S152jNM-unsplash.jpg",{"minutes":481,"text":2002},{"_id":3504,"path":3505,"title":3506,"description":3507,"meta":3508,"readingTime":3515},"blog\u002Fblog\u002F2021\u002F11\u002F15\u002Fmacbook-pro-m1-max-review.md","\u002Fblog\u002F2021\u002F11\u002F15\u002Fmacbook-pro-m1-max-review","14\" MacBook Pro M1 Max Review for developers and content creators","I have been using the new MacBook Pro for about a week and wanted to give you my initial thoughts from a developer & content creator perspective.",{"slug":3509,"date":3510,"published":11,"tags":3511,"author":1851,"cover":3513,"video":3514,"excerpt":10,"shortDesc":3507},"macbook-pro-m1-max-review","2021-11-15T21:00:00.000Z",[3512],"Apple",".\u002Fmacbook-pro-review-thumbnail.png","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002Ft-hEOyUnaXQ",{"minutes":495,"text":2041},{"_id":3517,"path":3518,"title":3519,"description":3520,"meta":3521,"readingTime":3527},"blog\u002Fblog\u002F2021\u002F11\u002F06\u002Fgithub-copilot-java-developers.md","\u002Fblog\u002F2021\u002F11\u002F06\u002Fgithub-copilot-java-developers","GitHub Copilot for Java Develpers","Earlier this year GitHub launched Copilot, an AI pair-programmer. With GitHub Copilot, get suggestions for whole lines or entire functions right inside your editor.",{"slug":3522,"date":3523,"published":11,"tags":3524,"author":1851,"cover":3525,"video":3526,"excerpt":10,"shortDesc":3520},"github-copilot-java-developers","2021-11-08T10:00:00.000Z",[13,14],".\u002Fgithub_copilot_thumbnail.png","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002F97C3fQqzj-I",{"minutes":444,"text":3528},"2 min read",{"_id":3530,"path":3531,"title":3532,"description":3533,"meta":3534,"readingTime":3541},"blog\u002Fblog\u002F2021\u002F08\u002F30\u002Fspring-one-2021.md","\u002Fblog\u002F2021\u002F08\u002F30\u002Fspring-one-2021","Spring One 2021 Presentation","I'm so honored to be speaking at this year's SpringOne Conference. This article will give you a look ahead to the presentation by explaining what you can expect and the resources from my talk.",{"slug":3535,"date":3536,"published":11,"tags":3537,"author":1851,"cover":3540,"video":10,"excerpt":10,"shortDesc":3533},"spring-one-2021","2021-08-30T19:45:43.204Z",[3538,14,3539],"conference","vue",".\u002Fspring-one-2021-cover.png",{"minutes":450,"text":3542},"3 min read",{"_id":3544,"path":3545,"title":3546,"description":3547,"meta":3548,"readingTime":3554},"blog\u002Fblog\u002F2021\u002F01\u002F22\u002Ffull-stack-java.md","\u002Fblog\u002F2021\u002F01\u002F22\u002Ffull-stack-java","Full Stack Java development with Spring Boot and VueJS","In this tutorial, you are going to learn how to build a full-stack application that uses Vue for the frontend and Spring Boot for the backend.",{"slug":3549,"date":3550,"published":11,"tags":3551,"author":1851,"cover":3552,"video":3553,"excerpt":10,"shortDesc":3547},"full-stack-java","2021-01-22T08:00:00.000Z",[13,3539],".\u002Ffull-stack-java-spring-vue.png","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002F2G6r2f40Lps",{"minutes":1371,"text":2184},{"_id":3556,"path":3557,"title":3558,"description":3559,"meta":3560,"readingTime":3565},"blog\u002Fblog\u002F2021\u002F01\u002F08\u002Fnetwork-throttling.md","\u002Fblog\u002F2021\u002F01\u002F08\u002Fnetwork-throttling","How to force a delay in a web app","In this tutorial, I will show you can force a delay in a web application for testing purposes.",{"slug":3561,"date":3562,"published":11,"tags":3563,"author":1851,"cover":3564,"video":10,"excerpt":10,"shortDesc":3559},"network-throttling","2021-01-08T09:30:00.000Z",[3242,3539,13],".\u002Fnetwork-throttling-cover.png",{"minutes":712,"text":1855},{"_id":3567,"path":3568,"title":3569,"description":3570,"meta":3571,"readingTime":3576},"blog\u002Fblog\u002F2021\u002F01\u002F07\u002Fhappy-new-year-2021.md","\u002Fblog\u002F2021\u002F01\u002F07\u002Fhappy-new-year-2021","New Year, New Opportunities and Goals","In this article, I have some exciting personal news to share and I want to take a look ahead at the new year.",{"slug":3572,"date":3573,"published":11,"tags":3574,"author":1851,"cover":3575,"video":10,"excerpt":10,"shortDesc":3570},"happy-new-year-2021","2021-01-07T11:30:00.000Z",[3318],"isaac-smith-YwrdbQw0oco-unsplash.jpg",{"minutes":501,"text":2094},{"_id":3578,"path":3579,"title":3580,"description":3581,"meta":3582,"readingTime":3587},"blog\u002Fblog\u002F2020\u002F12\u002F16\u002Freassign-standard-in-out.md","\u002Fblog\u002F2020\u002F12\u002F16\u002Freassign-standard-in-out","How to test standard in and out in Java","In this tutorial I will show you how you can test standard in and out in Java.",{"slug":3583,"date":3584,"published":11,"tags":3585,"author":1851,"cover":3586,"video":10,"excerpt":10,"shortDesc":3581},"reassign-standard-in-out","2020-12-16T15:17:39.619Z",[13],".\u002Ftesting-standard-in-out-java-cover.png",{"minutes":718,"text":1868},{"_id":3589,"path":3590,"title":3591,"description":3592,"meta":3593,"readingTime":3599},"blog\u002Fblog\u002F2020\u002F07\u002F30\u002Finteractive-learning-from-oreilly.md","\u002Fblog\u002F2020\u002F07\u002F30\u002Finteractive-learning-from-oreilly","Interactive Learning from Oreilly","O'Reilly has a new hands-on learning platform called Interactive Learning. In this tutorial I will tell you all about it and the tutorials I created for it.",{"slug":3594,"date":3595,"published":11,"tags":3596,"author":1851,"cover":3598,"video":10,"excerpt":10,"shortDesc":3592},"interactive-learning-from-oreilly","2020-07-30T12:50:24.664Z",[13,14,3597],"maven",".\u002Foreilly-interactive-learning-cover.png",{"minutes":463,"text":3369},{"_id":3601,"path":3602,"title":3603,"description":3604,"meta":3605,"readingTime":3611},"blog\u002Fblog\u002F2020\u002F06\u002F04\u002Fspring-boot-rest-service.md","\u002Fblog\u002F2020\u002F06\u002F04\u002Fspring-boot-rest-service","Spring Boot REST Service: How to build a REST API in Java","In this tutorial you will learn how to build a REST API in Java using Spring Boot.",{"slug":3606,"date":3607,"published":11,"tags":3608,"author":1851,"cover":3609,"video":3610,"excerpt":10,"shortDesc":3604},"spring-boot-rest-service","2020-06-04T08:00:00.000Z",[1849],".\u002Fspring-boot-rest-service.jpeg","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FMWLe1tqPmUo",{"minutes":490,"text":1953},{"_id":3613,"path":3614,"title":3615,"description":3616,"meta":3617,"readingTime":3624},"blog\u002Fblog\u002F2020\u002F06\u002F03\u002Fdeno-standard-in-out.md","\u002Fblog\u002F2020\u002F06\u002F03\u002Fdeno-standard-in-out","Working with Standard Input and Output in Deno","In this tutorial I will show you how to work with standard input and output in Deno.",{"slug":3618,"date":3619,"published":11,"tags":3620,"author":1851,"cover":3623,"video":10,"excerpt":10,"shortDesc":3616},"deno-standard-in-out","2020-06-03T20:00:00.500Z",[3621,3622],"Deno","JavaScript",".\u002Fdeno_stdin_stdout-cover.png",{"minutes":712,"text":1855},{"_id":3626,"path":3627,"title":3628,"description":3629,"meta":3630,"readingTime":3636},"blog\u002Fblog\u002F2020\u002F05\u002F29\u002Fhello-deno.md","\u002Fblog\u002F2020\u002F05\u002F29\u002Fhello-deno","Hello, Deno","An introduction to Deno which is a secure runtime for JavaScript and TypeScript",{"slug":3631,"date":3632,"published":11,"tags":3633,"author":1851,"cover":3635,"video":10,"excerpt":10,"shortDesc":3629},"hello-deno","2020-05-29T12:00:00.000Z",[3634,3242],"deno",".\u002Fhello-deno-cover.png",{"minutes":1446,"text":3637},"29 min read",{"_id":3639,"path":3640,"title":3641,"description":3642,"meta":3643,"readingTime":3650},"blog\u002Fblog\u002F2020\u002F05\u002F16\u002Fwebsite-redesign-lessons-learned.md","\u002Fblog\u002F2020\u002F05\u002F16\u002Fwebsite-redesign-lessons-learned","Lessons learned from redesigning my website","I spent the last couple of months redesigning my website and I would like to share with you some of the lessons I learned",{"slug":3644,"date":3645,"published":11,"tags":3646,"author":1851,"cover":3649,"video":10,"excerpt":10,"shortDesc":3642},"website-redesign-lessons-learned","2020-05-16T17:24:14.760Z",[3647,3539,3648],"css","gridsome",".\u002Fwebsite-redesign-lessons-learned-cover.png",{"minutes":506,"text":1883},{"_id":3652,"path":3653,"title":3654,"description":3655,"meta":3656,"readingTime":3662},"blog\u002Fblog\u002F2020\u002F03\u002F09\u002Fspring-unit-vs-integration-test.md","\u002Fblog\u002F2020\u002F03\u002F09\u002Fspring-unit-vs-integration-test","Spring Boot Testing Basics: How to Unit Test & Integration Test REST Controllers","In this article, we're going to dive into the world of testing in Spring Boot, specifically looking at unit tests and integration tests.",{"slug":3657,"date":3658,"published":11,"tags":3659,"author":1851,"cover":3660,"video":3661,"excerpt":10,"shortDesc":3655},"spring-unit-vs-integration-test","2020-03-09T10:00:00.000Z",[1849],".\u002Funit-vs-int.jpeg","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FpNiRNRgi5Ws",{"minutes":495,"text":2041},{"_id":3664,"path":3665,"title":3666,"description":3667,"meta":3668,"readingTime":3674},"blog\u002Fblog\u002F2020\u002F02\u002F12\u002Fvue3-ref-vs-reactive.md","\u002Fblog\u002F2020\u002F02\u002F12\u002Fvue3-ref-vs-reactive","Vue 3 Composition API: Ref vs Reactive","One question I keep hearing over and over is what method should I use to declare reactive data in the Vue 3 Composition API? In this article, I explain what ref() and reactive() are and try to answer that question.",{"slug":3669,"date":3670,"published":11,"tags":3671,"author":1851,"cover":3672,"video":3673,"excerpt":10,"shortDesc":3667},"vue3-ref-vs-reactive","2020-02-12T16:27:46.472Z",[3539],".\u002Fvue3-ref-vs-reactive-cover.png","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FcRwG96MOHp0",{"minutes":1446,"text":3637},{"_id":3676,"path":3677,"title":3678,"description":3679,"meta":3680,"readingTime":3688},"blog\u002Fblog\u002F2020\u002F01\u002F17\u002Fvue-3-alpha-cli-plugin.md","\u002Fblog\u002F2020\u002F01\u002F17\u002Fvue-3-alpha-cli-plugin","Start using Vue 3 in a new project right now","In this tutorial, I walk you through how to add Vue 3 to a new project.",{"slug":3681,"date":3682,"published":11,"tags":3683,"author":1851,"cover":3686,"video":3687,"excerpt":10,"shortDesc":3679},"vue-3-alpha-cli-plugin","2020-01-17T13:58:29.936Z",[3684,3685],"vue3","screencast",".\u002Fstart-using-vue3-today-cover.png","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002Fo-jiS563yI8",{"minutes":469,"text":3101},{"_id":3690,"path":3691,"title":3692,"description":3693,"meta":3694,"readingTime":3699},"blog\u002Fblog\u002F2020\u002F01\u002F13\u002Fcodemash-2020-recap.md","\u002Fblog\u002F2020\u002F01\u002F13\u002Fcodemash-2020-recap","CodeMash 2020 Recap","A recap of the conference CodeMash 2020 as both an attendee and a speaker.",{"slug":3695,"date":3696,"published":11,"tags":3697,"author":1851,"cover":3698,"video":10,"excerpt":10,"shortDesc":3693},"codemash-2020-recap","2020-01-13T14:30:00.000Z",[3538,3539],".\u002Fcodemash-recap-cover.png",{"minutes":475,"text":2645},{"_id":3701,"path":3702,"title":3703,"description":3704,"meta":3705,"readingTime":3710},"blog\u002Fblog\u002F2020\u002F01\u002F09\u002Fcodemash-2020.md","\u002Fblog\u002F2020\u002F01\u002F09\u002Fcodemash-2020","Vue3: Smaller, Faster & Stronger. CodeMash 2020","This post is a collection of resources for my presentation at CodeMash 2020.",{"slug":3706,"date":3707,"published":11,"tags":3708,"author":1851,"cover":3709,"video":10,"excerpt":10,"shortDesc":3704},"codemash-2020","2020-01-09T09:00:00.000Z",[3539],".\u002Fcodemash-vue3.png",{"minutes":463,"text":3369},{"_id":3712,"path":3713,"title":3714,"description":3715,"meta":3716,"readingTime":3721},"blog\u002Fblog\u002F2019\u002F12\u002F19\u002Fup-and-running-with-vuejs.md","\u002Fblog\u002F2019\u002F12\u002F19\u002Fup-and-running-with-vuejs","New Course: Up & Running with Vue.js","I released a new course on how to get up and running with Vue.js for beginners",{"slug":3717,"date":3718,"published":11,"tags":3719,"author":1851,"cover":3720,"video":10,"excerpt":10,"shortDesc":3715},"up-and-running-with-vuejs","2019-12-19T15:30:00.000Z",[3539],".\u002Fup-and-running-with-vuejs-cover.png",{"minutes":463,"text":3369},{"_id":3723,"path":3724,"title":3725,"description":3726,"meta":3727,"readingTime":3732},"blog\u002Fblog\u002F2019\u002F11\u002F21\u002Fspring-boot-visual-studio-code.md","\u002Fblog\u002F2019\u002F11\u002F21\u002Fspring-boot-visual-studio-code","Spring Boot in Visual Studio Code","Learn how to set up Spring Boot in Visual Studio Code using the Java and Spring Boot Extension Packs, then build a Spring Boot REST API in this tutorial.",{"slug":3728,"date":3729,"published":11,"tags":3730,"author":1851,"cover":3731,"video":10,"excerpt":10,"shortDesc":3726},"spring-boot-visual-studio-code","2019-11-21T11:28:07.266Z",[1849,13],".\u002Fspring-boot-in-vscode.png",{"minutes":444,"text":3528},{"_id":3734,"path":3735,"title":3736,"description":3737,"meta":3738,"readingTime":3743},"blog\u002Fblog\u002F2019\u002F10\u002F29\u002Funit-testing-vue-part-03.md","\u002Fblog\u002F2019\u002F10\u002F29\u002Funit-testing-vue-part-03","A Beginner's Guide to Unit Testing in Vue: Part 3","In Part 3 of this series we learn how to write unit tests in Vue by testing more complex components.",{"slug":3739,"date":3740,"published":11,"tags":3741,"author":1851,"cover":3742,"video":10,"excerpt":10,"shortDesc":3737},"unit-testing-vue-part-03","2019-10-29T15:30:00.000Z",[3539],".\u002Funit-testing-vue-mastery-03-cover.jpg",{"minutes":437,"text":3744},"1 min read",{"_id":3746,"path":3747,"title":3748,"description":3749,"meta":3750,"readingTime":3755},"blog\u002Fblog\u002F2019\u002F10\u002F15\u002Funit-testing-vue-part-02.md","\u002Fblog\u002F2019\u002F10\u002F15\u002Funit-testing-vue-part-02","A Beginner's Guide to Unit Testing in Vue: Part 2","In the 2nd part of this 3 part series we will look at writing and running your first unit test in Vue",{"slug":3751,"date":3752,"published":11,"tags":3753,"author":1851,"cover":3754,"video":10,"excerpt":10,"shortDesc":3749},"unit-testing-vue-part-02","2019-10-15T12:33:53.592Z",[3539],".\u002Funit-testing-part-02-cover.jpg",{"minutes":437,"text":3744},{"_id":3757,"path":3758,"title":3759,"description":3760,"meta":3761,"readingTime":3766},"blog\u002Fblog\u002F2019\u002F10\u002F01\u002Funit-testing-vue-part-01.md","\u002Fblog\u002F2019\u002F10\u002F01\u002Funit-testing-vue-part-01","A beginner's guide to Unit Testing in Vue: Part 1","Unit Testing in Vue: What to test?",{"slug":3762,"date":3763,"published":11,"tags":3764,"author":1851,"cover":3765,"video":10,"excerpt":10,"shortDesc":3760},"unit-testing-vue-part-01","2019-10-01T17:00:00.000Z",[3539],"unit-testing-vue-mastery-01.png",{"minutes":437,"text":3744},{"_id":3768,"path":3769,"title":3770,"description":3771,"meta":3772,"readingTime":3778},"blog\u002Fblog\u002F2019\u002F08\u002F08\u002Fcss-grid-generator.md","\u002Fblog\u002F2019\u002F08\u002F08\u002Fcss-grid-generator","Learn how to use CSS Grid with a FREE tool CSS Grid Generator","Learn how to create a CSS Grid Layout with a free tool called CSS Grid Generator",{"slug":3773,"date":3774,"published":11,"tags":3775,"author":1851,"cover":3776,"video":3777,"excerpt":10,"shortDesc":3771},"css-grid-generator","2019-08-08T18:13:57.456Z",[3647,3539],".\u002Fcss-grid-generator-cover.png","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FZopBBEs9TPg",{"minutes":1322,"text":2080},{"_id":3780,"path":3781,"title":3782,"description":3783,"meta":3784,"readingTime":3790},"blog\u002Fblog\u002F2019\u002F07\u002F23\u002Fwebsite-new-features-improvements.md","\u002Fblog\u002F2019\u002F07\u002F23\u002Fwebsite-new-features-improvements","New Features and Improvements to my website","In this article I am going to walk you through some of the new features I have been working on for my website",{"slug":3785,"date":3786,"published":11,"tags":3787,"author":1851,"cover":3789,"video":10,"excerpt":10,"shortDesc":3783},"website-new-features-improvements","2019-07-23T11:20:30.619Z",[3788,3539,3648],"blog",".\u002Fwebsite-new-features-cover.png",{"minutes":1371,"text":2184},{"_id":3792,"path":3793,"title":3794,"description":3795,"meta":3796,"readingTime":3802},"blog\u002Fblog\u002F2019\u002F06\u002F13\u002Fvuepress-cookies.md","\u002Fblog\u002F2019\u002F06\u002F13\u002Fvuepress-cookies","How to use cookies in VuePress","In this article, I am going to talk about a recent documentation site to VuePress and how I was able to solve a problem I ran across.",{"slug":3797,"date":3798,"published":11,"tags":3799,"author":1851,"cover":3801,"video":10,"excerpt":10,"shortDesc":3795},"vuepress-cookies","2019-06-13T10:27:46.175Z",[3539,3800],"vuepress",".\u002Fvuepress-cookies-cover.png",{"minutes":1371,"text":2184},{"_id":3804,"path":3805,"title":3806,"description":3807,"meta":3808,"readingTime":3814},"blog\u002Fblog\u002F2019\u002F06\u002F05\u002Ftriggering-events-router-vue.md","\u002Fblog\u002F2019\u002F06\u002F05\u002Ftriggering-events-router-vue","Triggering events from Vue Router views","In this article I will show you how to trigger events from views using the Router View component.",{"slug":3809,"date":3810,"published":11,"tags":3811,"author":1851,"cover":3812,"video":3813,"excerpt":10,"shortDesc":3807},"triggering-events-router-vue","2019-06-05T20:13:17.445Z",[3539],".\u002Ftriggering-events-router-vue-cover.png","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FJwccQYpsE2Q",{"minutes":740,"text":1978},{"_id":3816,"path":3817,"title":3818,"description":3819,"meta":3820,"readingTime":3826},"blog\u002Fblog\u002F2019\u002F05\u002F31\u002Fescape-backtick-markdown.md","\u002Fblog\u002F2019\u002F05\u002F31\u002Fescape-backtick-markdown","How to escape a backtick within a code block in Markdown","In this article I will show you how to escape the triple backtick in a markdown code block so that you can display it in a post or a Github comment. ",{"slug":3821,"date":3822,"published":11,"tags":3823,"author":1851,"cover":3825,"video":10,"excerpt":10,"shortDesc":3819},"escape-backtick-markdown","2019-05-31T18:32:41.710Z",[3824,3788],"markdown",".\u002Fescape-backtick-markdown-cover.png",{"minutes":469,"text":3101},{"_id":3828,"path":3829,"title":3830,"description":3831,"meta":3832,"readingTime":3839},"blog\u002Fblog\u002F2019\u002F05\u002F17\u002Fvue-cli-error.md","\u002Fblog\u002F2019\u002F05\u002F17\u002Fvue-cli-error","Vue CLI ValidationError: webpack Dev Server Invalid Options","In this article, I will tell you about an error I received while trying to run and new VueJS project this morning and how I was able to fix it.",{"slug":3833,"date":3834,"published":11,"tags":3835,"author":1851,"cover":3838,"video":10,"excerpt":10,"shortDesc":3831},"vue-cli-error","2019-05-17T15:25:36.871Z",[3539,3836,3837,3242],"npm","nodejs","vue-cli-validation-error.png",{"minutes":495,"text":2041},{"_id":3841,"path":3842,"title":3843,"description":3844,"meta":3845,"readingTime":3851},"blog\u002Fblog\u002F2019\u002F05\u002F15\u002Frun-vue-visual-studio-code.md","\u002Fblog\u002F2019\u002F05\u002F15\u002Frun-vue-visual-studio-code","3 ways to run VueJS applications from Visual Studio Code","In this tutorial, I am going to show you 3 ways to run your VueJS applications from Visual Studio Code. ",{"slug":3846,"date":3847,"published":11,"tags":3848,"author":1851,"cover":3850,"video":10,"excerpt":10,"shortDesc":3844},"run-vue-visual-studio-code","2019-05-15T14:19:36.459Z",[3539,3836,3849,3242],"vscode",".\u002Frun-vue-visual-studio-code-cover.png",{"minutes":501,"text":2094},{"_id":3853,"path":3854,"title":3855,"description":3856,"meta":3857,"readingTime":3864},"blog\u002Fblog\u002F2019\u002F05\u002F10\u002Fwhat-you-can-learn-from-live-coders.md","\u002Fblog\u002F2019\u002F05\u002F10\u002Fwhat-you-can-learn-from-live-coders","What you can learn from live coders","2019 seems to be the year of the live coder. In this article I am going to tell you what you can learn from live coders. ",{"slug":3858,"date":3859,"published":11,"tags":3860,"author":1851,"cover":3863,"video":10,"excerpt":10,"shortDesc":3856},"what-you-can-learn-from-live-coders","2019-05-10T18:42:50.066Z",[3861,3862],"twitch","youtube",".\u002Flive-coders-cover.png",{"minutes":506,"text":1883},{"_id":3866,"path":3867,"title":3868,"description":3869,"meta":3870,"readingTime":3876},"blog\u002Fblog\u002F2019\u002F05\u002F08\u002Fcodesandbox-custom-theme.md","\u002Fblog\u002F2019\u002F05\u002F08\u002Fcodesandbox-custom-theme","How to customize the VSCode Theme in CodeSandbox","In this article, I am going to give you a quick tip on how to customize the VSCode Theme in CodeSandbox.",{"slug":3871,"date":3872,"published":11,"tags":3873,"author":1851,"cover":3875,"video":10,"excerpt":10,"shortDesc":3869},"codesandbox-custom-theme","2019-05-08T01:56:43.680Z",[3874],"codesandbox",".\u002Fcodesandbox-custom-theme-cover.png",{"minutes":463,"text":3369},{"_id":3878,"path":3879,"title":3880,"description":3881,"meta":3882,"readingTime":3887},"blog\u002Fblog\u002F2019\u002F05\u002F02\u002Fgridsome-codesandbox-plugin.md","\u002Fblog\u002F2019\u002F05\u002F02\u002Fgridsome-codesandbox-plugin","How I created a CodeSandbox plugin for Gridsome","In this article, I am going to introduce you to CodeSandbox and tell you a little bit about why I love it so much",{"slug":3883,"date":3884,"published":11,"tags":3885,"author":1851,"cover":3886,"video":10,"excerpt":10,"shortDesc":3881},"gridsome-codesandbox-plugin","2019-05-02T15:30:43.839Z",[3539,3648,3874],".\u002Fgridsome-codesandbox-plugin-cover.png",{"minutes":1399,"text":2551},{"_id":3889,"path":3890,"title":3891,"description":3892,"meta":3893,"readingTime":3898},"blog\u002Fblog\u002F2019\u002F04\u002F30\u002Fup-and-running-with-vue.md","\u002Fblog\u002F2019\u002F04\u002F30\u002Fup-and-running-with-vue","Everything you need to get up and running with VueJS","In this article, I am going to tell you why I love Vue and give you 4 different ways you can write your first application.",{"slug":3894,"date":3895,"published":11,"tags":3896,"author":1851,"cover":3897,"video":10,"excerpt":10,"shortDesc":3892},"up-and-running-with-vue","2019-04-30T19:38:42.927Z",[3539,3242],".\u002Fup-and-running-with-vue-cover.png",{"minutes":1399,"text":2551},{"_id":3900,"path":3901,"title":3902,"description":3903,"meta":3904,"readingTime":3910},"blog\u002Fblog\u002F2019\u002F04\u002F25\u002Fmy-new-blog-post-workflow.md","\u002Fblog\u002F2019\u002F04\u002F25\u002Fmy-new-blog-post-workflow","My new blog post workflow","In this article I will outline for you the tools and process I use to create a new blog post",{"slug":3905,"date":3906,"published":11,"tags":3907,"author":1851,"cover":3909,"video":10,"excerpt":10,"shortDesc":3903},"my-new-blog-post-workflow","2019-04-25T13:53:35.054Z",[3908],"blogging","super-snapper-zIwAchjDirM-unsplash.jpg",{"minutes":718,"text":1868},{"_id":3912,"path":3913,"title":3914,"description":3915,"meta":3916,"readingTime":3922},"blog\u002Fblog\u002F2019\u002F04\u002F23\u002Fgridsome-blog-post-generator.md","\u002Fblog\u002F2019\u002F04\u002F23\u002Fgridsome-blog-post-generator","Gridsome Blog Post Generator","In this article I will show you how to crate a blog post generator for your static site.",{"slug":3917,"date":3918,"published":11,"tags":3919,"author":1851,"cover":3921,"video":10,"excerpt":10,"shortDesc":3915},"gridsome-blog-post-generator","2019-04-23T19:28:51.186Z",[3920],"Vue","nick-morrison-FHnnjk1Yj7Y-unsplash.jpg",{"minutes":1358,"text":1897},{"_id":3924,"path":3925,"title":3926,"description":3927,"meta":3928,"readingTime":3934},"blog\u002Fblog\u002F2019\u002F04\u002F19\u002Fnpm-scripts-parallel.md","\u002Fblog\u002F2019\u002F04\u002F19\u002Fnpm-scripts-parallel","How to run multiple npm scripts in parallel","In this article I will talk about a problem I ran into recently and a couple of the solutions I found.",{"slug":3929,"date":3930,"published":11,"tags":3931,"author":1851,"cover":3933,"video":10,"excerpt":10,"shortDesc":3927},"npm-scripts-parallel","2019-04-19T16:51:56.537Z",[3836,3932,3242],"node",".\u002Fnpm-parallel-cover.png",{"minutes":490,"text":1953},{"_id":3936,"path":3937,"title":3938,"description":3939,"meta":3940,"readingTime":3945},"blog\u002Fblog\u002F2019\u002F04\u002F18\u002Fvue-tips-avoid-direct-dom-manipulation.md","\u002Fblog\u002F2019\u002F04\u002F18\u002Fvue-tips-avoid-direct-dom-manipulation","Tips for Vue Developers: Avoid directly manipulating the DOM","In this article I will look at an example of where manipulating the DOM in our components might not be the best approach.",{"slug":3941,"date":3942,"published":11,"tags":3943,"author":1851,"cover":3944,"video":10,"excerpt":10,"shortDesc":3939},"vue-tips-avoid-direct-dom-manipulation","2019-04-18T20:24:32.502Z",[3539,3242],".\u002Fvue-dom.png",{"minutes":501,"text":2094},{"_id":3947,"path":3948,"title":3949,"description":3950,"meta":3951,"readingTime":3956},"blog\u002Fblog\u002F2019\u002F04\u002F11\u002Fdont-call-it-a-comeback.md","\u002Fblog\u002F2019\u002F04\u002F11\u002Fdont-call-it-a-comeback","Personal Blogs: Don't Call it a comeback!","I'm not sure if you have noticed or not but the personal blog is making a comeback",{"slug":3952,"date":3953,"published":11,"tags":3954,"author":1851,"cover":3955,"video":10,"excerpt":10,"shortDesc":3950},"dont-call-it-a-comeback","2019-04-11T11:38:39.435Z",[3908],".\u002Fpersonal-blog-4b0867c8-0c1b-421c-afaf-7fc7e7986a77.png",{"minutes":501,"text":2094},{"_id":3958,"path":3959,"title":3960,"description":3961,"meta":3962,"readingTime":3967},"blog\u002Fblog\u002F2019\u002F04\u002F09\u002Fadding-twitter-cards-to-gridsome.md","\u002Fblog\u002F2019\u002F04\u002F09\u002Fadding-twitter-cards-to-gridsome","Adding Twitter Cards to Gridsome","In this tutorial I will show you how to add Twitter Cards to your Gridsome Blog.",{"slug":3963,"date":3964,"published":11,"tags":3965,"author":1851,"cover":3966,"video":10,"excerpt":10,"shortDesc":3961},"adding-twitter-cards-to-gridsome","2019-04-09T19:21:53.368Z",[3539,3648],".\u002Ftwittter-cards-gridsome-cover-936ee6d4-220e-4800-873c-9d700fa44469.png",{"minutes":754,"text":2119},{"_id":3969,"path":3970,"title":3971,"description":3972,"meta":3973,"readingTime":3978},"blog\u002Fblog\u002F2019\u002F03\u002F14\u002Ffind-max-array-objects-javascript.md","\u002Fblog\u002F2019\u002F03\u002F14\u002Ffind-max-array-objects-javascript","How to find the max id in an array of objects in JavaScript","A quick tutorial on the thought process on how you would go about finding the max id in an array of objects in JavaScript",{"slug":3974,"date":3975,"published":11,"tags":3976,"author":1851,"cover":3977,"video":10,"excerpt":10,"shortDesc":3972},"find-max-array-objects-javascript","2019-03-14T10:59:53.416Z",[3242],"joshua-aragon-EaB4Ml7C7fE-unsplash.jpg",{"minutes":506,"text":1883},{"_id":3980,"path":3981,"title":3982,"description":3983,"meta":3984,"readingTime":3989},"blog\u002Fblog\u002F2019\u002F03\u002F07\u002Fspring-initializr-fresh-look.md","\u002Fblog\u002F2019\u002F03\u002F07\u002Fspring-initializr-fresh-look","Spring Initializr's Fresh New Look","In this article I will tell you what the Spring Initializr is and give you my thoughts on the new redesign.",{"slug":3985,"date":3986,"published":11,"tags":3987,"author":1851,"cover":3988,"video":10,"excerpt":10,"shortDesc":3983},"spring-initializr-fresh-look","2019-03-07 17:00:00",[14],".\u002Fspring-init-cover.png",{"minutes":463,"text":3369},{"_id":3991,"path":3992,"title":3993,"description":3994,"meta":3995,"readingTime":4000},"blog\u002Fblog\u002F2019\u002F03\u002F04\u002Fvue-event-arguments.md","\u002Fblog\u002F2019\u002F03\u002F04\u002Fvue-event-arguments","Vue Event Handler Arguments","In this article you are going to learn how to pass arguments to your Vue event handlers as well as how get access to the original DOM event.",{"slug":3996,"date":3997,"published":11,"tags":3998,"author":1851,"cover":3999,"video":10,"excerpt":10,"shortDesc":3994},"vue-event-arguments","2019-03-04 10:00:00",[3539,3242],".\u002Fvue-event-arguments.png",{"minutes":1344,"text":2736},{"_id":4002,"path":4003,"title":4004,"description":4005,"meta":4006,"readingTime":4011},"blog\u002Fblog\u002F2019\u002F02\u002F21\u002Fnode-recursive-directories.md","\u002Fblog\u002F2019\u002F02\u002F21\u002Fnode-recursive-directories","Creating multiple directories in node","A quick tutorial on how to recursively create directories in node.",{"slug":4007,"date":4008,"published":11,"tags":4009,"author":1851,"cover":4010,"video":10,"excerpt":10,"shortDesc":4005},"node-recursive-directories","2019-02-21 08:00:00",[3932,3242],"node-multiple-directories.png",{"minutes":718,"text":1868},{"_id":4013,"path":4014,"title":4015,"description":4016,"meta":4017,"readingTime":4023},"blog\u002Fblog\u002F2019\u002F02\u002F18\u002Ftwitter-cards-meta-tags.md","\u002Fblog\u002F2019\u002F02\u002F18\u002Ftwitter-cards-meta-tags","How to add Twitter Card Meta Tags to your Blog","In this tutorial you will learn what a Twitter Card is along with step by step instructions how to add them to your blog and validate that they are working.",{"slug":4018,"date":4019,"published":11,"tags":4020,"author":1851,"cover":4022,"video":10,"excerpt":10,"shortDesc":4016},"twitter-cards-meta-tags","2019-02-18 22:00:00",[4021],"html",".\u002Ftwitter-cards.png",{"minutes":501,"text":2094},{"_id":4025,"path":4026,"title":4027,"description":4028,"meta":4029,"readingTime":4034},"blog\u002Fblog\u002F2019\u002F02\u002F13\u002Fhtml-template-tag.md","\u002Fblog\u002F2019\u002F02\u002F13\u002Fhtml-template-tag","HTML Template Tag in Vanilla JavaScript and Vue","A look at what the HTML template tag is and how it can be used in Vanilla JavaScript as well as what its role in Vue is.",{"slug":4030,"date":4031,"published":11,"tags":4032,"author":1851,"cover":4033,"video":10,"excerpt":10,"shortDesc":4028},"html-template-tag","2019-02-13 22:30:00",[4021,3242,3539],".\u002Fhtml-template-cover.png",{"minutes":1371,"text":2184},{"_id":4036,"path":4037,"title":4038,"description":4039,"meta":4040,"readingTime":4045},"blog\u002Fblog\u002F2019\u002F02\u002F10\u002Fcreating-your-first-npm-package.md","\u002Fblog\u002F2019\u002F02\u002F10\u002Fcreating-your-first-npm-package","Creating your first npm package","How to create your first npm package and publish it.",{"slug":4041,"date":4042,"published":11,"tags":4043,"author":1851,"cover":4044,"video":10,"excerpt":10,"shortDesc":4039},"creating-your-first-npm-package","2019-02-10 11:00:00",[3932,3836,3242],".\u002Fnpm_cover.png",{"minutes":1344,"text":2736},{"_id":4047,"path":4048,"title":4049,"description":4050,"meta":4051,"readingTime":4056},"blog\u002Fblog\u002F2019\u002F01\u002F31\u002Fhello-gridsome.md","\u002Fblog\u002F2019\u002F01\u002F31\u002Fhello-gridsome","Hello, Gridsome!","A quick write up on why I started a new blog and what I plan to do with it.",{"slug":4052,"date":4053,"published":11,"tags":4054,"author":10,"cover":4055,"video":10,"excerpt":10,"shortDesc":4050},"hello-gridsome","2019-01-31 10:00:00",[3539],".\u002Fgridsome.png",{"minutes":506,"text":1883},{"_id":4058,"path":4059,"title":4060,"description":4060,"meta":4061,"readingTime":4066},"blog\u002Fblog\u002F2019\u002F01\u002F01\u002Fhappy-new-year-my-2019-goals.md","\u002Fblog\u002F2019\u002F01\u002F01\u002Fhappy-new-year-my-2019-goals","Happy New Year! My 2019 Goals",{"slug":4062,"date":4063,"published":11,"tags":4064,"author":10,"cover":4065,"video":10,"excerpt":10,"shortDesc":4060},"happy-new-year-my-2019-goals","2019-01-01T08:38:10-05:00",[3319],".\u002F2019-cover.png",{"minutes":481,"text":2002},{"_id":4068,"path":4069,"title":4070,"description":4070,"meta":4071,"readingTime":4076},"blog\u002Fblog\u002F2018\u002F12\u002F24\u002Fmy-2018-year-in-review.md","\u002Fblog\u002F2018\u002F12\u002F24\u002Fmy-2018-year-in-review","My 2018 Year in Review",{"slug":4072,"date":4073,"published":11,"tags":4074,"author":10,"cover":4075,"video":10,"excerpt":10,"shortDesc":4070},"my-2018-year-in-review","2018-12-24T08:52:12-05:00",[3319],".\u002F2018-cover.png",{"minutes":481,"text":2002},{"_id":4078,"path":4079,"title":4080,"description":4080,"meta":4081,"readingTime":4088},"blog\u002Fblog\u002F2018\u002F12\u002F21\u002Fmacbook-pro-setup-my-setup-with-detailed-instructions.md","\u002Fblog\u002F2018\u002F12\u002F21\u002Fmacbook-pro-setup-my-setup-with-detailed-instructions","MacBook Pro Setup: My setup with detailed instructions",{"slug":4082,"date":4083,"published":11,"tags":4084,"author":10,"cover":4087,"video":10,"excerpt":10,"shortDesc":4080},"macbook-pro-setup-my-setup-with-detailed-instructions","2018-12-21T14:17:22-05:00",[4085,4086],"mac","web development",".\u002Ftobias-lystad-606045-unsplash-1024x683.jpg",{"minutes":1331,"text":1925},{"_id":4090,"path":4091,"title":4092,"description":4092,"meta":4093,"readingTime":4098},"blog\u002Fblog\u002F2018\u002F11\u002F20\u002Fnew-course-getting-started-with-spring-boot-2.md","\u002Fblog\u002F2018\u002F11\u002F20\u002Fnew-course-getting-started-with-spring-boot-2","New Course: Getting Started with Spring Boot 2",{"slug":4094,"date":4095,"published":11,"tags":4096,"author":10,"cover":4097,"video":10,"excerpt":10,"shortDesc":4092},"new-course-getting-started-with-spring-boot-2","2018-11-20T12:39:53-05:00",[1765],".\u002Fteachable_course_graphic-760x428.png",{"minutes":450,"text":3542},{"_id":4100,"path":4101,"title":4102,"description":4102,"meta":4103,"readingTime":4109},"blog\u002Fblog\u002F2018\u002F11\u002F06\u002Fcleveland-women-in-tech-conference-recap.md","\u002Fblog\u002F2018\u002F11\u002F06\u002Fcleveland-women-in-tech-conference-recap","Cleveland Women in Tech Conference Recap",{"slug":4104,"date":4105,"published":11,"tags":4106,"author":10,"cover":4108,"video":10,"excerpt":10,"shortDesc":4102},"cleveland-women-in-tech-conference-recap","2018-11-06T11:59:51-05:00",[3538,4107],"presentation",".\u002FIMG_4467.jpg",{"minutes":481,"text":2002},{"_id":4111,"path":4112,"title":4113,"description":4113,"meta":4114,"readingTime":4119},"blog\u002Fblog\u002F2018\u002F11\u002F05\u002Fcleveland-women-in-tech-presentation.md","\u002Fblog\u002F2018\u002F11\u002F05\u002Fcleveland-women-in-tech-presentation","Cleveland Women in Tech Presentation",{"slug":4115,"date":4116,"published":11,"tags":4117,"author":10,"cover":4118,"video":10,"excerpt":10,"shortDesc":4113},"cleveland-women-in-tech-presentation","2018-11-05T06:50:29-05:00",[3538,4107],".\u002Fmerherstory-cover.png",{"minutes":450,"text":3542},{"_id":4121,"path":4122,"title":4123,"description":4123,"meta":4124,"readingTime":4130},"blog\u002Fblog\u002F2018\u002F09\u002F07\u002Fi-am-joining-tech-elevator.md","\u002Fblog\u002F2018\u002F09\u002F07\u002Fi-am-joining-tech-elevator","I am joining Tech Elevator",{"slug":4125,"date":4126,"published":11,"tags":4127,"author":10,"cover":4129,"video":10,"excerpt":10,"shortDesc":4123},"i-am-joining-tech-elevator","2018-09-07T01:00:58-04:00",[4128],"Tech Elevator",".\u002FStacked-Logo-760x202.jpg",{"minutes":469,"text":3101},{"_id":4132,"path":4133,"title":4134,"description":4134,"meta":4135,"readingTime":4141},"blog\u002Fblog\u002F2018\u002F04\u002F25\u002Fjava-development-2018.md","\u002Fblog\u002F2018\u002F04\u002F25\u002Fjava-development-2018","What you should learn as a Java Developer in 2018",{"slug":4136,"date":4137,"published":11,"tags":4138,"author":10,"cover":4139,"video":4140,"excerpt":10,"shortDesc":4134},"java-development-2018","2018-04-25T06:39:22-04:00",[13],".\u002Fjava_development_in_2018-760x428","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FMLXj0hd3usk",{"minutes":463,"text":3369},{"_id":4,"path":5,"title":6,"description":6,"meta":4143,"readingTime":4145},{"slug":8,"date":9,"published":11,"tags":4144,"author":10,"cover":15,"video":10,"excerpt":10,"shortDesc":6},[13,14],{"minutes":1389,"text":2027},{"_id":4147,"path":4148,"title":4149,"description":4149,"meta":4150,"readingTime":4154},"blog\u002Fblog\u002F2018\u002F01\u002F01\u002Fmy-2018-goals.md","\u002Fblog\u002F2018\u002F01\u002F01\u002Fmy-2018-goals","Happy New Year!!! My 2018 Goals",{"slug":4151,"date":4152,"published":11,"tags":4153,"author":10,"cover":4075,"video":10,"excerpt":10,"shortDesc":4149},"my-2018-goals","2018-01-01T08:50:40-05:00",[3319],{"minutes":712,"text":1855},{"_id":4156,"path":4157,"title":4158,"description":4158,"meta":4159,"readingTime":4164},"blog\u002Fblog\u002F2017\u002F12\u002F29\u002Fmy-2017-year-in-review.md","\u002Fblog\u002F2017\u002F12\u002F29\u002Fmy-2017-year-in-review","My 2017 Year in Review",{"slug":4160,"date":4161,"published":11,"tags":4162,"author":10,"cover":4163,"video":10,"excerpt":10,"shortDesc":4158},"my-2017-year-in-review","2017-12-29T09:14:08-05:00",[3319],".\u002Fpexels-photo-282919-760x571.jpeg",{"minutes":463,"text":3369},{"_id":4166,"path":4167,"title":4168,"description":4168,"meta":4169,"readingTime":4174},"blog\u002Fblog\u002F2017\u002F12\u002F08\u002Fgetting-started-with-java.md","\u002Fblog\u002F2017\u002F12\u002F08\u002Fgetting-started-with-java","Getting Started with Java course",{"slug":4170,"date":4171,"published":11,"tags":4172,"author":10,"cover":4173,"video":10,"excerpt":10,"shortDesc":4168},"getting-started-with-java","2017-12-08T09:00:23-05:00",[13],".\u002Fapple-computer-desk-18105.jpg",{"minutes":475,"text":2645},{"_id":4176,"path":4177,"title":4178,"description":4178,"meta":4179,"readingTime":4184},"blog\u002Fblog\u002F2017\u002F11\u002F08\u002Fangular-4-java-developers-course-now-live.md","\u002Fblog\u002F2017\u002F11\u002F08\u002Fangular-4-java-developers-course-now-live","Angular 4 Java Developers Course is now Live!",{"slug":4180,"date":4181,"published":11,"tags":4182,"author":10,"cover":4183,"video":10,"excerpt":10,"shortDesc":4178},"angular-4-java-developers-course-now-live","2017-11-08T16:15:32-05:00",[13,14],".\u002Fgreetings_java_hipsters-760x525.png",{"minutes":475,"text":2645},{"_id":4186,"path":4187,"title":4188,"description":4188,"meta":4189,"readingTime":4195},"blog\u002Fblog\u002F2017\u002F10\u002F04\u002Fcompile-groovy-java-gradle-build.md","\u002Fblog\u002F2017\u002F10\u002F04\u002Fcompile-groovy-java-gradle-build","How to compile Groovy before Java in a Gradle Build",{"slug":4190,"date":4191,"published":11,"tags":4192,"author":10,"cover":4194,"video":10,"excerpt":10,"shortDesc":4188},"compile-groovy-java-gradle-build","2017-10-04T08:32:40-04:00",[4193],"groovy",".\u002F614px-Groovy-logo.svg_-e1459476180685.png",{"minutes":490,"text":1953},{"_id":4197,"path":4198,"title":4199,"description":4199,"meta":4200,"readingTime":4205},"blog\u002Fblog\u002F2017\u002F09\u002F22\u002Fget-hot-java-9.md","\u002Fblog\u002F2017\u002F09\u002F22\u002Fget-hot-java-9","Get it while it's hot. Java 9 is out!",{"slug":4201,"date":4202,"published":11,"tags":4203,"author":10,"cover":4204,"video":10,"excerpt":10,"shortDesc":4199},"get-hot-java-9","2017-09-22T08:21:00-04:00",[13],".\u002F2017-09-22_07-39-27-760x504.png",{"minutes":463,"text":3369},{"_id":4207,"path":4208,"title":4209,"description":4209,"meta":4210,"readingTime":4216},"blog\u002Fblog\u002F2017\u002F09\u002F11\u002Fmonolithic-vs-microservices.md","\u002Fblog\u002F2017\u002F09\u002F11\u002Fmonolithic-vs-microservices","When to use Microservices over Monolithic Architecture",{"slug":4211,"date":4212,"published":11,"tags":4213,"author":10,"cover":4215,"video":10,"excerpt":10,"shortDesc":4209},"monolithic-vs-microservices","2017-09-11T08:30:19-04:00",[4214,14],"Software Development",".\u002Fpexels-photo-325229-760x266.jpeg",{"minutes":469,"text":3101},{"_id":4218,"path":4219,"title":4220,"description":4220,"meta":4221,"readingTime":4227},"blog\u002Fblog\u002F2017\u002F09\u002F06\u002Fupgrade-new-angular-command-line-interface-cli-1-3-release.md","\u002Fblog\u002F2017\u002F09\u002F06\u002Fupgrade-new-angular-command-line-interface-cli-1-3-release","How to upgrade to the new Angular Command Line Interface (CLI) 1.3 release",{"slug":4222,"date":4223,"published":11,"tags":4224,"author":10,"cover":4226,"video":10,"excerpt":10,"shortDesc":4220},"upgrade-new-angular-command-line-interface-cli-1-3-release","2017-09-06T09:07:30-04:00",[4225],"Angular",".\u002Fpexels-photo-247791-1024x562.png",{"minutes":469,"text":3101},{"_id":4229,"path":4230,"title":4231,"description":4231,"meta":4232,"readingTime":4237},"blog\u002Fblog\u002F2017\u002F08\u002F30\u002Fgroovy-happens-assign-biginteger-integer.md","\u002Fblog\u002F2017\u002F08\u002F30\u002Fgroovy-happens-assign-biginteger-integer","Groovy: What happens when you assign a BigInteger to an Integer",{"slug":4233,"date":4234,"published":11,"tags":4235,"author":10,"cover":4236,"video":10,"excerpt":10,"shortDesc":4231},"groovy-happens-assign-biginteger-integer","2017-08-30T07:39:40-04:00",[4193,13],".\u002Fcodes-coding.jpg",{"minutes":450,"text":3542},{"_id":4239,"path":4240,"title":4241,"description":4241,"meta":4242,"readingTime":4247},"blog\u002Fblog\u002F2017\u002F08\u002F28\u002Fusing-jhipster-development-mode.md","\u002Fblog\u002F2017\u002F08\u002F28\u002Fusing-jhipster-development-mode","Using JHipster in Development mode",{"slug":4243,"date":4244,"published":11,"tags":4245,"author":10,"cover":4246,"video":10,"excerpt":10,"shortDesc":4241},"using-jhipster-development-mode","2017-08-28T09:30:30-04:00",[4225,14],".\u002Fwallpaper-001-2560x1440-760x428.png",{"minutes":450,"text":3542},{"_id":4249,"path":4250,"title":4251,"description":4251,"meta":4252,"readingTime":4257},"blog\u002Fblog\u002F2017\u002F08\u002F16\u002Fmultiple-dependencies-spring-cli.md","\u002Fblog\u002F2017\u002F08\u002F16\u002Fmultiple-dependencies-spring-cli","How to add multiple dependencies with the Spring CLI",{"slug":4253,"date":4254,"published":11,"tags":4255,"author":10,"cover":4256,"video":10,"excerpt":10,"shortDesc":4251},"multiple-dependencies-spring-cli","2017-08-16T08:30:40-04:00",[14],".\u002Fpexels-photo-205421-760x506.jpeg",{"minutes":469,"text":3101},{"_id":4259,"path":4260,"title":4261,"description":4261,"meta":4262,"readingTime":4267},"blog\u002Fblog\u002F2017\u002F08\u002F04\u002F3-youtube-channels-java-developers.md","\u002Fblog\u002F2017\u002F08\u002F04\u002F3-youtube-channels-java-developers","3 YouTube Channels for Java Developers",{"slug":4263,"date":4264,"published":11,"tags":4265,"author":10,"cover":4266,"video":10,"excerpt":10,"shortDesc":4261},"3-youtube-channels-java-developers","2017-08-04T13:14:00-04:00",[13,14],".\u002Fpexels-photo-760x506.jpg",{"minutes":437,"text":3744},{"_id":4269,"path":4270,"title":4271,"description":4271,"meta":4272,"readingTime":4277},"blog\u002Fblog\u002F2017\u002F07\u002F31\u002Fspring-data-aggregate-functions-repository.md","\u002Fblog\u002F2017\u002F07\u002F31\u002Fspring-data-aggregate-functions-repository","Spring Data Aggregate Functions in a repository",{"slug":4273,"date":4274,"published":11,"tags":4275,"author":10,"cover":4276,"video":10,"excerpt":10,"shortDesc":4271},"spring-data-aggregate-functions-repository","2017-07-31T08:48:35-04:00",[14],".\u002Fpexels-photo-374074-760x506.jpeg",{"minutes":495,"text":2041},{"_id":4279,"path":4280,"title":4281,"description":4282,"meta":4283,"readingTime":4288},"blog\u002Fblog\u002F2017\u002F07\u002F26\u002Fuse-hikaricp-next-spring-boot-project.md","\u002Fblog\u002F2017\u002F07\u002F26\u002Fuse-hikaricp-next-spring-boot-project","How to Use HikariCP as Your Spring Boot Connection Pool","Learn how to use HikariCP, the high-performance JDBC connection pool, in Spring Boot and configure it via application.properties and auto-configuration.",{"slug":4284,"date":4285,"published":11,"tags":4286,"author":10,"cover":4287,"video":10,"excerpt":10,"shortDesc":4282},"use-hikaricp-next-spring-boot-project","2017-07-26T08:16:50-04:00",[13,14],".\u002Fpexels-photo-169976-760x506.jpeg",{"minutes":481,"text":2002},{"_id":4290,"path":4291,"title":4292,"description":4292,"meta":4293,"readingTime":4298},"blog\u002Fblog\u002F2017\u002F07\u002F24\u002Fspring-boot-application-failed-start.md","\u002Fblog\u002F2017\u002F07\u002F24\u002Fspring-boot-application-failed-start","Spring Boot Application Failed To Start",{"slug":4294,"date":4295,"published":11,"tags":4296,"author":10,"cover":4297,"video":10,"excerpt":10,"shortDesc":4292},"spring-boot-application-failed-start","2017-07-24T09:55:33-04:00",[13,14],".\u002Fpexels-photo-205316-760x506.png",{"minutes":481,"text":2002},{"_id":4300,"path":4301,"title":4302,"description":4302,"meta":4303,"readingTime":4309},"blog\u002Fblog\u002F2017\u002F07\u002F05\u002Fread-json-data-spring-boot-write-database.md","\u002Fblog\u002F2017\u002F07\u002F05\u002Fread-json-data-spring-boot-write-database","How to read JSON data in Spring Boot and write to a database",{"slug":4304,"date":4305,"published":11,"tags":4306,"author":10,"cover":4307,"video":4308,"excerpt":10,"shortDesc":4302},"read-json-data-spring-boot-write-database","2017-07-05T12:00:27-04:00",[14],".\u002Fpexels-photo-374899-760x506.jpeg","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FrGdKmF2UzSc",{"minutes":754,"text":2119},{"_id":4311,"path":4312,"title":4313,"description":4313,"meta":4314,"readingTime":4319},"blog\u002Fblog\u002F2017\u002F07\u002F03\u002Fmultiple-request-mappings-spring-boot.md","\u002Fblog\u002F2017\u002F07\u002F03\u002Fmultiple-request-mappings-spring-boot","Multiple Request Mappings in Spring Boot",{"slug":4315,"date":4316,"published":11,"tags":4317,"author":10,"cover":4318,"video":10,"excerpt":10,"shortDesc":4313},"multiple-request-mappings-spring-boot","2017-07-03T08:30:50-04:00",[14],".\u002Fpexels-photo-450035-760x506.jpeg",{"minutes":469,"text":3101},{"_id":4321,"path":4322,"title":4323,"description":4323,"meta":4324,"readingTime":4329},"blog\u002Fblog\u002F2017\u002F06\u002F30\u002F9-presentations-can-watch-right-now-learn-java-9.md","\u002Fblog\u002F2017\u002F06\u002F30\u002F9-presentations-can-watch-right-now-learn-java-9","9 Presentations you can watch right now to learn about Java 9",{"slug":4325,"date":4326,"published":11,"tags":4327,"author":10,"cover":4328,"video":10,"excerpt":10,"shortDesc":4323},"9-presentations-can-watch-right-now-learn-java-9","2017-06-30T08:00:48-04:00",[13],".\u002Fcoding.jpg",{"minutes":495,"text":2041},{"_id":4331,"path":4332,"title":4333,"description":4333,"meta":4334,"readingTime":4339},"blog\u002Fblog\u002F2017\u002F06\u002F28\u002Fdeploying-war-application-server-spring-boot.md","\u002Fblog\u002F2017\u002F06\u002F28\u002Fdeploying-war-application-server-spring-boot","Deploying a WAR to an application server in Spring Boot",{"slug":4335,"date":4336,"published":11,"tags":4337,"author":10,"cover":4338,"video":10,"excerpt":10,"shortDesc":4333},"deploying-war-application-server-spring-boot","2017-06-28T09:14:15-04:00",[14],".\u002Fpexels-photo-292627-760x506.jpeg",{"minutes":506,"text":1883},{"_id":4341,"path":4342,"title":4343,"description":4344,"meta":4345,"readingTime":4350},"blog\u002Fblog\u002F2017\u002F06\u002F26\u002Fspring-boot-configuration-using-yaml.md","\u002Fblog\u002F2017\u002F06\u002F26\u002Fspring-boot-configuration-using-yaml","Spring Boot Configuration using YAML","Learn Spring Boot YAML configuration with application.yml — inject properties with @Value, use Spring profiles, and manage dev and production environments.",{"slug":4346,"date":4347,"published":11,"tags":4348,"author":10,"cover":4349,"video":10,"excerpt":10,"shortDesc":4344},"spring-boot-configuration-using-yaml","2017-06-26T09:00:06-04:00",[14],".\u002Femile-perron-190221-760x428.jpg",{"minutes":490,"text":1953},{"_id":4352,"path":4353,"title":4354,"description":4354,"meta":4355,"readingTime":4360},"blog\u002Fblog\u002F2017\u002F06\u002F23\u002Fbuilding-angular-spring-boot.md","\u002Fblog\u002F2017\u002F06\u002F23\u002Fbuilding-angular-spring-boot","Building your Angular Application for Spring Boot",{"slug":4356,"date":4357,"published":11,"tags":4358,"author":10,"cover":4359,"video":10,"excerpt":10,"shortDesc":4354},"building-angular-spring-boot","2017-06-23T08:00:27-04:00",[4225,14],".\u002Fimac-apple-mockup-app-38544-760x505.jpeg",{"minutes":481,"text":2002},{"_id":4362,"path":4363,"title":4364,"description":4364,"meta":4365,"readingTime":4370},"blog\u002Fblog\u002F2017\u002F06\u002F21\u002Fspring-boot-properties-setting-locale.md","\u002Fblog\u002F2017\u002F06\u002F21\u002Fspring-boot-properties-setting-locale","Spring Boot Properties: Setting the locale",{"slug":4366,"date":4367,"published":11,"tags":4368,"author":10,"cover":4369,"video":10,"excerpt":10,"shortDesc":4364},"spring-boot-properties-setting-locale","2017-06-21T08:19:09-04:00",[14],".\u002Fandre-benz-256762-760x507.jpg",{"minutes":469,"text":3101},{"_id":4372,"path":4373,"title":4374,"description":4374,"meta":4375,"readingTime":4380},"blog\u002Fblog\u002F2017\u002F06\u002F19\u002Fspring-boot-2-0-m2-now-available.md","\u002Fblog\u002F2017\u002F06\u002F19\u002Fspring-boot-2-0-m2-now-available","Spring Boot 2.0 M2 Now Available",{"slug":4376,"date":4377,"published":11,"tags":4378,"author":10,"cover":4379,"video":10,"excerpt":10,"shortDesc":4374},"spring-boot-2-0-m2-now-available","2017-06-19T08:30:53-04:00",[14],".\u002Fpexels-photo-92904-760x507.jpeg",{"minutes":450,"text":3542},{"_id":4382,"path":4383,"title":4384,"description":4384,"meta":4385,"readingTime":4391},"blog\u002Fblog\u002F2017\u002F06\u002F16\u002Fmigrating-grails-2-x-applications-grails-3-x.md","\u002Fblog\u002F2017\u002F06\u002F16\u002Fmigrating-grails-2-x-applications-grails-3-x","Migrating Grails 2.x Applications to Grails 3.x",{"slug":4386,"date":4387,"published":11,"tags":4388,"author":10,"cover":4390,"video":10,"excerpt":10,"shortDesc":4384},"migrating-grails-2-x-applications-grails-3-x","2017-06-16T08:53:25-04:00",[4389],"grails",".\u002Fpexels-photo-436784-760x507.jpeg",{"minutes":501,"text":2094},{"_id":4393,"path":4394,"title":4395,"description":4395,"meta":4396,"readingTime":4400},"blog\u002Fblog\u002F2017\u002F06\u002F14\u002Fspring-boot-defining-requestmapping-handler-methods.md","\u002Fblog\u002F2017\u002F06\u002F14\u002Fspring-boot-defining-requestmapping-handler-methods","Spring Boot Defining @RequestMapping handler methods",{"slug":4397,"date":4398,"published":11,"tags":4399,"author":10,"cover":4276,"video":10,"excerpt":10,"shortDesc":4395},"spring-boot-defining-requestmapping-handler-methods","2017-06-14T08:36:35-04:00",[14],{"minutes":490,"text":1953},{"_id":4402,"path":4403,"title":4404,"description":4404,"meta":4405,"readingTime":4410},"blog\u002Fblog\u002F2017\u002F06\u002F12\u002Fbootstrapping-angular-application.md","\u002Fblog\u002F2017\u002F06\u002F12\u002Fbootstrapping-angular-application","Bootstrapping your Angular Application",{"slug":4406,"date":4407,"published":11,"tags":4408,"author":10,"cover":4409,"video":10,"excerpt":10,"shortDesc":4404},"bootstrapping-angular-application","2017-06-12T11:40:51-04:00",[4225],".\u002Fpexels-photo-177598-760x506.jpeg",{"minutes":506,"text":1883},{"_id":4412,"path":4413,"title":4414,"description":4414,"meta":4415,"readingTime":4420},"blog\u002Fblog\u002F2017\u002F06\u002F07\u002Fangular-forms-clear-input-field.md","\u002Fblog\u002F2017\u002F06\u002F07\u002Fangular-forms-clear-input-field","Angular Forms: How to clear an input field",{"slug":4416,"date":4417,"published":11,"tags":4418,"author":10,"cover":4419,"video":10,"excerpt":10,"shortDesc":4414},"angular-forms-clear-input-field","2017-06-07T09:50:47-04:00",[4225],".\u002Fangular-forms.png",{"minutes":501,"text":2094},{"_id":4422,"path":4423,"title":4424,"description":4424,"meta":4425,"readingTime":4430},"blog\u002Fblog\u002F2017\u002F06\u002F05\u002Fgetting-started-angular-cli.md","\u002Fblog\u002F2017\u002F06\u002F05\u002Fgetting-started-angular-cli","Getting Started with the Angular CLI",{"slug":4426,"date":4427,"published":11,"tags":4428,"author":10,"cover":4429,"video":10,"excerpt":10,"shortDesc":4424},"getting-started-angular-cli","2017-06-05T10:34:50-04:00",[4225],".\u002F2017-06-05_09-34-25-760x226.png",{"minutes":475,"text":2645},{"_id":4432,"path":4433,"title":4434,"description":4434,"meta":4435,"readingTime":4441},"blog\u002Fblog\u002F2017\u002F05\u002F31\u002Fspring-boot-1-question-students-asking-right-now.md","\u002Fblog\u002F2017\u002F05\u002F31\u002Fspring-boot-1-question-students-asking-right-now","Spring Boot: The #1 question my students are asking right now",{"slug":4436,"date":4437,"published":11,"tags":4438,"author":10,"cover":4440,"video":10,"excerpt":10,"shortDesc":4434},"spring-boot-1-question-students-asking-right-now","2017-05-31T08:48:35-04:00",[4439],"sql",".\u002Fpexels-photo-92028-760x599.jpeg",{"minutes":501,"text":2094},{"_id":4443,"path":4444,"title":4445,"description":4445,"meta":4446,"readingTime":4452},"blog\u002Fblog\u002F2017\u002F05\u002F26\u002Fso-you-want-to-create-an-online-course.md","\u002Fblog\u002F2017\u002F05\u002F26\u002Fso-you-want-to-create-an-online-course","So you want to create an online course?",{"slug":4447,"date":4448,"published":11,"tags":4449,"author":10,"cover":4451,"video":10,"excerpt":10,"shortDesc":4445},"so-you-want-to-create-an-online-course","2017-05-26T12:34:08-04:00",[4450],"course",".\u002Fcarl-heyerdahl-181868-1-760x507.jpg",{"minutes":1344,"text":2736},{"_id":4454,"path":4455,"title":4456,"description":4456,"meta":4457,"readingTime":4462},"blog\u002Fblog\u002F2017\u002F05\u002F24\u002Fcontributing-groovy-website.md","\u002Fblog\u002F2017\u002F05\u002F24\u002Fcontributing-groovy-website","How you can contribute to the Groovy Website",{"slug":4458,"date":4459,"published":11,"tags":4460,"author":10,"cover":4461,"video":10,"excerpt":10,"shortDesc":4456},"contributing-groovy-website","2017-05-24T08:12:01-04:00",[4193],".\u002F2017-05-23_19-50-54-760x462.png",{"minutes":718,"text":1868},{"_id":4464,"path":4465,"title":4466,"description":4466,"meta":4467,"readingTime":4471},"blog\u002Fblog\u002F2017\u002F05\u002F22\u002Fchecking-upgrading-jhipster-version.md","\u002Fblog\u002F2017\u002F05\u002F22\u002Fchecking-upgrading-jhipster-version","How to check your version and upgrade JHipster",{"slug":4468,"date":4469,"published":11,"tags":4470,"author":10,"cover":4246,"video":10,"excerpt":10,"shortDesc":4466},"checking-upgrading-jhipster-version","2017-05-22T09:00:26-04:00",[4225,14],{"minutes":450,"text":3542},{"_id":4473,"path":4474,"title":4475,"description":4475,"meta":4476,"readingTime":4480},"blog\u002Fblog\u002F2017\u002F05\u002F19\u002Fspring-boot-2-first-release.md","\u002Fblog\u002F2017\u002F05\u002F19\u002Fspring-boot-2-first-release","The first release of Spring Boot 2.0 is now available!",{"slug":4477,"date":4478,"published":11,"tags":4479,"author":10,"cover":4379,"video":10,"excerpt":10,"shortDesc":4475},"spring-boot-2-first-release","2017-05-19T10:15:39-04:00",[14],{"minutes":501,"text":2094},{"_id":4482,"path":4483,"title":4484,"description":4485,"meta":4486,"readingTime":4491},"blog\u002Fblog\u002F2017\u002F05\u002F17\u002Fspring-component-vs-bean.md","\u002Fblog\u002F2017\u002F05\u002F17\u002Fspring-component-vs-bean","Spring @Component vs @Bean: What's the Difference?","@Component vs @Bean in Spring: @Component marks classes you own for classpath scanning, @Bean builds beans from methods. Learn when to use each, with examples.",{"slug":4487,"date":4488,"published":11,"tags":4489,"author":10,"cover":4490,"video":10,"excerpt":10,"shortDesc":4485},"spring-component-vs-bean","2017-05-17T09:00:06-04:00",[2442,1849],".\u002Fbean-vs-component.png",{"minutes":718,"text":1868},{"_id":4493,"path":4494,"title":4495,"description":4496,"meta":4497,"readingTime":4502},"blog\u002Fblog\u002F2017\u002F05\u002F15\u002Fgetting-started-spring-boot-actuator.md","\u002Fblog\u002F2017\u002F05\u002F15\u002Fgetting-started-spring-boot-actuator","Getting Started with Spring Boot Actuator Endpoints","Getting started with Spring Boot Actuator: add the dependency, explore the built-in production-ready endpoints for health and metrics, and secure them.",{"slug":4498,"date":4499,"published":11,"tags":4500,"author":10,"cover":4501,"video":10,"excerpt":10,"shortDesc":4496},"getting-started-spring-boot-actuator","2017-05-15T08:00:22-04:00",[14],".\u002Fpexels-photo-169573-760x507.jpeg",{"minutes":481,"text":2002},{"_id":4504,"path":4505,"title":4506,"description":4506,"meta":4507,"readingTime":4512},"blog\u002Fblog\u002F2017\u002F05\u002F12\u002F6-courses-itunes-u.md","\u002Fblog\u002F2017\u002F05\u002F12\u002F6-courses-itunes-u","6 Courses on iTunes U that can upgrade your Software Development Career",{"slug":4508,"date":4509,"published":11,"tags":4510,"author":10,"cover":4511,"video":10,"excerpt":10,"shortDesc":4506},"6-courses-itunes-u","2017-05-12T08:00:52-04:00",[4214],".\u002F2017-05-11_16-07-03-760x399.png",{"minutes":450,"text":3542},{"_id":4514,"path":4515,"title":4516,"description":4516,"meta":4517,"readingTime":4521},"blog\u002Fblog\u002F2017\u002F05\u002F10\u002Fspring-boot-moving-tomcat-jetty.md","\u002Fblog\u002F2017\u002F05\u002F10\u002Fspring-boot-moving-tomcat-jetty","Moving from Tomcat to Jetty in your Spring Boot Application",{"slug":4518,"date":4519,"published":11,"tags":4520,"author":10,"cover":4349,"video":10,"excerpt":10,"shortDesc":4516},"spring-boot-moving-tomcat-jetty","2017-05-10T09:00:06-04:00",[14],{"minutes":481,"text":2002},{"_id":4523,"path":4524,"title":4525,"description":4525,"meta":4526,"readingTime":4531},"blog\u002Fblog\u002F2017\u002F05\u002F08\u002Fenable-new-youtube-dark-theme-right-now.md","\u002Fblog\u002F2017\u002F05\u002F08\u002Fenable-new-youtube-dark-theme-right-now","Enable the new YouTube Dark Theme right now",{"slug":4527,"date":4528,"published":11,"tags":4529,"author":10,"cover":4530,"video":10,"excerpt":10,"shortDesc":4525},"enable-new-youtube-dark-theme-right-now","2017-05-08T08:00:50-04:00",[1949],".\u002F2017-05-04_23-05-38-760x367.png",{"minutes":437,"text":3744},{"_id":4533,"path":4534,"title":4535,"description":4535,"meta":4536,"readingTime":4541},"blog\u002Fblog\u002F2017\u002F05\u002F05\u002Fmake-weakness-strength.md","\u002Fblog\u002F2017\u002F05\u002F05\u002Fmake-weakness-strength","How to Make your weakness your strength",{"slug":4537,"date":4538,"published":11,"tags":4539,"author":10,"cover":4540,"video":10,"excerpt":10,"shortDesc":4535},"make-weakness-strength","2017-05-05T08:00:15-04:00",[4214],".\u002Flucas-rosas-98304-760x507.jpg",{"minutes":495,"text":2041},{"_id":4543,"path":4544,"title":4545,"description":4545,"meta":4546,"readingTime":4551},"blog\u002Fblog\u002F2017\u002F05\u002F03\u002Fspring-angular-applications.md","\u002Fblog\u002F2017\u002F05\u002F03\u002Fspring-angular-applications","How to start writing Angular & Spring Applications",{"slug":4547,"date":4548,"published":11,"tags":4549,"author":10,"cover":4550,"video":10,"excerpt":10,"shortDesc":4545},"spring-angular-applications","2017-05-03T09:00:37-04:00",[4225,14],".\u002Fcarl-heyerdahl-181868-760x507.jpg",{"minutes":506,"text":1883},{"_id":4553,"path":4554,"title":4555,"description":4556,"meta":4557,"readingTime":4562},"blog\u002Fblog\u002F2017\u002F05\u002F01\u002Fadd-validation-spring-entities.md","\u002Fblog\u002F2017\u002F05\u002F01\u002Fadd-validation-spring-entities","How to Add Validation to Your Spring Boot Entities","Learn how to add Bean Validation to your Spring Boot entities with @NotNull and JPA, then build a custom constraint validator with ConstraintValidator.",{"slug":4558,"date":4559,"published":11,"tags":4560,"author":10,"cover":4561,"video":10,"excerpt":10,"shortDesc":4556},"add-validation-spring-entities","2017-05-01T16:37:13-04:00",[14],".\u002Fluis-llerena-14779-760x507.jpg",{"minutes":1322,"text":2080},{"_id":4564,"path":4565,"title":4566,"description":4566,"meta":4567,"readingTime":4572},"blog\u002Fblog\u002F2017\u002F04\u002F28\u002Fevery-developer-start-blog-right-now.md","\u002Fblog\u002F2017\u002F04\u002F28\u002Fevery-developer-start-blog-right-now","Why every developer should start a blog right now!",{"slug":4568,"date":4569,"published":11,"tags":4570,"author":10,"cover":4571,"video":10,"excerpt":10,"shortDesc":4566},"every-developer-start-blog-right-now","2017-04-28T09:15:56-04:00",[3908],".\u002Fken-tomita-239357-760x507.jpg",{"minutes":475,"text":2645},{"_id":4574,"path":4575,"title":4576,"description":4576,"meta":4577,"readingTime":4582},"blog\u002Fblog\u002F2017\u002F04\u002F26\u002Fwhat-is-going-wrong-on-the-spring-boot-view-layer.md","\u002Fblog\u002F2017\u002F04\u002F26\u002Fwhat-is-going-wrong-on-the-spring-boot-view-layer","What is going wrong on the Spring Boot View Layer?",{"slug":4578,"date":4579,"published":11,"tags":4580,"author":10,"cover":4581,"video":10,"excerpt":10,"shortDesc":4576},"what-is-going-wrong-on-the-spring-boot-view-layer","2017-04-26T09:02:28-04:00",[14],".\u002Fview_layer-760x760.png",{"minutes":495,"text":2041},{"_id":4584,"path":4585,"title":4586,"description":4586,"meta":4587,"readingTime":4592},"blog\u002Fblog\u002F2017\u002F04\u002F24\u002Fspring-boot-2-0-roadmap.md","\u002Fblog\u002F2017\u002F04\u002F24\u002Fspring-boot-2-0-roadmap","Spring Boot 2.0 Roadmap",{"slug":4588,"date":4589,"published":11,"tags":4590,"author":10,"cover":4591,"video":10,"excerpt":10,"shortDesc":4586},"spring-boot-2-0-roadmap","2017-04-24T08:00:05-04:00",[14],".\u002Fannie-spratt-161511-760x1140.jpg",{"minutes":475,"text":2645},{"_id":4594,"path":4595,"title":4596,"description":4596,"meta":4597,"readingTime":4603},"blog\u002Fblog\u002F2017\u002F04\u002F21\u002Fhow-do-you-define-success.md","\u002Fblog\u002F2017\u002F04\u002F21\u002Fhow-do-you-define-success","How do you Define Success as a Software Developer",{"slug":4598,"date":4599,"published":11,"tags":4600,"author":10,"cover":4602,"video":10,"excerpt":10,"shortDesc":4596},"how-do-you-define-success","2017-04-21T10:00:07-04:00",[4601],"programming",".\u002Fwilliam-stitt-224301-760x1140.jpg",{"minutes":475,"text":2645},{"_id":4605,"path":4606,"title":4607,"description":4607,"meta":4608,"readingTime":4612},"blog\u002Fblog\u002F2017\u002F04\u002F19\u002Fwhat-is-jhipster.md","\u002Fblog\u002F2017\u002F04\u002F19\u002Fwhat-is-jhipster","What is JHipster & Why you need to start using it today!",{"slug":4609,"date":4610,"published":11,"tags":4611,"author":10,"cover":4246,"video":10,"excerpt":10,"shortDesc":4607},"what-is-jhipster","2017-04-19T09:38:31-04:00",[13,14],{"minutes":463,"text":3369},{"_id":4614,"path":4615,"title":4616,"description":4616,"meta":4617,"readingTime":4622},"blog\u002Fblog\u002F2017\u002F04\u002F17\u002Fjava-9.md","\u002Fblog\u002F2017\u002F04\u002F17\u002Fjava-9","Getting Started with Java 9",{"slug":4618,"date":4619,"published":11,"tags":4620,"author":10,"cover":4621,"video":10,"excerpt":10,"shortDesc":4616},"java-9","2017-04-17T11:05:58-04:00",[13],".\u002FJava9-760x428.png",{"minutes":463,"text":3369},{"_id":4624,"path":4625,"title":4626,"description":4627,"meta":4628,"readingTime":4633},"blog\u002Fblog\u002F2017\u002F04\u002F10\u002Finserting-a-groovy-date-into-a-time-stamp-column.md","\u002Fblog\u002F2017\u002F04\u002F10\u002Finserting-a-groovy-date-into-a-time-stamp-column","Inserting a Groovy Date into a Time Stamp Column","Inserting a Groovy Date into a Timestamp Column",{"slug":4629,"date":4630,"published":11,"tags":4631,"author":10,"cover":4632,"video":10,"excerpt":10,"shortDesc":4627},"inserting-a-groovy-date-into-a-time-stamp-column","2017-04-10T08:00:06-04:00",[4193],".\u002FGroovyDate-760x428.png",{"minutes":463,"text":3369},{"_id":4635,"path":4636,"title":4637,"description":4638,"meta":4639,"readingTime":4645},"blog\u002Fblog\u002F2017\u002F04\u002F07\u002Fspring-boot-command-line-runner.md","\u002Fblog\u002F2017\u002F04\u002F07\u002Fspring-boot-command-line-runner","Spring Boot CommandLineRunner Example","Learn how to use the Spring Boot CommandLineRunner interface to run code at application startup, load initial data, and order multiple runners in Java.",{"slug":4640,"date":4641,"published":11,"tags":4642,"author":10,"cover":4643,"video":4644,"excerpt":10,"shortDesc":4638},"spring-boot-command-line-runner","2017-04-07T08:00:43-04:00",[14],".\u002Fspring-boot-command-line-runner-thumbnail.png","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FgBN8x4yN5Ks",{"minutes":754,"text":2119},{"_id":4647,"path":4648,"title":4649,"description":4650,"meta":4651,"readingTime":4656},"blog\u002Fblog\u002F2017\u002F04\u002F05\u002Fjava-equals.md","\u002Fblog\u002F2017\u002F04\u002F05\u002Fjava-equals","Java: What is the difference between equals and ==","Understand the difference between == and .equals() in Java. Learn why == compares references while .equals() compares String values, and how to fix it.",{"slug":4652,"date":4653,"published":11,"tags":4654,"author":10,"cover":4655,"video":10,"excerpt":10,"shortDesc":4650},"java-equals","2017-04-05T08:00:50-04:00",[13],".\u002Fjava_equals-760x428.png",{"minutes":501,"text":2094},{"_id":4658,"path":4659,"title":4660,"description":4660,"meta":4661,"readingTime":4666},"blog\u002Fblog\u002F2017\u002F04\u002F03\u002F2000-subscribers-youtube.md","\u002Fblog\u002F2017\u002F04\u002F03\u002F2000-subscribers-youtube","2,000 Subscribers on YouTube!!",{"slug":4662,"date":4663,"published":11,"tags":4664,"author":10,"cover":4665,"video":10,"excerpt":10,"shortDesc":4660},"2000-subscribers-youtube","2017-04-03T08:30:34-04:00",[1949],".\u002F200-subscribers.jpg",{"minutes":437,"text":3744},{"_id":4668,"path":4669,"title":4670,"description":4671,"meta":4672,"readingTime":4677},"blog\u002Fblog\u002F2017\u002F03\u002F31\u002Fusing-project-lombok-spring-boot.md","\u002Fblog\u002F2017\u002F03\u002F31\u002Fusing-project-lombok-spring-boot","Using Project Lombok in your Spring Boot Project","Learn how to use Project Lombok in Spring Boot to reduce boilerplate code — the @Data annotation generates getters, setters, toString, equals & hashCode.",{"slug":4673,"date":4674,"published":11,"tags":4675,"author":10,"cover":4676,"video":10,"excerpt":10,"shortDesc":4671},"using-project-lombok-spring-boot","2017-03-31T08:00:38-04:00",[13,14],".\u002F2350-760x507.jpg",{"minutes":1358,"text":1897},{"_id":4679,"path":4680,"title":4681,"description":4682,"meta":4683,"readingTime":4688},"blog\u002Fblog\u002F2017\u002F03\u002F27\u002Fspring-stereotype-annotations.md","\u002Fblog\u002F2017\u002F03\u002F27\u002Fspring-stereotype-annotations","Spring Stereotype Annotations","Learn Spring stereotype annotations: @Component, @Service, @Repository, and @Controller, how component scanning registers them as beans, plus an AOP demo.",{"slug":4684,"date":4685,"published":11,"tags":4686,"author":10,"cover":4687,"video":10,"excerpt":10,"shortDesc":4682},"spring-stereotype-annotations","2017-03-27T08:00:15-04:00",[14],".\u002Fstereotype_annotations.png",{"minutes":1322,"text":2080},{"_id":4690,"path":4691,"title":4692,"description":4692,"meta":4693,"readingTime":4698},"blog\u002Fblog\u002F2017\u002F03\u002F24\u002Fspring-boot-convention-based-error-pages.md","\u002Fblog\u002F2017\u002F03\u002F24\u002Fspring-boot-convention-based-error-pages","Spring Boot Convention Based Error Pages",{"slug":4694,"date":4695,"published":11,"tags":4696,"author":10,"cover":4697,"video":10,"excerpt":10,"shortDesc":4692},"spring-boot-convention-based-error-pages","2017-03-24T08:00:33-04:00",[14],".\u002Fcustom-error-cover.jpg",{"minutes":481,"text":2002},{"_id":4700,"path":4701,"title":4702,"description":4702,"meta":4703,"readingTime":4708},"blog\u002Fblog\u002F2017\u002F03\u002F22\u002Fspring-boot-entity-scan.md","\u002Fblog\u002F2017\u002F03\u002F22\u002Fspring-boot-entity-scan","Spring Boot Entity Scan",{"slug":4704,"date":4705,"published":11,"tags":4706,"author":10,"cover":4707,"video":10,"excerpt":10,"shortDesc":4702},"spring-boot-entity-scan","2017-03-22T08:00:44-04:00",[14],".\u002Fentity-scan.jpg",{"minutes":490,"text":1953},{"_id":4710,"path":4711,"title":4712,"description":4713,"meta":4714,"readingTime":4720},"blog\u002Fblog\u002F2016\u002F10\u002F04\u002Fmade-20000-sleep.md","\u002Fblog\u002F2016\u002F10\u002F04\u002Fmade-20000-sleep","How I Made $20,000 in my Sleep","In this article I hope to inspire you to take action now!",{"slug":4715,"date":4716,"published":11,"tags":4717,"author":10,"cover":4719,"video":10,"excerpt":10,"shortDesc":4713},"made-20000-sleep","2016-10-04T20:26:59-04:00",[4718],"udemy",".\u002Fudemy_milestone_20k_2-1024x688.png",{"minutes":475,"text":2645},{"_id":4722,"path":4723,"title":4724,"description":4725,"meta":4726,"readingTime":4731},"blog\u002Fblog\u002F2016\u002F09\u002F20\u002Ftech-elevator-meetup-summary.md","\u002Fblog\u002F2016\u002F09\u002F20\u002Ftech-elevator-meetup-summary","Tech Elevator Meetup Summary","A summary of the panel I was asked to be on at Tech Elevator.",{"slug":4727,"date":4728,"published":11,"tags":4729,"author":10,"cover":4730,"video":10,"excerpt":10,"shortDesc":4725},"tech-elevator-meetup-summary","2016-09-20T08:00:53-04:00",[4601],".\u002Fhighres_454339592.jpeg",{"minutes":444,"text":3528},{"_id":4733,"path":4734,"title":4735,"description":4736,"meta":4737,"readingTime":4742},"blog\u002Fblog\u002F2016\u002F01\u002F14\u002Fspring-mvc-get-controller-method-name.md","\u002Fblog\u002F2016\u002F01\u002F14\u002Fspring-mvc-get-controller-method-name","Spring MVC Get Controller & Method Name","How to get the current controller and method name Spring MVC Get Controller & Method Name",{"slug":4738,"date":4739,"published":11,"tags":4740,"author":10,"cover":4741,"video":10,"excerpt":10,"shortDesc":4736},"spring-mvc-get-controller-method-name","2016-01-14T16:27:22-05:00",[13,14],".\u002Fcontroller-cover.jpg",{"minutes":712,"text":1855},{"_id":4744,"path":4745,"title":4746,"description":4747,"meta":4748,"readingTime":4753},"blog\u002Fblog\u002F2016\u002F01\u002F13\u002Fsending-async-emails-in-spring.md","\u002Fblog\u002F2016\u002F01\u002F13\u002Fsending-async-emails-in-spring","Sending Async Emails in Spring","In this article I will walk you through how to send email asynchronously in Spring Boot.",{"slug":4749,"date":4750,"published":11,"tags":4751,"author":10,"cover":4752,"video":10,"excerpt":10,"shortDesc":4747},"sending-async-emails-in-spring","2016-01-13T10:30:20-05:00",[13,14],".\u002Femail-cover.jpg",{"minutes":495,"text":2041},{"_id":4755,"path":4756,"title":4757,"description":4757,"meta":4758,"readingTime":4763},"blog\u002Fblog\u002F2015\u002F11\u002F25\u002Fusing-gorm-in-spring-boot.md","\u002Fblog\u002F2015\u002F11\u002F25\u002Fusing-gorm-in-spring-boot","Using GORM in Spring Boot",{"slug":4759,"date":4760,"published":11,"tags":4761,"author":10,"cover":4762,"video":10,"excerpt":10,"shortDesc":4757},"using-gorm-in-spring-boot","2015-11-25T11:43:13-05:00",[4193,14,13],".\u002Fadult-back-view-data-1181345.jpg",{"minutes":1380,"text":2408},{"_id":4765,"path":4766,"title":4767,"description":4767,"meta":4768,"readingTime":4773},"blog\u002Fblog\u002F2015\u002F10\u002F23\u002Fspring-boot-application-annotation.md","\u002Fblog\u002F2015\u002F10\u002F23\u002Fspring-boot-application-annotation","Spring Boot Application Annotation",{"slug":4769,"date":4770,"published":11,"tags":4771,"author":10,"cover":4772,"video":10,"excerpt":10,"shortDesc":4767},"spring-boot-application-annotation","2015-10-23T09:08:37-04:00",[13,14],".\u002Faccess-code-connection-1181467.jpg",{"minutes":506,"text":1883},{"_id":4775,"path":4776,"title":4777,"description":4778,"meta":4779,"readingTime":4784},"blog\u002Fblog\u002F2015\u002F04\u002F24\u002Fready-player-one-review.md","\u002Fblog\u002F2015\u002F04\u002F24\u002Fready-player-one-review","Ready Player One Review","A quick review of the book Ready Player One",{"slug":4780,"date":4781,"published":11,"tags":4782,"author":10,"cover":4783,"video":10,"excerpt":10,"shortDesc":4778},"ready-player-one-review","2015-04-24T17:00:00.000Z",[1738],"bookcase-books-bookshelves-159711.jpg",{"minutes":469,"text":3101},{"_id":4786,"path":4787,"title":4788,"description":4789,"meta":4790,"readingTime":4795},"blog\u002Fblog\u002F2015\u002F02\u002F05\u002Fsql-server-exception-statement-not-return-result-set.md","\u002Fblog\u002F2015\u002F02\u002F05\u002Fsql-server-exception-statement-not-return-result-set","SQL Server Exception - The Statement Did Not Return A Result Set","Using Stored Procedures in a Grails Application with Groovy",{"slug":4791,"date":4792,"published":11,"tags":4793,"author":10,"cover":4794,"video":10,"excerpt":10,"shortDesc":4789},"sql-server-exception-statement-not-return-result-set","2015-02-05T11:48:18-05:00",[4193,4439],".\u002Fdata-cover.jpg",{"minutes":469,"text":3101},{"_id":4797,"path":4798,"title":4799,"description":4800,"meta":4801,"readingTime":4805},"blog\u002Fblog\u002F2014\u002F04\u002F08\u002Fgravatars-on-a-grails-application.md","\u002Fblog\u002F2014\u002F04\u002F08\u002Fgravatars-on-a-grails-application","Gravatars on a Grails Application","Gravatars in a Grails Application",{"slug":4802,"date":4803,"published":11,"tags":4804,"author":10,"cover":10,"video":10,"excerpt":10,"shortDesc":4800},"gravatars-on-a-grails-application","2014-04-08T14:04:00-04:00",[4389,4193],{"minutes":475,"text":2645},{"_id":4807,"path":4808,"title":4809,"description":4810,"meta":4811,"readingTime":4815},"blog\u002Fblog\u002F2014\u002F03\u002F31\u002Fgrails-generating-links-in-your-domain-class.md","\u002Fblog\u002F2014\u002F03\u002F31\u002Fgrails-generating-links-in-your-domain-class","Grails: Generating links in your domain class","Grails: Generating Links in your Domain Class",{"slug":4812,"date":4813,"published":11,"tags":4814,"author":10,"cover":10,"video":10,"excerpt":10,"shortDesc":4810},"grails-generating-links-in-your-domain-class","2014-03-31T09:03:00-04:00",[4389],{"minutes":481,"text":2002},{"_id":4817,"path":4818,"title":4819,"description":4820,"meta":4821,"readingTime":4825},"blog\u002Fblog\u002F2014\u002F02\u002F25\u002Fgrails-spring-security-plugin-logout-postonly-setting.md","\u002Fblog\u002F2014\u002F02\u002F25\u002Fgrails-spring-security-plugin-logout-postonly-setting","Grails Spring Security Plugin -  Logout postOnly setting","Grails Spring Security Plugin - Logout PostOnly Setting",{"slug":4822,"date":4823,"published":11,"tags":4824,"author":10,"cover":10,"video":10,"excerpt":10,"shortDesc":4820},"grails-spring-security-plugin-logout-postonly-setting","2014-02-25T13:02:00-05:00",[4389],{"minutes":450,"text":3542},{"_id":4827,"path":4828,"title":4829,"description":4829,"meta":4830,"readingTime":4836},"blog\u002Fblog\u002F2014\u002F02\u002F23\u002Fcreating-and-testing-your-first-grails-tag-library.md","\u002Fblog\u002F2014\u002F02\u002F23\u002Fcreating-and-testing-your-first-grails-tag-library","Creating and testing your first Grails Tag Library",{"slug":4831,"date":4832,"published":11,"tags":4833,"author":10,"cover":4834,"video":4835,"excerpt":10,"shortDesc":4829},"creating-and-testing-your-first-grails-tag-library","2014-02-23T07:02:00-05",[4389,4193],".\u002Ftesting-cover.jpg","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FvZ_7FfML9Xg",{"minutes":501,"text":2094},{"_id":4838,"path":4839,"title":4840,"description":4840,"meta":4841,"readingTime":4845},"blog\u002Fblog\u002F2013\u002F08\u002F27\u002Fgrails-mysql-boolean-gotcha.md","\u002Fblog\u002F2013\u002F08\u002F27\u002Fgrails-mysql-boolean-gotcha","Grails MySQL Boolean Gotcha",{"slug":4842,"date":4843,"published":11,"tags":4844,"author":10,"cover":10,"video":10,"excerpt":10,"shortDesc":4840},"grails-mysql-boolean-gotcha","2013-08-27T18:08:00-04:00",[4389,4193],{"minutes":475,"text":2645},{"_id":4847,"path":4848,"title":4849,"description":4849,"meta":4850,"readingTime":4854},"blog\u002Fblog\u002F2013\u002F08\u002F27\u002Fgrails-interactive-mode-use-it.md","\u002Fblog\u002F2013\u002F08\u002F27\u002Fgrails-interactive-mode-use-it","Grails Interactive Mode - USE IT",{"slug":4851,"date":4852,"published":11,"tags":4853,"author":10,"cover":10,"video":10,"excerpt":10,"shortDesc":4849},"grails-interactive-mode-use-it","2013-08-27T15:08:00-04:00",[4389],{"minutes":444,"text":3528},{"_id":4856,"path":4857,"title":4858,"description":4858,"meta":4859,"readingTime":4863},"blog\u002Fblog\u002F2013\u002F08\u002F23\u002Fintellij-spring-bean-injection-notification.md","\u002Fblog\u002F2013\u002F08\u002F23\u002Fintellij-spring-bean-injection-notification","IntelliJ Spring Bean Injection Notification",{"slug":4860,"date":4861,"published":11,"tags":4862,"author":10,"cover":10,"video":10,"excerpt":10,"shortDesc":4858},"intellij-spring-bean-injection-notification","2013-08-23T08:08:00-04:00",[4389,4193],{"minutes":437,"text":3744},{"_id":4865,"path":4866,"title":4867,"description":4867,"meta":4868,"readingTime":4872},"blog\u002Fblog\u002F2013\u002F08\u002F22\u002Fgroovy-ternary-operator.md","\u002Fblog\u002F2013\u002F08\u002F22\u002Fgroovy-ternary-operator","Groovy Ternary Operator",{"slug":4869,"date":4870,"published":11,"tags":4871,"author":10,"cover":10,"video":10,"excerpt":10,"shortDesc":4867},"groovy-ternary-operator","2013-08-22T13:08:00-04:00",[4193],{"minutes":463,"text":3369},{"_id":4874,"path":4875,"title":4876,"description":4876,"meta":4877,"readingTime":4881},"blog\u002Fblog\u002F2013\u002F08\u002F21\u002Fgroovy-collections-vs-my-current-thought-process.md","\u002Fblog\u002F2013\u002F08\u002F21\u002Fgroovy-collections-vs-my-current-thought-process","Groovy collections vs My Current Thought Process",{"slug":4878,"date":4879,"published":11,"tags":4880,"author":10,"cover":10,"video":10,"excerpt":10,"shortDesc":4876},"groovy-collections-vs-my-current-thought-process","2013-08-21T16:08:00-04:00",[4389,4193],{"minutes":495,"text":2041},{"_id":4883,"path":4884,"title":4885,"description":4885,"meta":4886,"readingTime":4890},"blog\u002Fblog\u002F2013\u002F08\u002F21\u002Fwriting-sql-in-a-grails-application.md","\u002Fblog\u002F2013\u002F08\u002F21\u002Fwriting-sql-in-a-grails-application","Writing SQL in a Grails Application",{"slug":4887,"date":4888,"published":11,"tags":4889,"author":10,"cover":10,"video":10,"excerpt":10,"shortDesc":4885},"writing-sql-in-a-grails-application","2013-08-21T12:08:00-04:00",[4389],{"minutes":463,"text":3369},{"_id":4892,"path":4893,"title":4894,"description":4894,"meta":4895,"readingTime":4899},"blog\u002Fblog\u002F2013\u002F08\u002F20\u002Fgrails-hibernate-logging.md","\u002Fblog\u002F2013\u002F08\u002F20\u002Fgrails-hibernate-logging","Grails Hibernate Logging",{"slug":4896,"date":4897,"published":11,"tags":4898,"author":10,"cover":10,"video":10,"excerpt":10,"shortDesc":4894},"grails-hibernate-logging","2013-08-20T17:08:00-04:00",[4389],{"minutes":437,"text":3744},{"_id":4901,"path":4902,"title":4903,"description":4903,"meta":4904,"readingTime":4908},"blog\u002Fblog\u002F2013\u002F08\u002F20\u002Fgroovy-primitive-data-types-vs-classes.md","\u002Fblog\u002F2013\u002F08\u002F20\u002Fgroovy-primitive-data-types-vs-classes","Groovy Primitive Data Types vs Objects",{"slug":4905,"date":4906,"published":11,"tags":4907,"author":10,"cover":10,"video":10,"excerpt":10,"shortDesc":4903},"groovy-primitive-data-types-vs-classes","2013-08-20T12:08:00-04:00",[4389,4193],{"minutes":469,"text":3101},{"_id":4910,"path":4911,"title":4912,"description":4912,"meta":4913,"readingTime":4917},"blog\u002Fblog\u002F2013\u002F08\u002F20\u002Fgroovys-null-safe-operator.md","\u002Fblog\u002F2013\u002F08\u002F20\u002Fgroovys-null-safe-operator","Groovy's null safe operator",{"slug":4914,"date":4915,"published":11,"tags":4916,"author":10,"cover":10,"video":10,"excerpt":10,"shortDesc":4912},"groovys-null-safe-operator","2013-08-20T06:08:00-04:00",[4389,4193],{"minutes":450,"text":3542},{"_id":4919,"path":4920,"title":4921,"description":4922,"meta":4923,"readingTime":4928},"blog\u002Fblog\u002F2010\u002F08\u002F04\u002Fcreate-sql-insert-statements-from-a-spreadsheet.md","\u002Fblog\u002F2010\u002F08\u002F04\u002Fcreate-sql-insert-statements-from-a-spreadsheet","Create SQL Insert Statements from a Spreadsheet","In this article, I will show you how to create SQL insert statements from a spreadsheet",{"slug":4924,"date":4925,"published":11,"tags":4926,"author":1851,"cover":4927,"video":10,"excerpt":10,"shortDesc":4922},"create-sql-insert-statements-from-a-spreadsheet","2010-08-04T15:08:00.000Z",[4439],".\u002Fsql-cover.png",{"minutes":450,"text":3542}]