{"id":3671,"date":"2025-12-24T10:01:23","date_gmt":"2025-12-24T15:01:23","guid":{"rendered":"https:\/\/www.mymiller.name\/wordpress\/?p=3671"},"modified":"2025-12-24T10:01:23","modified_gmt":"2025-12-24T15:01:23","slug":"spring-cloud-data-flow-orchestrating-machine-learning-pipelines","status":"publish","type":"post","link":"https:\/\/www.mymiller.name\/wordpress\/spring_ai\/spring-cloud-data-flow-orchestrating-machine-learning-pipelines\/","title":{"rendered":"Spring Cloud Data Flow: Orchestrating Machine Learning Pipelines"},"content":{"rendered":"\n<div class=\"wp-block-jetpack-markdown\"><p>In the dynamic world of machine learning, the journey from raw data to a deployed model involves a series of intricate steps. Spring Cloud Data Flow (SCDF) emerges as a powerful ally, offering a comprehensive platform to streamline and manage these complex data pipelines. In this guide, we\u2019ll delve into the intricacies of SCDF, exploring its core components, visual interface, Java-based customization, scaling capabilities, and its pivotal role in orchestrating machine learning workflows.<\/p>\n<h3>Unraveling Spring Cloud Data Flow: The Visual Conductor<\/h3>\n<p>At its heart, SCDF is an open-source framework meticulously designed to simplify the creation and management of data pipelines. It embraces a microservices architecture, where complex pipelines are decomposed into smaller, reusable components \u2013 sources, processors, and sinks. This modular approach brings unparalleled flexibility and scalability to your data processing endeavors.<\/p>\n<h3>The Stages of a Data Pipeline: The Visual Symphony<\/h3>\n<p>A typical SCDF data pipeline unfolds in three distinct stages:<\/p>\n<ol>\n<li>\n<p><strong>Sources:<\/strong> The wellspring of your data journey. Sources, acting as the instruments introducing the melody, can range from file systems and databases to message brokers like Kafka or RabbitMQ, feeding your pipeline with raw data.<\/p>\n<\/li>\n<li>\n<p><strong>Processors:<\/strong> The heart of your pipeline, where the transformation magic happens. Processors, akin to skilled musicians, modify and enrich your data. They handle tasks like filtering, aggregation, data cleansing, and feature engineering, preparing your data for the grand finale \u2013 the machine learning model.<\/p>\n<\/li>\n<li>\n<p><strong>Sinks:<\/strong> The final destination of your processed data. Sinks, similar to the audience receiving the music, store or utilize the refined information. They can be databases, file systems, or even your eager machine learning models.<\/p>\n<\/li>\n<\/ol>\n<h3>The SCDF UI: Your Visual Command Center<\/h3>\n<p>SCDF\u2019s user interface is designed for clarity and ease of use. It empowers you to build pipelines with intuitive drag-and-drop actions, configure components effortlessly, and monitor pipeline health in real-time.<\/p>\n<h3>Project Setup: Laying the Foundation<\/h3>\n<p>To embark on your SCDF journey, set up a Spring Boot project with the necessary dependencies. Utilize Spring Initializr to bootstrap your project, select the \u201cSpring Cloud Data Flow\u201d dependency, and choose your build tool (Maven or Gradle).<\/p>\n<h3>Application Configuration: Connecting to the SCDF Server<\/h3>\n<p>Your Spring Boot application needs to be aware of the SCDF server it will interact with. This is achieved through configuration properties, typically defined in your <code>application.properties<\/code> or <code>application.yml<\/code> file.<\/p>\n<p>Here\u2019s a basic example:<\/p>\n<pre><code class=\"language-properties\">spring.cloud.dataflow.url= http:\/\/localhost:9393  # URL of your SCDF server\nspring.cloud.dataflow.username= your-username   # If authentication is enabled\nspring.cloud.dataflow.password= your-password\n<\/code><\/pre>\n<p>These properties establish the connection between your application and the SCDF server, enabling you to register your custom sources, processors, and sinks and deploy them as part of your data pipelines.<\/p>\n<h3>Crafting Sources, Processors, and Sinks in Java<\/h3>\n<p>SCDF empowers you to define pipeline components using Java code, offering granular control and customization:<\/p>\n<ul>\n<li><strong>Sources:<\/strong> Annotate your source class with <code>@InboundChannelAdapter<\/code>, implement the <code>MessageSource<\/code> interface, and use the <code>Source<\/code> annotation.<\/li>\n<\/ul>\n<pre><code class=\"language-java\">@EnableBinding(Source.class)\npublic class MyFileSource {\n\n    @InboundChannelAdapter(channel = Source.OUTPUT)\n    public Message&lt;String&gt; generateMessage() {\n        \/\/ Logic to read data from a file\n        String data = readFile();\n        return MessageBuilder.withPayload(data).build();\n    }\n}\n<\/code><\/pre>\n<ul>\n<li><strong>Processors:<\/strong> Annotate your processor class with <code>@Transformer<\/code>, implement the <code>Function<\/code> interface, and use the <code>StreamListener<\/code> annotation.<\/li>\n<\/ul>\n<pre><code class=\"language-java\">@EnableBinding(Processor.class)\npublic class MyDataProcessor {\n\n    @Transformer(inputChannel = Processor.INPUT, outputChannel = Processor.OUTPUT)\n    public String transformData(String data) {\n        \/\/ Apply data transformation logic\n        return transformedData;\n    }\n}\n<\/code><\/pre>\n<ul>\n<li><strong>Sinks:<\/strong> Annotate your sink class with <code>@StreamListener<\/code> and implement the logic to handle incoming data.<\/li>\n<\/ul>\n<pre><code class=\"language-java\">@EnableBinding(Sink.class)\npublic class MyDatabaseSink {\n\n    @StreamListener(Sink.INPUT)\n    public void handleMessage(String message) {\n        \/\/ Logic to write data to a database\n        writeToDatabase(message);\n    }\n}\n<\/code><\/pre>\n<h3>Registering your Custom Components<\/h3>\n<p>Once you\u2019ve created your sources, processors, and sinks, you need to register them with the SCDF server. You can do this using the SCDF Shell or the REST API.<\/p>\n<ul>\n<li>\n<p><strong>Using the SCDF Shell<\/strong><\/p>\n<pre><code class=\"language-bash\">dataflow:&gt;app register --name my-file-source --type source --uri maven:\/\/com.example:my-file-source:1.0.0\n<\/code><\/pre>\n<\/li>\n<li>\n<p><strong>Using the REST API<\/strong>\nYou\u2019ll need to make a POST request to the <code>\/apps<\/code> endpoint of the SCDF server.<\/p>\n<\/li>\n<\/ul>\n<h3>Scaling Your Pipeline: Handling the Data Deluge<\/h3>\n<p>SCDF empowers you to scale your pipeline components horizontally to accommodate growing data volumes or processing demands. Here\u2019s how:<\/p>\n<ol>\n<li>\n<p><strong>Deployment Platforms:<\/strong> Deploy your SCDF applications on platforms like Kubernetes or Cloud Foundry that support auto-scaling.<\/p>\n<\/li>\n<li>\n<p><strong>SCDF Server Configuration:<\/strong> Configure your SCDF server to enable scaling for specific applications or the entire pipeline.<\/p>\n<\/li>\n<li>\n<p><strong>Application Properties:<\/strong>  Fine-tune scaling behavior by setting properties like <code>spring.cloud.stream.instanceCount<\/code> or <code>spring.cloud.task.concurrency<\/code> in your application\u2019s configuration.<\/p>\n<\/li>\n<li>\n<p><strong>Monitoring and Adjustment:<\/strong>  Monitor your pipeline\u2019s performance and adjust scaling parameters as needed to ensure optimal throughput and resource utilization.<\/p>\n<\/li>\n<\/ol>\n<h3>Machine Learning: SCDF as Your Pipeline Maestro<\/h3>\n<p>SCDF orchestrates machine learning pipelines with finesse, facilitating data preprocessing, model training, deployment, and monitoring. It empowers you to embed custom models, implement complex transformations, and dynamically configure your pipelines.<\/p>\n<h3>SCDF Deployment Architecture: Understanding the Layout<\/h3>\n<p>A typical SCDF deployment involves a harmonious ensemble of components, each playing a crucial role in orchestrating your data pipelines:<\/p>\n<p><strong>1. SCDF Server: The Maestro<\/strong><\/p>\n<ul>\n<li><strong>Role:<\/strong>\n<ul>\n<li>The central brain of the operation, responsible for storing pipeline definitions, managing deployments, and monitoring the overall health of your data processing workflows.<\/li>\n<\/ul>\n<\/li>\n<li><strong>Configuration &amp; Setup:<\/strong>\n<ul>\n<li><strong>Project:<\/strong> <code>spring-cloud-dataflow-server<\/code><\/li>\n<li>Typically deployed as a Spring Boot application.<\/li>\n<li>Requires a database (e.g., MySQL, PostgreSQL) to store metadata about pipelines, tasks, and application registrations.<\/li>\n<li>Can be configured to connect to various message brokers (e.g., RabbitMQ, Kafka) for communication between pipeline components.<\/li>\n<li>Security can be enforced through authentication and authorization mechanisms.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><strong>2. Skipper Server: The Kubernetes Stage Manager<\/strong><\/p>\n<ul>\n<li><strong>Role:<\/strong>\n<ul>\n<li>Specializes in deploying and orchestrating the individual applications (sources, processors, sinks) that constitute your pipelines on a Kubernetes cluster.<\/li>\n<li>It interacts with the Kubernetes API to manage the lifecycle of these applications, including deployment, scaling, and updates<\/li>\n<\/ul>\n<\/li>\n<li><strong>Configuration &amp; Setup:<\/strong>\n<ul>\n<li><strong>Project:<\/strong> <code>spring-cloud-skipper-server<\/code><\/li>\n<li>Deployed as a Spring Boot application, typically within a Kubernetes cluster itself.<\/li>\n<li>Requires configuration to connect to the Kubernetes API server, usually through providing credentials and specifying the cluster\u2019s endpoint.<\/li>\n<li>Leverages Kubernetes manifests (YAML files) to define the desired state of your applications, including container images, resource requirements, environment variables, and service definitions<\/li>\n<li>Supports Helm charts for packaging and managing complex application deployments<\/li>\n<li>Enables various deployment strategies like blue-green deployments, canary releases and rolling updates through its integration with Kubernetes deployment objects<\/li>\n<li>Can be configured to handle application health checks and perform automatic rollbacks in case of deployment failures.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><strong>3. Data Flow Server: The Composer\u2019s Interface<\/strong><\/p>\n<ul>\n<li><strong>Role:<\/strong>\n<ul>\n<li>Provides the REST API and the intuitive web-based UI that you interact with to design, deploy, and monitor your pipelines.<\/li>\n<li>It\u2019s the bridge between you and the underlying SCDF infrastructure.<\/li>\n<\/ul>\n<\/li>\n<li><strong>Configuration &amp; Setup:<\/strong>\n<ul>\n<li><strong>Project:<\/strong> <code>spring-cloud-dataflow-ui<\/code><\/li>\n<li>Yet another Spring Boot application.<\/li>\n<li>Connects to the SCDF Server to access pipeline definitions and deployment information.<\/li>\n<li>Can be customized with themes and extensions to enhance the user experience.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><strong>4. Application Instances: The Performers<\/strong><\/p>\n<ul>\n<li><strong>Role:<\/strong>\n<ul>\n<li>These are the actual running instances of your sources, processors, and sinks.<\/li>\n<li>They execute the data processing logic defined in your pipeline.<\/li>\n<\/ul>\n<\/li>\n<li><strong>Configuration &amp; Setup:<\/strong>\n<ul>\n<li><strong>Projects:<\/strong>\n<ul>\n<li>For stream processing: <code>spring-cloud-starter-stream-XXX<\/code> (where XXX is the binder implementation for your chosen message broker, e.g., <code>kafka<\/code>, <code>rabbit<\/code>)<\/li>\n<li>For task\/batch processing: <code>spring-cloud-starter-task<\/code><\/li>\n<\/ul>\n<\/li>\n<li>Developed as Spring Boot applications, leveraging Spring Cloud Stream or Spring Cloud Task frameworks.<\/li>\n<li>Packaged as Docker containers or other deployable artifacts for easy deployment on the target platform.<\/li>\n<li>Configuration properties can be set to control their behavior, such as input\/output bindings, data partitioning, and error handling strategies.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h3>Scaling in SCDF: Expanding the Performance<\/h3>\n<p>SCDF leverages the underlying deployment platform\u2019s capabilities to scale your pipeline components. For instance, on Kubernetes, you can configure Horizontal Pod Autoscalers (HPAs) to dynamically adjust the number of instances based on metrics like CPU or memory usage. This ensures your pipeline can handle varying workloads and maintain optimal performance, even during peak data flows.<\/p>\n<p>With these components working in concert, SCDF provides a robust and scalable foundation for building and managing your machine learning pipelines.<\/p>\n<p>Spring Cloud Data Flow emerges as a powerful conductor in the world of machine learning, orchestrating the intricate dance of data pipelines with visual clarity and efficiency. Its microservices architecture, user-friendly interface, Java-based customization, and scaling capabilities make it an indispensable asset for any data-driven organization. With SCDF, your machine learning projects will flow seamlessly, transforming raw data into valuable insights.<\/p>\n<\/div>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":3673,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_coblocks_attr":"","_coblocks_dimensions":"","_coblocks_responsive_height":"","_coblocks_accordion_ie_support":"","jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[443],"tags":[429,69,319],"series":[420],"class_list":["post-3671","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-spring_ai","tag-ai","tag-java-2","tag-spring","series-ai-ml-dl"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/09\/ai-generated-8411275_1280-jpg.avif","jetpack-related-posts":[{"id":3951,"url":"https:\/\/www.mymiller.name\/wordpress\/java\/scaling-streams-mastering-virtual-threads-in-spring-boot-4-and-java-25\/","url_meta":{"origin":3671,"position":0},"title":"Scaling Streams: Mastering Virtual Threads in Spring Boot 4 and Java 25","author":"Jeffery Miller","date":"December 22, 2025","format":false,"excerpt":"As a software architect, I\u2019ve seen the industry shift from heavy platform threads to reactive streams, and finally to the \"best of both worlds\": Virtual Threads. With the recent release of Spring Boot 4.0 and Java 25 (LTS), Project Loom's innovations have officially become the bedrock of high-concurrency enterprise Java.\u2026","rel":"","context":"In &quot;JAVA&quot;","block_context":{"text":"JAVA","link":"https:\/\/www.mymiller.name\/wordpress\/category\/java\/"},"img":{"alt_text":"","src":"https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2025\/12\/Gemini_Generated_Image_wqijejwqijejwqij-scaled.avif","width":350,"height":200,"srcset":"https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2025\/12\/Gemini_Generated_Image_wqijejwqijejwqij-scaled.avif 1x, https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2025\/12\/Gemini_Generated_Image_wqijejwqijejwqij-scaled.avif 1.5x, https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2025\/12\/Gemini_Generated_Image_wqijejwqijejwqij-scaled.avif 2x, https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2025\/12\/Gemini_Generated_Image_wqijejwqijejwqij-scaled.avif 3x"},"classes":[]},{"id":3564,"url":"https:\/\/www.mymiller.name\/wordpress\/spring_ai\/anomaly-detection-in-spring-boot-gateway-with-ai-and-dl4j-unsupervised-learning-approach\/","url_meta":{"origin":3671,"position":1},"title":"Anomaly Detection in Spring Boot Gateway with AI and DL4J: Unsupervised Learning Approach","author":"Jeffery Miller","date":"December 24, 2025","format":false,"excerpt":"In this article, we\u2019ll focus on using unsupervised learning with DL4J to detect anomalies in data traffic passing through your Spring Boot Gateway. This is especially useful when you don\u2019t have labeled data on what constitutes \u201cnormal\u201d vs. \u201canomalous\u201d traffic. Potential Features for Anomaly Detection in API Gateway Traffic The\u2026","rel":"","context":"In &quot;Spring AI&quot;","block_context":{"text":"Spring AI","link":"https:\/\/www.mymiller.name\/wordpress\/category\/spring_ai\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/06\/Gemini_Generated_Image_rzr70rzr70rzr70r.jpg?fit=1200%2C1200&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/06\/Gemini_Generated_Image_rzr70rzr70rzr70r.jpg?fit=1200%2C1200&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/06\/Gemini_Generated_Image_rzr70rzr70rzr70r.jpg?fit=1200%2C1200&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/06\/Gemini_Generated_Image_rzr70rzr70rzr70r.jpg?fit=1200%2C1200&ssl=1&resize=700%2C400 2x, https:\/\/i0.wp.com\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/06\/Gemini_Generated_Image_rzr70rzr70rzr70r.jpg?fit=1200%2C1200&ssl=1&resize=1050%2C600 3x"},"classes":[]},{"id":3931,"url":"https:\/\/www.mymiller.name\/wordpress\/uncategorized\/advanced-spring-ai-creating-agentic-workflows-with-function-calling\/","url_meta":{"origin":3671,"position":2},"title":"Advanced Spring AI: Creating Agentic Workflows with Function Calling","author":"Jeffery Miller","date":"November 24, 2025","format":false,"excerpt":"The landscape of AI is rapidly evolving, moving beyond simple request-response models to more sophisticated, agentic systems. These systems empower Large Language Models (LLMs) to not just generate text, but to act within your applications, making them an active and integral part of your business logic. Spring AI is at\u2026","rel":"","context":"Similar post","block_context":{"text":"Similar post","link":""},"img":{"alt_text":"","src":"https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2025\/11\/Gemini_Generated_Image_kg5i0ykg5i0ykg5i.avif","width":350,"height":200,"srcset":"https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2025\/11\/Gemini_Generated_Image_kg5i0ykg5i0ykg5i.avif 1x, https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2025\/11\/Gemini_Generated_Image_kg5i0ykg5i0ykg5i.avif 1.5x, https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2025\/11\/Gemini_Generated_Image_kg5i0ykg5i0ykg5i.avif 2x"},"classes":[]},{"id":3574,"url":"https:\/\/www.mymiller.name\/wordpress\/spring_ai\/deeplearning4j-and-spring-boot-a-powerful-duo-for-ai-powered-applications\/","url_meta":{"origin":3671,"position":3},"title":"Deeplearning4J and Spring Boot: A Powerful Duo for AI-Powered Applications","author":"Jeffery Miller","date":"April 20, 2026","format":false,"excerpt":"Deeplearning4J (DL4J) offers a comprehensive Java framework for deep learning, while Spring Boot streamlines the development of production-ready applications. By combining these two technologies, you unlock a flexible platform for building intelligent services that can handle various types of data. In this guide, we\u2019ll explore how to integrate DL4J into\u2026","rel":"","context":"In &quot;Spring AI&quot;","block_context":{"text":"Spring AI","link":"https:\/\/www.mymiller.name\/wordpress\/category\/spring_ai\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/04\/ai-generated-8453379_1280.jpg?fit=800%2C1200&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/04\/ai-generated-8453379_1280.jpg?fit=800%2C1200&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/04\/ai-generated-8453379_1280.jpg?fit=800%2C1200&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/04\/ai-generated-8453379_1280.jpg?fit=800%2C1200&ssl=1&resize=700%2C400 2x"},"classes":[]},{"id":3954,"url":"https:\/\/www.mymiller.name\/wordpress\/spring-batch\/architecting-batch-systems-with-spring-boot-4-0-and-spring-framework-7-0\/","url_meta":{"origin":3671,"position":4},"title":"Architecting Batch Systems with Spring Boot 4.0 and Spring Framework 7.0","author":"Jeffery Miller","date":"December 23, 2025","format":false,"excerpt":"With the release of Spring Boot 4.0 and Spring Framework 7.0, the batch processing landscape has evolved to embrace Java 25, Jakarta EE 11, and built-in resilience patterns. This guide provides a professional architectural blueprint for setting up a high-performance Spring Batch server. 1. Technical Baseline Java: 17 (Baseline) \/\u2026","rel":"","context":"In &quot;Spring Batch&quot;","block_context":{"text":"Spring Batch","link":"https:\/\/www.mymiller.name\/wordpress\/category\/spring-batch\/"},"img":{"alt_text":"","src":"https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2025\/12\/Gemini_Generated_Image_mmtkyammtkyammtk.avif","width":350,"height":200,"srcset":"https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2025\/12\/Gemini_Generated_Image_mmtkyammtkyammtk.avif 1x, https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2025\/12\/Gemini_Generated_Image_mmtkyammtkyammtk.avif 1.5x, https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2025\/12\/Gemini_Generated_Image_mmtkyammtkyammtk.avif 2x, https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2025\/12\/Gemini_Generated_Image_mmtkyammtkyammtk.avif 3x"},"classes":[]},{"id":3912,"url":"https:\/\/www.mymiller.name\/wordpress\/uncategorized\/spring-boot-4-0-whats-next-for-the-modern-java-architect\/","url_meta":{"origin":3671,"position":5},"title":"Spring Boot 4.0: What&#8217;s Next for the Modern Java Architect?","author":"Jeffery Miller","date":"September 24, 2025","format":false,"excerpt":"A Forward-Looking Comparison of Spring Boot 3.x and 4.0 Staying on top of the rapidly evolving Java ecosystem is paramount for any software architect. The shift from Spring Boot 2.x to 3.x brought significant changes, notably the move to Jakarta EE. Now, with the horizon of Spring Boot 4.0 and\u2026","rel":"","context":"Similar post","block_context":{"text":"Similar post","link":""},"img":{"alt_text":"","src":"https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2025\/09\/per-2056740_1280.avif","width":350,"height":200,"srcset":"https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2025\/09\/per-2056740_1280.avif 1x, https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2025\/09\/per-2056740_1280.avif 1.5x, https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2025\/09\/per-2056740_1280.avif 2x, https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2025\/09\/per-2056740_1280.avif 3x"},"classes":[]}],"jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/posts\/3671","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/comments?post=3671"}],"version-history":[{"count":3,"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/posts\/3671\/revisions"}],"predecessor-version":[{"id":3675,"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/posts\/3671\/revisions\/3675"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/media\/3673"}],"wp:attachment":[{"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/media?parent=3671"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/categories?post=3671"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/tags?post=3671"},{"taxonomy":"series","embeddable":true,"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/series?post=3671"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}