{
  "name": "Java Engineering Notes API",
  "description": "Structured API index for LLMs, automated agents, and developers.",
  "total_chapters": 138,
  "specification": "https://llmstxt.org/",
  "endpoints": {
    "all_chapters": "https://jvdocs.pages.dev/api/chapters.json",
    "navigation_graph": "https://jvdocs.pages.dev/api/navigation.json",
    "llms_index": "https://jvdocs.pages.dev/llms.txt",
    "llms_full": "https://jvdocs.pages.dev/llms-full.txt"
  },
  "chapters": [
    {
      "course": "Core Java",
      "course_id": "java",
      "num": "01",
      "title": "Java Roadmap: Basics to Advanced",
      "slug": "java/course-roadmap",
      "url": "https://jvdocs.pages.dev/java/course-roadmap",
      "prev": null,
      "prev_slug": null,
      "next": "https://jvdocs.pages.dev/java/oop-four-pillars",
      "next_slug": "java/oop-four-pillars"
    },
    {
      "course": "Core Java",
      "course_id": "java",
      "num": "02",
      "title": "Object-Oriented Programming: The Four Pillars",
      "slug": "java/oop-four-pillars",
      "url": "https://jvdocs.pages.dev/java/oop-four-pillars",
      "prev": "https://jvdocs.pages.dev/java/course-roadmap",
      "prev_slug": "java/course-roadmap",
      "next": "https://jvdocs.pages.dev/java/how-java-works-jvm-jre-jdk",
      "next_slug": "java/how-java-works-jvm-jre-jdk"
    },
    {
      "course": "Core Java",
      "course_id": "java",
      "num": "03",
      "title": "How Java Actually Runs",
      "slug": "java/how-java-works-jvm-jre-jdk",
      "url": "https://jvdocs.pages.dev/java/how-java-works-jvm-jre-jdk",
      "prev": "https://jvdocs.pages.dev/java/oop-four-pillars",
      "prev_slug": "java/oop-four-pillars",
      "next": "https://jvdocs.pages.dev/java/why-only-one-public-class-per-file",
      "next_slug": "java/why-only-one-public-class-per-file"
    },
    {
      "course": "Core Java",
      "course_id": "java",
      "num": "04",
      "title": "Why Only One Public Class Per File",
      "slug": "java/why-only-one-public-class-per-file",
      "url": "https://jvdocs.pages.dev/java/why-only-one-public-class-per-file",
      "prev": "https://jvdocs.pages.dev/java/how-java-works-jvm-jre-jdk",
      "prev_slug": "java/how-java-works-jvm-jre-jdk",
      "next": "https://jvdocs.pages.dev/java/variables-primitives-casting",
      "next_slug": "java/variables-primitives-casting"
    },
    {
      "course": "Core Java",
      "course_id": "java",
      "num": "05",
      "title": "Primitives, Two's Complement and Type Casting",
      "slug": "java/variables-primitives-casting",
      "url": "https://jvdocs.pages.dev/java/variables-primitives-casting",
      "prev": "https://jvdocs.pages.dev/java/why-only-one-public-class-per-file",
      "prev_slug": "java/why-only-one-public-class-per-file",
      "next": "https://jvdocs.pages.dev/java/ieee-754-float-double-storage",
      "next_slug": "java/ieee-754-float-double-storage"
    },
    {
      "course": "Core Java",
      "course_id": "java",
      "num": "06",
      "title": "IEEE 754: Why 0.1 + 0.2 Is Not 0.3 in Java",
      "slug": "java/ieee-754-float-double-storage",
      "url": "https://jvdocs.pages.dev/java/ieee-754-float-double-storage",
      "prev": "https://jvdocs.pages.dev/java/variables-primitives-casting",
      "prev_slug": "java/variables-primitives-casting",
      "next": "https://jvdocs.pages.dev/java/variables-reference-types-wrappers",
      "next_slug": "java/variables-reference-types-wrappers"
    },
    {
      "course": "Core Java",
      "course_id": "java",
      "num": "07",
      "title": "Reference Types, String Pool and Wrappers",
      "slug": "java/variables-reference-types-wrappers",
      "url": "https://jvdocs.pages.dev/java/variables-reference-types-wrappers",
      "prev": "https://jvdocs.pages.dev/java/ieee-754-float-double-storage",
      "prev_slug": "java/ieee-754-float-double-storage",
      "next": "https://jvdocs.pages.dev/java/methods-access-modifiers-varargs",
      "next_slug": "java/methods-access-modifiers-varargs"
    },
    {
      "course": "Core Java",
      "course_id": "java",
      "num": "08",
      "title": "Methods, Access Modifiers and Varargs",
      "slug": "java/methods-access-modifiers-varargs",
      "url": "https://jvdocs.pages.dev/java/methods-access-modifiers-varargs",
      "prev": "https://jvdocs.pages.dev/java/variables-reference-types-wrappers",
      "prev_slug": "java/variables-reference-types-wrappers",
      "next": "https://jvdocs.pages.dev/java/constructors-in-depth",
      "next_slug": "java/constructors-in-depth"
    },
    {
      "course": "Core Java",
      "course_id": "java",
      "num": "09",
      "title": "Constructors In Depth",
      "slug": "java/constructors-in-depth",
      "url": "https://jvdocs.pages.dev/java/constructors-in-depth",
      "prev": "https://jvdocs.pages.dev/java/methods-access-modifiers-varargs",
      "prev_slug": "java/methods-access-modifiers-varargs",
      "next": "https://jvdocs.pages.dev/java/memory-management-garbage-collection",
      "next_slug": "java/memory-management-garbage-collection"
    },
    {
      "course": "Core Java",
      "course_id": "java",
      "num": "10",
      "title": "Memory Management and Garbage Collection",
      "slug": "java/memory-management-garbage-collection",
      "url": "https://jvdocs.pages.dev/java/memory-management-garbage-collection",
      "prev": "https://jvdocs.pages.dev/java/constructors-in-depth",
      "prev_slug": "java/constructors-in-depth",
      "next": "https://jvdocs.pages.dev/java/concrete-abstract-object-nested-classes",
      "next_slug": "java/concrete-abstract-object-nested-classes"
    },
    {
      "course": "Core Java",
      "course_id": "java",
      "num": "11",
      "title": "Concrete, Abstract, Object, and Nested Classes: The Complete Guide",
      "slug": "java/concrete-abstract-object-nested-classes",
      "url": "https://jvdocs.pages.dev/java/concrete-abstract-object-nested-classes",
      "prev": "https://jvdocs.pages.dev/java/memory-management-garbage-collection",
      "prev_slug": "java/memory-management-garbage-collection",
      "next": "https://jvdocs.pages.dev/java/generics-type-erasure-wildcards",
      "next_slug": "java/generics-type-erasure-wildcards"
    },
    {
      "course": "Core Java",
      "course_id": "java",
      "num": "12",
      "title": "Generics, Type Erasure and Wildcards",
      "slug": "java/generics-type-erasure-wildcards",
      "url": "https://jvdocs.pages.dev/java/generics-type-erasure-wildcards",
      "prev": "https://jvdocs.pages.dev/java/concrete-abstract-object-nested-classes",
      "prev_slug": "java/concrete-abstract-object-nested-classes",
      "next": "https://jvdocs.pages.dev/java/pojo-enum-final-classes",
      "next_slug": "java/pojo-enum-final-classes"
    },
    {
      "course": "Core Java",
      "course_id": "java",
      "num": "13",
      "title": "POJO, Enum, and Final Classes: Advanced Architecture & JVM Mechanics",
      "slug": "java/pojo-enum-final-classes",
      "url": "https://jvdocs.pages.dev/java/pojo-enum-final-classes",
      "prev": "https://jvdocs.pages.dev/java/generics-type-erasure-wildcards",
      "prev_slug": "java/generics-type-erasure-wildcards",
      "next": "https://jvdocs.pages.dev/java/singleton-and-immutable-classes",
      "next_slug": "java/singleton-and-immutable-classes"
    },
    {
      "course": "Core Java",
      "course_id": "java",
      "num": "14",
      "title": "Singleton and Immutable Classes: Design Patterns & JVM Concurrency",
      "slug": "java/singleton-and-immutable-classes",
      "url": "https://jvdocs.pages.dev/java/singleton-and-immutable-classes",
      "prev": "https://jvdocs.pages.dev/java/pojo-enum-final-classes",
      "prev_slug": "java/pojo-enum-final-classes",
      "next": "https://jvdocs.pages.dev/java/interfaces-in-depth",
      "next_slug": "java/interfaces-in-depth"
    },
    {
      "course": "Core Java",
      "course_id": "java",
      "num": "15",
      "title": "Interfaces In Depth",
      "slug": "java/interfaces-in-depth",
      "url": "https://jvdocs.pages.dev/java/interfaces-in-depth",
      "prev": "https://jvdocs.pages.dev/java/singleton-and-immutable-classes",
      "prev_slug": "java/singleton-and-immutable-classes",
      "next": "https://jvdocs.pages.dev/java/default-static-private-interface-methods",
      "next_slug": "java/default-static-private-interface-methods"
    },
    {
      "course": "Core Java",
      "course_id": "java",
      "num": "16",
      "title": "Default, Static and Private Interface Methods",
      "slug": "java/default-static-private-interface-methods",
      "url": "https://jvdocs.pages.dev/java/default-static-private-interface-methods",
      "prev": "https://jvdocs.pages.dev/java/interfaces-in-depth",
      "prev_slug": "java/interfaces-in-depth",
      "next": "https://jvdocs.pages.dev/java/functional-interfaces-lambda-expressions",
      "next_slug": "java/functional-interfaces-lambda-expressions"
    },
    {
      "course": "Core Java",
      "course_id": "java",
      "num": "17",
      "title": "Functional Interfaces and Lambda Expressions",
      "slug": "java/functional-interfaces-lambda-expressions",
      "url": "https://jvdocs.pages.dev/java/functional-interfaces-lambda-expressions",
      "prev": "https://jvdocs.pages.dev/java/default-static-private-interface-methods",
      "prev_slug": "java/default-static-private-interface-methods",
      "next": "https://jvdocs.pages.dev/java/reflection-in-depth",
      "next_slug": "java/reflection-in-depth"
    },
    {
      "course": "Core Java",
      "course_id": "java",
      "num": "18",
      "title": "Reflection In Depth",
      "slug": "java/reflection-in-depth",
      "url": "https://jvdocs.pages.dev/java/reflection-in-depth",
      "prev": "https://jvdocs.pages.dev/java/functional-interfaces-lambda-expressions",
      "prev_slug": "java/functional-interfaces-lambda-expressions",
      "next": "https://jvdocs.pages.dev/java/annotations",
      "next_slug": "java/annotations"
    },
    {
      "course": "Core Java",
      "course_id": "java",
      "num": "19",
      "title": "Annotations",
      "slug": "java/annotations",
      "url": "https://jvdocs.pages.dev/java/annotations",
      "prev": "https://jvdocs.pages.dev/java/reflection-in-depth",
      "prev_slug": "java/reflection-in-depth",
      "next": "https://jvdocs.pages.dev/java/exception-handling",
      "next_slug": "java/exception-handling"
    },
    {
      "course": "Core Java",
      "course_id": "java",
      "num": "20",
      "title": "Exception Handling",
      "slug": "java/exception-handling",
      "url": "https://jvdocs.pages.dev/java/exception-handling",
      "prev": "https://jvdocs.pages.dev/java/annotations",
      "prev_slug": "java/annotations",
      "next": "https://jvdocs.pages.dev/java/operators",
      "next_slug": "java/operators"
    },
    {
      "course": "Core Java",
      "course_id": "java",
      "num": "21",
      "title": "Operators",
      "slug": "java/operators",
      "url": "https://jvdocs.pages.dev/java/operators",
      "prev": "https://jvdocs.pages.dev/java/exception-handling",
      "prev_slug": "java/exception-handling",
      "next": "https://jvdocs.pages.dev/java/control-flow-statements",
      "next_slug": "java/control-flow-statements"
    },
    {
      "course": "Core Java",
      "course_id": "java",
      "num": "22",
      "title": "Control Flow Statements",
      "slug": "java/control-flow-statements",
      "url": "https://jvdocs.pages.dev/java/control-flow-statements",
      "prev": "https://jvdocs.pages.dev/java/operators",
      "prev_slug": "java/operators",
      "next": "https://jvdocs.pages.dev/java/collections-framework-hierarchy-iteration",
      "next_slug": "java/collections-framework-hierarchy-iteration"
    },
    {
      "course": "Core Java",
      "course_id": "java",
      "num": "23",
      "title": "Collections Framework: Architecture, Hierarchy & Iteration",
      "slug": "java/collections-framework-hierarchy-iteration",
      "url": "https://jvdocs.pages.dev/java/collections-framework-hierarchy-iteration",
      "prev": "https://jvdocs.pages.dev/java/control-flow-statements",
      "prev_slug": "java/control-flow-statements",
      "next": "https://jvdocs.pages.dev/java/queue-priorityqueue-comparator-comparable",
      "next_slug": "java/queue-priorityqueue-comparator-comparable"
    },
    {
      "course": "Core Java",
      "course_id": "java",
      "num": "24",
      "title": "Queue, PriorityQueue, Comparator vs Comparable",
      "slug": "java/queue-priorityqueue-comparator-comparable",
      "url": "https://jvdocs.pages.dev/java/queue-priorityqueue-comparator-comparable",
      "prev": "https://jvdocs.pages.dev/java/collections-framework-hierarchy-iteration",
      "prev_slug": "java/collections-framework-hierarchy-iteration",
      "next": "https://jvdocs.pages.dev/java/deque-and-the-list-family",
      "next_slug": "java/deque-and-the-list-family"
    },
    {
      "course": "Core Java",
      "course_id": "java",
      "num": "25",
      "title": "Deque and the List Family",
      "slug": "java/deque-and-the-list-family",
      "url": "https://jvdocs.pages.dev/java/deque-and-the-list-family",
      "prev": "https://jvdocs.pages.dev/java/queue-priorityqueue-comparator-comparable",
      "prev_slug": "java/queue-priorityqueue-comparator-comparable",
      "next": "https://jvdocs.pages.dev/java/hashmap-internal-working",
      "next_slug": "java/hashmap-internal-working"
    },
    {
      "course": "Core Java",
      "course_id": "java",
      "num": "26",
      "title": "HashMap Internal Working: The Complete Low-Level Guide",
      "slug": "java/hashmap-internal-working",
      "url": "https://jvdocs.pages.dev/java/hashmap-internal-working",
      "prev": "https://jvdocs.pages.dev/java/deque-and-the-list-family",
      "prev_slug": "java/deque-and-the-list-family",
      "next": "https://jvdocs.pages.dev/java/linkedhashmap-and-treemap",
      "next_slug": "java/linkedhashmap-and-treemap"
    },
    {
      "course": "Core Java",
      "course_id": "java",
      "num": "27",
      "title": "LinkedHashMap and TreeMap: When Order Matters",
      "slug": "java/linkedhashmap-and-treemap",
      "url": "https://jvdocs.pages.dev/java/linkedhashmap-and-treemap",
      "prev": "https://jvdocs.pages.dev/java/hashmap-internal-working",
      "prev_slug": "java/hashmap-internal-working",
      "next": "https://jvdocs.pages.dev/java/the-set-family",
      "next_slug": "java/the-set-family"
    },
    {
      "course": "Core Java",
      "course_id": "java",
      "num": "28",
      "title": "The Set Family: HashSet, LinkedHashSet & TreeSet",
      "slug": "java/the-set-family",
      "url": "https://jvdocs.pages.dev/java/the-set-family",
      "prev": "https://jvdocs.pages.dev/java/linkedhashmap-and-treemap",
      "prev_slug": "java/linkedhashmap-and-treemap",
      "next": "https://jvdocs.pages.dev/java/java-8-streams",
      "next_slug": "java/java-8-streams"
    },
    {
      "course": "Core Java",
      "course_id": "java",
      "num": "29",
      "title": "Java 8 Streams: Pipelines, Laziness & Parallelism",
      "slug": "java/java-8-streams",
      "url": "https://jvdocs.pages.dev/java/java-8-streams",
      "prev": "https://jvdocs.pages.dev/java/the-set-family",
      "prev_slug": "java/the-set-family",
      "next": "https://jvdocs.pages.dev/java/threads-processes-memory-model",
      "next_slug": "java/threads-processes-memory-model"
    },
    {
      "course": "Core Java",
      "course_id": "java",
      "num": "30",
      "title": "Threads, Processes and Their Memory Model",
      "slug": "java/threads-processes-memory-model",
      "url": "https://jvdocs.pages.dev/java/threads-processes-memory-model",
      "prev": "https://jvdocs.pages.dev/java/java-8-streams",
      "prev_slug": "java/java-8-streams",
      "next": "https://jvdocs.pages.dev/java/thread-creation-lifecycle-wait-notify",
      "next_slug": "java/thread-creation-lifecycle-wait-notify"
    },
    {
      "course": "Core Java",
      "course_id": "java",
      "num": "31",
      "title": "Thread Creation, Lifecycle, Monitor Locks & wait/notify",
      "slug": "java/thread-creation-lifecycle-wait-notify",
      "url": "https://jvdocs.pages.dev/java/thread-creation-lifecycle-wait-notify",
      "prev": "https://jvdocs.pages.dev/java/threads-processes-memory-model",
      "prev_slug": "java/threads-processes-memory-model",
      "next": "https://jvdocs.pages.dev/java/join-daemon-threads-priority",
      "next_slug": "java/join-daemon-threads-priority"
    },
    {
      "course": "Core Java",
      "course_id": "java",
      "num": "32",
      "title": "Thread Coordination: join, Daemon Threads, Priority & Deprecated Methods",
      "slug": "java/join-daemon-threads-priority",
      "url": "https://jvdocs.pages.dev/java/join-daemon-threads-priority",
      "prev": "https://jvdocs.pages.dev/java/thread-creation-lifecycle-wait-notify",
      "prev_slug": "java/thread-creation-lifecycle-wait-notify",
      "next": "https://jvdocs.pages.dev/java/locks-and-condition",
      "next_slug": "java/locks-and-condition"
    },
    {
      "course": "Core Java",
      "course_id": "java",
      "num": "33",
      "title": "Explicit Locks: ReentrantLock, ReadWriteLock, StampedLock, Semaphore & Condition",
      "slug": "java/locks-and-condition",
      "url": "https://jvdocs.pages.dev/java/locks-and-condition",
      "prev": "https://jvdocs.pages.dev/java/join-daemon-threads-priority",
      "prev_slug": "java/join-daemon-threads-priority",
      "next": "https://jvdocs.pages.dev/java/lock-free-concurrency-cas-atomic-volatile",
      "next_slug": "java/lock-free-concurrency-cas-atomic-volatile"
    },
    {
      "course": "Core Java",
      "course_id": "java",
      "num": "34",
      "title": "Lock-Free Concurrency: CAS, Atomic Classes & volatile",
      "slug": "java/lock-free-concurrency-cas-atomic-volatile",
      "url": "https://jvdocs.pages.dev/java/lock-free-concurrency-cas-atomic-volatile",
      "prev": "https://jvdocs.pages.dev/java/locks-and-condition",
      "prev_slug": "java/locks-and-condition",
      "next": "https://jvdocs.pages.dev/java/threadpoolexecutor-in-depth",
      "next_slug": "java/threadpoolexecutor-in-depth"
    },
    {
      "course": "Core Java",
      "course_id": "java",
      "num": "35",
      "title": "ThreadPoolExecutor: Architecture, Task Flow & Sizing",
      "slug": "java/threadpoolexecutor-in-depth",
      "url": "https://jvdocs.pages.dev/java/threadpoolexecutor-in-depth",
      "prev": "https://jvdocs.pages.dev/java/lock-free-concurrency-cas-atomic-volatile",
      "prev_slug": "java/lock-free-concurrency-cas-atomic-volatile",
      "next": "https://jvdocs.pages.dev/java/future-callable-completablefuture",
      "next_slug": "java/future-callable-completablefuture"
    },
    {
      "course": "Core Java",
      "course_id": "java",
      "num": "36",
      "title": "Asynchronous Programming: Future, Callable & CompletableFuture",
      "slug": "java/future-callable-completablefuture",
      "url": "https://jvdocs.pages.dev/java/future-callable-completablefuture",
      "prev": "https://jvdocs.pages.dev/java/threadpoolexecutor-in-depth",
      "prev_slug": "java/threadpoolexecutor-in-depth",
      "next": "https://jvdocs.pages.dev/java/executors-factory-pools-forkjoinpool",
      "next_slug": "java/executors-factory-pools-forkjoinpool"
    },
    {
      "course": "Core Java",
      "course_id": "java",
      "num": "37",
      "title": "Executors Factory Pools, ForkJoinPool & Work Stealing",
      "slug": "java/executors-factory-pools-forkjoinpool",
      "url": "https://jvdocs.pages.dev/java/executors-factory-pools-forkjoinpool",
      "prev": "https://jvdocs.pages.dev/java/future-callable-completablefuture",
      "prev_slug": "java/future-callable-completablefuture",
      "next": "https://jvdocs.pages.dev/java/scheduledthreadpoolexecutor",
      "next_slug": "java/scheduledthreadpoolexecutor"
    },
    {
      "course": "Core Java",
      "course_id": "java",
      "num": "38",
      "title": "ScheduledThreadPoolExecutor: Periodic Tasks & Time Triggers",
      "slug": "java/scheduledthreadpoolexecutor",
      "url": "https://jvdocs.pages.dev/java/scheduledthreadpoolexecutor",
      "prev": "https://jvdocs.pages.dev/java/executors-factory-pools-forkjoinpool",
      "prev_slug": "java/executors-factory-pools-forkjoinpool",
      "next": "https://jvdocs.pages.dev/java/threadlocal-and-virtual-threads",
      "next_slug": "java/threadlocal-and-virtual-threads"
    },
    {
      "course": "Core Java",
      "course_id": "java",
      "num": "39",
      "title": "ThreadLocal and Virtual Threads (Project Loom)",
      "slug": "java/threadlocal-and-virtual-threads",
      "url": "https://jvdocs.pages.dev/java/threadlocal-and-virtual-threads",
      "prev": "https://jvdocs.pages.dev/java/scheduledthreadpoolexecutor",
      "prev_slug": "java/scheduledthreadpoolexecutor",
      "next": "https://jvdocs.pages.dev/java/project-lombok-top-10-features",
      "next_slug": "java/project-lombok-top-10-features"
    },
    {
      "course": "Core Java",
      "course_id": "java",
      "num": "40",
      "title": "Project Lombok: Top 10 Features & Compile-Time Code Generation",
      "slug": "java/project-lombok-top-10-features",
      "url": "https://jvdocs.pages.dev/java/project-lombok-top-10-features",
      "prev": "https://jvdocs.pages.dev/java/threadlocal-and-virtual-threads",
      "prev_slug": "java/threadlocal-and-virtual-threads",
      "next": "https://jvdocs.pages.dev/java/optional-java-8-to-11-all-methods",
      "next_slug": "java/optional-java-8-to-11-all-methods"
    },
    {
      "course": "Core Java",
      "course_id": "java",
      "num": "41",
      "title": "Optional: Java 8 to 11 All Methods, Patterns & Antipatterns",
      "slug": "java/optional-java-8-to-11-all-methods",
      "url": "https://jvdocs.pages.dev/java/optional-java-8-to-11-all-methods",
      "prev": "https://jvdocs.pages.dev/java/project-lombok-top-10-features",
      "prev_slug": "java/project-lombok-top-10-features",
      "next": "https://jvdocs.pages.dev/java/traditional-file-handling-decorator-pattern",
      "next_slug": "java/traditional-file-handling-decorator-pattern"
    },
    {
      "course": "Core Java",
      "course_id": "java",
      "num": "42",
      "title": "Traditional File Handling: Streams as a Decorator Pattern",
      "slug": "java/traditional-file-handling-decorator-pattern",
      "url": "https://jvdocs.pages.dev/java/traditional-file-handling-decorator-pattern",
      "prev": "https://jvdocs.pages.dev/java/optional-java-8-to-11-all-methods",
      "prev_slug": "java/optional-java-8-to-11-all-methods",
      "next": "https://jvdocs.pages.dev/java/java-nio-deep-dive-5-advantages",
      "next_slug": "java/java-nio-deep-dive-5-advantages"
    },
    {
      "course": "Core Java",
      "course_id": "java",
      "num": "43",
      "title": "Java NIO Deep Dive: 5 Advantages Over Traditional I/O",
      "slug": "java/java-nio-deep-dive-5-advantages",
      "url": "https://jvdocs.pages.dev/java/java-nio-deep-dive-5-advantages",
      "prev": "https://jvdocs.pages.dev/java/traditional-file-handling-decorator-pattern",
      "prev_slug": "java/traditional-file-handling-decorator-pattern",
      "next": "https://jvdocs.pages.dev/java/java-nio-buffer-internals",
      "next_slug": "java/java-nio-buffer-internals"
    },
    {
      "course": "Core Java",
      "course_id": "java",
      "num": "44",
      "title": "Java NIO Buffer Internals: position, limit, capacity & compact",
      "slug": "java/java-nio-buffer-internals",
      "url": "https://jvdocs.pages.dev/java/java-nio-buffer-internals",
      "prev": "https://jvdocs.pages.dev/java/java-nio-deep-dive-5-advantages",
      "prev_slug": "java/java-nio-deep-dive-5-advantages",
      "next": "https://jvdocs.pages.dev/java/java-nio-filechannel-zero-copy",
      "next_slug": "java/java-nio-filechannel-zero-copy"
    },
    {
      "course": "Core Java",
      "course_id": "java",
      "num": "45",
      "title": "FileChannel & Zero-Copy Transfers",
      "slug": "java/java-nio-filechannel-zero-copy",
      "url": "https://jvdocs.pages.dev/java/java-nio-filechannel-zero-copy",
      "prev": "https://jvdocs.pages.dev/java/java-nio-buffer-internals",
      "prev_slug": "java/java-nio-buffer-internals",
      "next": "https://jvdocs.pages.dev/java/java-14-switch-expressions",
      "next_slug": "java/java-14-switch-expressions"
    },
    {
      "course": "Core Java",
      "course_id": "java",
      "num": "46",
      "title": "Java 14: Switch Expressions & Arrow Syntax",
      "slug": "java/java-14-switch-expressions",
      "url": "https://jvdocs.pages.dev/java/java-14-switch-expressions",
      "prev": "https://jvdocs.pages.dev/java/java-nio-filechannel-zero-copy",
      "prev_slug": "java/java-nio-filechannel-zero-copy",
      "next": "https://jvdocs.pages.dev/java/java-15-text-blocks",
      "next_slug": "java/java-15-text-blocks"
    },
    {
      "course": "Core Java",
      "course_id": "java",
      "num": "47",
      "title": "Java 15: Text Blocks & Multi-Line Strings",
      "slug": "java/java-15-text-blocks",
      "url": "https://jvdocs.pages.dev/java/java-15-text-blocks",
      "prev": "https://jvdocs.pages.dev/java/java-14-switch-expressions",
      "prev_slug": "java/java-14-switch-expressions",
      "next": "https://jvdocs.pages.dev/java/java-16-pattern-matching-for-instanceof",
      "next_slug": "java/java-16-pattern-matching-for-instanceof"
    },
    {
      "course": "Core Java",
      "course_id": "java",
      "num": "48",
      "title": "Java 16: Pattern Matching for instanceof",
      "slug": "java/java-16-pattern-matching-for-instanceof",
      "url": "https://jvdocs.pages.dev/java/java-16-pattern-matching-for-instanceof",
      "prev": "https://jvdocs.pages.dev/java/java-15-text-blocks",
      "prev_slug": "java/java-15-text-blocks",
      "next": "https://jvdocs.pages.dev/java/java-16-records",
      "next_slug": "java/java-16-records"
    },
    {
      "course": "Core Java",
      "course_id": "java",
      "num": "49",
      "title": "Java 16: Records (Immutable Data Carriers)",
      "slug": "java/java-16-records",
      "url": "https://jvdocs.pages.dev/java/java-16-records",
      "prev": "https://jvdocs.pages.dev/java/java-16-pattern-matching-for-instanceof",
      "prev_slug": "java/java-16-pattern-matching-for-instanceof",
      "next": "https://jvdocs.pages.dev/java/java-17-sealed-classes-and-interfaces",
      "next_slug": "java/java-17-sealed-classes-and-interfaces"
    },
    {
      "course": "Core Java",
      "course_id": "java",
      "num": "50",
      "title": "Java 17: Sealed Classes and Interfaces",
      "slug": "java/java-17-sealed-classes-and-interfaces",
      "url": "https://jvdocs.pages.dev/java/java-17-sealed-classes-and-interfaces",
      "prev": "https://jvdocs.pages.dev/java/java-16-records",
      "prev_slug": "java/java-16-records",
      "next": "https://jvdocs.pages.dev/java/java-21-pattern-matching-for-switch",
      "next_slug": "java/java-21-pattern-matching-for-switch"
    },
    {
      "course": "Core Java",
      "course_id": "java",
      "num": "51",
      "title": "Java 21: Pattern Matching for switch",
      "slug": "java/java-21-pattern-matching-for-switch",
      "url": "https://jvdocs.pages.dev/java/java-21-pattern-matching-for-switch",
      "prev": "https://jvdocs.pages.dev/java/java-17-sealed-classes-and-interfaces",
      "prev_slug": "java/java-17-sealed-classes-and-interfaces",
      "next": "https://jvdocs.pages.dev/java/java-21-sequenced-collections",
      "next_slug": "java/java-21-sequenced-collections"
    },
    {
      "course": "Core Java",
      "course_id": "java",
      "num": "52",
      "title": "Java 21: Sequenced Collections (Unified First/Last Access)",
      "slug": "java/java-21-sequenced-collections",
      "url": "https://jvdocs.pages.dev/java/java-21-sequenced-collections",
      "prev": "https://jvdocs.pages.dev/java/java-21-pattern-matching-for-switch",
      "prev_slug": "java/java-21-pattern-matching-for-switch",
      "next": null,
      "next_slug": null
    },
    {
      "course": "Spring Boot",
      "course_id": "spring-boot",
      "num": "01",
      "title": "Spring Boot Roadmap: Basics to Advanced",
      "slug": "spring-boot/roadmap",
      "url": "https://jvdocs.pages.dev/spring-boot/roadmap",
      "prev": null,
      "prev_slug": null,
      "next": "https://jvdocs.pages.dev/spring-boot/intro-spring-boot",
      "next_slug": "spring-boot/intro-spring-boot"
    },
    {
      "course": "Spring Boot",
      "course_id": "spring-boot",
      "num": "02",
      "title": "Why Spring Boot: From Servlets to Spring MVC to Spring Boot",
      "slug": "spring-boot/intro-spring-boot",
      "url": "https://jvdocs.pages.dev/spring-boot/intro-spring-boot",
      "prev": "https://jvdocs.pages.dev/spring-boot/roadmap",
      "prev_slug": "spring-boot/roadmap",
      "next": "https://jvdocs.pages.dev/spring-boot/project-setup",
      "next_slug": "spring-boot/project-setup"
    },
    {
      "course": "Spring Boot",
      "course_id": "spring-boot",
      "num": "03",
      "title": "Project Setup and Layered Architecture",
      "slug": "spring-boot/project-setup",
      "url": "https://jvdocs.pages.dev/spring-boot/project-setup",
      "prev": "https://jvdocs.pages.dev/spring-boot/intro-spring-boot",
      "prev_slug": "spring-boot/intro-spring-boot",
      "next": "https://jvdocs.pages.dev/spring-boot/maven-lifecycle",
      "next_slug": "spring-boot/maven-lifecycle"
    },
    {
      "course": "Spring Boot",
      "course_id": "spring-boot",
      "num": "04",
      "title": "Maven and Its Build Lifecycle",
      "slug": "spring-boot/maven-lifecycle",
      "url": "https://jvdocs.pages.dev/spring-boot/maven-lifecycle",
      "prev": "https://jvdocs.pages.dev/spring-boot/project-setup",
      "prev_slug": "spring-boot/project-setup",
      "next": "https://jvdocs.pages.dev/spring-boot/controller-annotations",
      "next_slug": "spring-boot/controller-annotations"
    },
    {
      "course": "Spring Boot",
      "course_id": "spring-boot",
      "num": "05",
      "title": "Controller Annotations: @RestController, @RequestMapping and Request Data",
      "slug": "spring-boot/controller-annotations",
      "url": "https://jvdocs.pages.dev/spring-boot/controller-annotations",
      "prev": "https://jvdocs.pages.dev/spring-boot/maven-lifecycle",
      "prev_slug": "spring-boot/maven-lifecycle",
      "next": "https://jvdocs.pages.dev/spring-boot/bean-lifecycle",
      "next_slug": "spring-boot/bean-lifecycle"
    },
    {
      "course": "Spring Boot",
      "course_id": "spring-boot",
      "num": "06",
      "title": "Beans, the IoC Container and the Bean Lifecycle",
      "slug": "spring-boot/bean-lifecycle",
      "url": "https://jvdocs.pages.dev/spring-boot/bean-lifecycle",
      "prev": "https://jvdocs.pages.dev/spring-boot/controller-annotations",
      "prev_slug": "spring-boot/controller-annotations",
      "next": "https://jvdocs.pages.dev/spring-boot/dependency-injection",
      "next_slug": "spring-boot/dependency-injection"
    },
    {
      "course": "Spring Boot",
      "course_id": "spring-boot",
      "num": "07",
      "title": "Dependency Injection: Field, Setter and Constructor",
      "slug": "spring-boot/dependency-injection",
      "url": "https://jvdocs.pages.dev/spring-boot/dependency-injection",
      "prev": "https://jvdocs.pages.dev/spring-boot/bean-lifecycle",
      "prev_slug": "spring-boot/bean-lifecycle",
      "next": "https://jvdocs.pages.dev/spring-boot/bean-scopes",
      "next_slug": "spring-boot/bean-scopes"
    },
    {
      "course": "Spring Boot",
      "course_id": "spring-boot",
      "num": "08",
      "title": "Bean Scopes: Singleton, Prototype, Request and Session",
      "slug": "spring-boot/bean-scopes",
      "url": "https://jvdocs.pages.dev/spring-boot/bean-scopes",
      "prev": "https://jvdocs.pages.dev/spring-boot/dependency-injection",
      "prev_slug": "spring-boot/dependency-injection",
      "next": "https://jvdocs.pages.dev/spring-boot/value-annotation",
      "next_slug": "spring-boot/value-annotation"
    },
    {
      "course": "Spring Boot",
      "course_id": "spring-boot",
      "num": "09",
      "title": "Choosing Beans at Runtime with @Value",
      "slug": "spring-boot/value-annotation",
      "url": "https://jvdocs.pages.dev/spring-boot/value-annotation",
      "prev": "https://jvdocs.pages.dev/spring-boot/bean-scopes",
      "prev_slug": "spring-boot/bean-scopes",
      "next": "https://jvdocs.pages.dev/spring-boot/conditional-on-property",
      "next_slug": "spring-boot/conditional-on-property"
    },
    {
      "course": "Spring Boot",
      "course_id": "spring-boot",
      "num": "10",
      "title": "Conditional Beans with @ConditionalOnProperty",
      "slug": "spring-boot/conditional-on-property",
      "url": "https://jvdocs.pages.dev/spring-boot/conditional-on-property",
      "prev": "https://jvdocs.pages.dev/spring-boot/value-annotation",
      "prev_slug": "spring-boot/value-annotation",
      "next": "https://jvdocs.pages.dev/spring-boot/profile-annotation",
      "next_slug": "spring-boot/profile-annotation"
    },
    {
      "course": "Spring Boot",
      "course_id": "spring-boot",
      "num": "11",
      "title": "Profiles: One Codebase, Many Environments",
      "slug": "spring-boot/profile-annotation",
      "url": "https://jvdocs.pages.dev/spring-boot/profile-annotation",
      "prev": "https://jvdocs.pages.dev/spring-boot/conditional-on-property",
      "prev_slug": "spring-boot/conditional-on-property",
      "next": "https://jvdocs.pages.dev/spring-boot/aop",
      "next_slug": "spring-boot/aop"
    },
    {
      "course": "Spring Boot",
      "course_id": "spring-boot",
      "num": "12",
      "title": "Aspect-Oriented Programming (AOP)",
      "slug": "spring-boot/aop",
      "url": "https://jvdocs.pages.dev/spring-boot/aop",
      "prev": "https://jvdocs.pages.dev/spring-boot/profile-annotation",
      "prev_slug": "spring-boot/profile-annotation",
      "next": "https://jvdocs.pages.dev/spring-boot/transactional-part1",
      "next_slug": "spring-boot/transactional-part1"
    },
    {
      "course": "Spring Boot",
      "course_id": "spring-boot",
      "num": "13",
      "title": "@Transactional Part 1: ACID and How It Works",
      "slug": "spring-boot/transactional-part1",
      "url": "https://jvdocs.pages.dev/spring-boot/transactional-part1",
      "prev": "https://jvdocs.pages.dev/spring-boot/aop",
      "prev_slug": "spring-boot/aop",
      "next": "https://jvdocs.pages.dev/spring-boot/transactional-part2",
      "next_slug": "spring-boot/transactional-part2"
    },
    {
      "course": "Spring Boot",
      "course_id": "spring-boot",
      "num": "14",
      "title": "@Transactional Part 2: Transaction Managers and Propagation",
      "slug": "spring-boot/transactional-part2",
      "url": "https://jvdocs.pages.dev/spring-boot/transactional-part2",
      "prev": "https://jvdocs.pages.dev/spring-boot/transactional-part1",
      "prev_slug": "spring-boot/transactional-part1",
      "next": "https://jvdocs.pages.dev/spring-boot/transactional-part3",
      "next_slug": "spring-boot/transactional-part3"
    },
    {
      "course": "Spring Boot",
      "course_id": "spring-boot",
      "num": "15",
      "title": "@Transactional Part 3: Isolation Levels",
      "slug": "spring-boot/transactional-part3",
      "url": "https://jvdocs.pages.dev/spring-boot/transactional-part3",
      "prev": "https://jvdocs.pages.dev/spring-boot/transactional-part2",
      "prev_slug": "spring-boot/transactional-part2",
      "next": "https://jvdocs.pages.dev/spring-boot/async-part1",
      "next_slug": "spring-boot/async-part1"
    },
    {
      "course": "Spring Boot",
      "course_id": "spring-boot",
      "num": "16",
      "title": "@Async Part 1: Thread Pools and @Async",
      "slug": "spring-boot/async-part1",
      "url": "https://jvdocs.pages.dev/spring-boot/async-part1",
      "prev": "https://jvdocs.pages.dev/spring-boot/transactional-part3",
      "prev_slug": "spring-boot/transactional-part3",
      "next": "https://jvdocs.pages.dev/spring-boot/async-part2",
      "next_slug": "spring-boot/async-part2"
    },
    {
      "course": "Spring Boot",
      "course_id": "spring-boot",
      "num": "17",
      "title": "@Async Part 2: Pitfalls, Return Types and Exceptions",
      "slug": "spring-boot/async-part2",
      "url": "https://jvdocs.pages.dev/spring-boot/async-part2",
      "prev": "https://jvdocs.pages.dev/spring-boot/async-part1",
      "prev_slug": "spring-boot/async-part1",
      "next": "https://jvdocs.pages.dev/spring-boot/custom-interceptors",
      "next_slug": "spring-boot/custom-interceptors"
    },
    {
      "course": "Spring Boot",
      "course_id": "spring-boot",
      "num": "18",
      "title": "Custom Interceptors and Custom Annotations",
      "slug": "spring-boot/custom-interceptors",
      "url": "https://jvdocs.pages.dev/spring-boot/custom-interceptors",
      "prev": "https://jvdocs.pages.dev/spring-boot/async-part2",
      "prev_slug": "spring-boot/async-part2",
      "next": "https://jvdocs.pages.dev/spring-boot/filters-interceptors",
      "next_slug": "spring-boot/filters-interceptors"
    },
    {
      "course": "Spring Boot",
      "course_id": "spring-boot",
      "num": "19",
      "title": "Filters vs Interceptors",
      "slug": "spring-boot/filters-interceptors",
      "url": "https://jvdocs.pages.dev/spring-boot/filters-interceptors",
      "prev": "https://jvdocs.pages.dev/spring-boot/custom-interceptors",
      "prev_slug": "spring-boot/custom-interceptors",
      "next": "https://jvdocs.pages.dev/spring-boot/hateoas",
      "next_slug": "spring-boot/hateoas"
    },
    {
      "course": "Spring Boot",
      "course_id": "spring-boot",
      "num": "20",
      "title": "HATEOAS: Links in REST Responses",
      "slug": "spring-boot/hateoas",
      "url": "https://jvdocs.pages.dev/spring-boot/hateoas",
      "prev": "https://jvdocs.pages.dev/spring-boot/filters-interceptors",
      "prev_slug": "spring-boot/filters-interceptors",
      "next": "https://jvdocs.pages.dev/spring-boot/response-entity",
      "next_slug": "spring-boot/response-entity"
    },
    {
      "course": "Spring Boot",
      "course_id": "spring-boot",
      "num": "21",
      "title": "ResponseEntity and HTTP Status Codes",
      "slug": "spring-boot/response-entity",
      "url": "https://jvdocs.pages.dev/spring-boot/response-entity",
      "prev": "https://jvdocs.pages.dev/spring-boot/hateoas",
      "prev_slug": "spring-boot/hateoas",
      "next": "https://jvdocs.pages.dev/spring-boot/exception-handling",
      "next_slug": "spring-boot/exception-handling"
    },
    {
      "course": "Spring Boot",
      "course_id": "spring-boot",
      "num": "22",
      "title": "Exception Handling: @ExceptionHandler, @ControllerAdvice and @ResponseStatus",
      "slug": "spring-boot/exception-handling",
      "url": "https://jvdocs.pages.dev/spring-boot/exception-handling",
      "prev": "https://jvdocs.pages.dev/spring-boot/response-entity",
      "prev_slug": "spring-boot/response-entity",
      "next": "https://jvdocs.pages.dev/spring-boot/jpa-part1",
      "next_slug": "spring-boot/jpa-part1"
    },
    {
      "course": "Spring Boot",
      "course_id": "spring-boot",
      "num": "23",
      "title": "JPA Part 1: From JDBC to JdbcTemplate",
      "slug": "spring-boot/jpa-part1",
      "url": "https://jvdocs.pages.dev/spring-boot/jpa-part1",
      "prev": "https://jvdocs.pages.dev/spring-boot/exception-handling",
      "prev_slug": "spring-boot/exception-handling",
      "next": "https://jvdocs.pages.dev/spring-boot/jpa-part2",
      "next_slug": "spring-boot/jpa-part2"
    },
    {
      "course": "Spring Boot",
      "course_id": "spring-boot",
      "num": "24",
      "title": "JPA Part 2: Setup, Architecture and the Entity Lifecycle",
      "slug": "spring-boot/jpa-part2",
      "url": "https://jvdocs.pages.dev/spring-boot/jpa-part2",
      "prev": "https://jvdocs.pages.dev/spring-boot/jpa-part1",
      "prev_slug": "spring-boot/jpa-part1",
      "next": "https://jvdocs.pages.dev/spring-boot/jpa-part3",
      "next_slug": "spring-boot/jpa-part3"
    },
    {
      "course": "Spring Boot",
      "course_id": "spring-boot",
      "num": "25",
      "title": "JPA Part 3: The First-Level Cache",
      "slug": "spring-boot/jpa-part3",
      "url": "https://jvdocs.pages.dev/spring-boot/jpa-part3",
      "prev": "https://jvdocs.pages.dev/spring-boot/jpa-part2",
      "prev_slug": "spring-boot/jpa-part2",
      "next": "https://jvdocs.pages.dev/spring-boot/jpa-part4",
      "next_slug": "spring-boot/jpa-part4"
    },
    {
      "course": "Spring Boot",
      "course_id": "spring-boot",
      "num": "26",
      "title": "JPA Part 4: The Second-Level Cache",
      "slug": "spring-boot/jpa-part4",
      "url": "https://jvdocs.pages.dev/spring-boot/jpa-part4",
      "prev": "https://jvdocs.pages.dev/spring-boot/jpa-part3",
      "prev_slug": "spring-boot/jpa-part3",
      "next": "https://jvdocs.pages.dev/spring-boot/jpa-part5",
      "next_slug": "spring-boot/jpa-part5"
    },
    {
      "course": "Spring Boot",
      "course_id": "spring-boot",
      "num": "27",
      "title": "JPA Part 5: Mapping Entities to Tables",
      "slug": "spring-boot/jpa-part5",
      "url": "https://jvdocs.pages.dev/spring-boot/jpa-part5",
      "prev": "https://jvdocs.pages.dev/spring-boot/jpa-part4",
      "prev_slug": "spring-boot/jpa-part4",
      "next": "https://jvdocs.pages.dev/spring-boot/jpa-part6",
      "next_slug": "spring-boot/jpa-part6"
    },
    {
      "course": "Spring Boot",
      "course_id": "spring-boot",
      "num": "28",
      "title": "JPA Part 6: One-to-One Mappings",
      "slug": "spring-boot/jpa-part6",
      "url": "https://jvdocs.pages.dev/spring-boot/jpa-part6",
      "prev": "https://jvdocs.pages.dev/spring-boot/jpa-part5",
      "prev_slug": "spring-boot/jpa-part5",
      "next": "https://jvdocs.pages.dev/spring-boot/jpa-part7",
      "next_slug": "spring-boot/jpa-part7"
    },
    {
      "course": "Spring Boot",
      "course_id": "spring-boot",
      "num": "29",
      "title": "JPA Part 7: One-to-Many, Many-to-One and Many-to-Many",
      "slug": "spring-boot/jpa-part7",
      "url": "https://jvdocs.pages.dev/spring-boot/jpa-part7",
      "prev": "https://jvdocs.pages.dev/spring-boot/jpa-part6",
      "prev_slug": "spring-boot/jpa-part6",
      "next": "https://jvdocs.pages.dev/spring-boot/jpa-part8",
      "next_slug": "spring-boot/jpa-part8"
    },
    {
      "course": "Spring Boot",
      "course_id": "spring-boot",
      "num": "30",
      "title": "JPA Part 8: Derived Queries, JPQL, Pagination and the N+1 Problem",
      "slug": "spring-boot/jpa-part8",
      "url": "https://jvdocs.pages.dev/spring-boot/jpa-part8",
      "prev": "https://jvdocs.pages.dev/spring-boot/jpa-part7",
      "prev_slug": "spring-boot/jpa-part7",
      "next": "https://jvdocs.pages.dev/spring-boot/jpa-part9",
      "next_slug": "spring-boot/jpa-part9"
    },
    {
      "course": "Spring Boot",
      "course_id": "spring-boot",
      "num": "31",
      "title": "JPA Part 9: Native Queries and the Criteria API",
      "slug": "spring-boot/jpa-part9",
      "url": "https://jvdocs.pages.dev/spring-boot/jpa-part9",
      "prev": "https://jvdocs.pages.dev/spring-boot/jpa-part8",
      "prev_slug": "spring-boot/jpa-part8",
      "next": "https://jvdocs.pages.dev/spring-boot/jpa-part10",
      "next_slug": "spring-boot/jpa-part10"
    },
    {
      "course": "Spring Boot",
      "course_id": "spring-boot",
      "num": "32",
      "title": "JPA Part 10: The Specification API",
      "slug": "spring-boot/jpa-part10",
      "url": "https://jvdocs.pages.dev/spring-boot/jpa-part10",
      "prev": "https://jvdocs.pages.dev/spring-boot/jpa-part9",
      "prev_slug": "spring-boot/jpa-part9",
      "next": "https://jvdocs.pages.dev/spring-boot/attacks-csrf-xss",
      "next_slug": "spring-boot/attacks-csrf-xss"
    },
    {
      "course": "Spring Boot",
      "course_id": "spring-boot",
      "num": "33",
      "title": "Web Attacks: CSRF, XSS, CORS and SQL Injection",
      "slug": "spring-boot/attacks-csrf-xss",
      "url": "https://jvdocs.pages.dev/spring-boot/attacks-csrf-xss",
      "prev": "https://jvdocs.pages.dev/spring-boot/jpa-part10",
      "prev_slug": "spring-boot/jpa-part10",
      "next": "https://jvdocs.pages.dev/spring-boot/security-part1",
      "next_slug": "spring-boot/security-part1"
    },
    {
      "course": "Spring Boot",
      "course_id": "spring-boot",
      "num": "34",
      "title": "Spring Security Part 1: Architecture and Setup",
      "slug": "spring-boot/security-part1",
      "url": "https://jvdocs.pages.dev/spring-boot/security-part1",
      "prev": "https://jvdocs.pages.dev/spring-boot/attacks-csrf-xss",
      "prev_slug": "spring-boot/attacks-csrf-xss",
      "next": "https://jvdocs.pages.dev/spring-boot/security-part2",
      "next_slug": "spring-boot/security-part2"
    },
    {
      "course": "Spring Boot",
      "course_id": "spring-boot",
      "num": "35",
      "title": "Spring Security Part 2: Creating and Storing Users",
      "slug": "spring-boot/security-part2",
      "url": "https://jvdocs.pages.dev/spring-boot/security-part2",
      "prev": "https://jvdocs.pages.dev/spring-boot/security-part1",
      "prev_slug": "spring-boot/security-part1",
      "next": "https://jvdocs.pages.dev/spring-boot/security-part3",
      "next_slug": "spring-boot/security-part3"
    },
    {
      "course": "Spring Boot",
      "course_id": "spring-boot",
      "num": "36",
      "title": "Spring Security Part 3: Form Login (Stateful)",
      "slug": "spring-boot/security-part3",
      "url": "https://jvdocs.pages.dev/spring-boot/security-part3",
      "prev": "https://jvdocs.pages.dev/spring-boot/security-part2",
      "prev_slug": "spring-boot/security-part2",
      "next": "https://jvdocs.pages.dev/spring-boot/security-part4",
      "next_slug": "spring-boot/security-part4"
    },
    {
      "course": "Spring Boot",
      "course_id": "spring-boot",
      "num": "37",
      "title": "Spring Security Part 4: Basic Authentication (Stateless)",
      "slug": "spring-boot/security-part4",
      "url": "https://jvdocs.pages.dev/spring-boot/security-part4",
      "prev": "https://jvdocs.pages.dev/spring-boot/security-part3",
      "prev_slug": "spring-boot/security-part3",
      "next": "https://jvdocs.pages.dev/spring-boot/jwt-explained",
      "next_slug": "spring-boot/jwt-explained"
    },
    {
      "course": "Spring Boot",
      "course_id": "spring-boot",
      "num": "38",
      "title": "Spring Security Part 5: JWT Explained",
      "slug": "spring-boot/jwt-explained",
      "url": "https://jvdocs.pages.dev/spring-boot/jwt-explained",
      "prev": "https://jvdocs.pages.dev/spring-boot/security-part4",
      "prev_slug": "spring-boot/security-part4",
      "next": "https://jvdocs.pages.dev/spring-boot/security-jwt",
      "next_slug": "spring-boot/security-jwt"
    },
    {
      "course": "Spring Boot",
      "course_id": "spring-boot",
      "num": "39",
      "title": "Spring Security Part 6: JWT Authentication",
      "slug": "spring-boot/security-jwt",
      "url": "https://jvdocs.pages.dev/spring-boot/security-jwt",
      "prev": "https://jvdocs.pages.dev/spring-boot/jwt-explained",
      "prev_slug": "spring-boot/jwt-explained",
      "next": "https://jvdocs.pages.dev/spring-boot/oauth2-explained",
      "next_slug": "spring-boot/oauth2-explained"
    },
    {
      "course": "Spring Boot",
      "course_id": "spring-boot",
      "num": "40",
      "title": "Spring Security Part 7: OAuth 2.0 Explained",
      "slug": "spring-boot/oauth2-explained",
      "url": "https://jvdocs.pages.dev/spring-boot/oauth2-explained",
      "prev": "https://jvdocs.pages.dev/spring-boot/security-jwt",
      "prev_slug": "spring-boot/security-jwt",
      "next": "https://jvdocs.pages.dev/spring-boot/security-oauth2",
      "next_slug": "spring-boot/security-oauth2"
    },
    {
      "course": "Spring Boot",
      "course_id": "spring-boot",
      "num": "41",
      "title": "Spring Security Part 8: OAuth2 Login",
      "slug": "spring-boot/security-oauth2",
      "url": "https://jvdocs.pages.dev/spring-boot/security-oauth2",
      "prev": "https://jvdocs.pages.dev/spring-boot/oauth2-explained",
      "prev_slug": "spring-boot/oauth2-explained",
      "next": "https://jvdocs.pages.dev/spring-boot/security-method",
      "next_slug": "spring-boot/security-method"
    },
    {
      "course": "Spring Boot",
      "course_id": "spring-boot",
      "num": "42",
      "title": "Spring Security Part 9: Method Security with @PreAuthorize and @PostAuthorize",
      "slug": "spring-boot/security-method",
      "url": "https://jvdocs.pages.dev/spring-boot/security-method",
      "prev": "https://jvdocs.pages.dev/spring-boot/security-oauth2",
      "prev_slug": "spring-boot/security-oauth2",
      "next": "https://jvdocs.pages.dev/spring-boot/actuator",
      "next_slug": "spring-boot/actuator"
    },
    {
      "course": "Spring Boot",
      "course_id": "spring-boot",
      "num": "43",
      "title": "Actuator: Health, Metrics and Monitoring",
      "slug": "spring-boot/actuator",
      "url": "https://jvdocs.pages.dev/spring-boot/actuator",
      "prev": "https://jvdocs.pages.dev/spring-boot/security-method",
      "prev_slug": "spring-boot/security-method",
      "next": "https://jvdocs.pages.dev/spring-boot/configuration-properties",
      "next_slug": "spring-boot/configuration-properties"
    },
    {
      "course": "Spring Boot",
      "course_id": "spring-boot",
      "num": "44",
      "title": "@ConfigurationProperties: Typed Configuration",
      "slug": "spring-boot/configuration-properties",
      "url": "https://jvdocs.pages.dev/spring-boot/configuration-properties",
      "prev": "https://jvdocs.pages.dev/spring-boot/actuator",
      "prev_slug": "spring-boot/actuator",
      "next": null,
      "next_slug": null
    },
    {
      "course": "JUnit 5 & Mockito",
      "course_id": "junit-mockito",
      "num": "01",
      "title": "Unit Testing Roadmap: JUnit 5 and Mockito",
      "slug": "junit-mockito/roadmap",
      "url": "https://jvdocs.pages.dev/junit-mockito/roadmap",
      "prev": null,
      "prev_slug": null,
      "next": "https://jvdocs.pages.dev/junit-mockito/unit-testing-intro",
      "next_slug": "junit-mockito/unit-testing-intro"
    },
    {
      "course": "JUnit 5 & Mockito",
      "course_id": "junit-mockito",
      "num": "02",
      "title": "What Unit Testing Is: Unit, Integration and Functional Tests",
      "slug": "junit-mockito/unit-testing-intro",
      "url": "https://jvdocs.pages.dev/junit-mockito/unit-testing-intro",
      "prev": "https://jvdocs.pages.dev/junit-mockito/roadmap",
      "prev_slug": "junit-mockito/roadmap",
      "next": "https://jvdocs.pages.dev/junit-mockito/junit5-architecture",
      "next_slug": "junit-mockito/junit5-architecture"
    },
    {
      "course": "JUnit 5 & Mockito",
      "course_id": "junit-mockito",
      "num": "03",
      "title": "JUnit 5 Architecture: Platform, Jupiter and Vintage",
      "slug": "junit-mockito/junit5-architecture",
      "url": "https://jvdocs.pages.dev/junit-mockito/junit5-architecture",
      "prev": "https://jvdocs.pages.dev/junit-mockito/unit-testing-intro",
      "prev_slug": "junit-mockito/unit-testing-intro",
      "next": "https://jvdocs.pages.dev/junit-mockito/lifecycle",
      "next_slug": "junit-mockito/lifecycle"
    },
    {
      "course": "JUnit 5 & Mockito",
      "course_id": "junit-mockito",
      "num": "04",
      "title": "Test Lifecycle, @TestInstance and Parallel Execution",
      "slug": "junit-mockito/lifecycle",
      "url": "https://jvdocs.pages.dev/junit-mockito/lifecycle",
      "prev": "https://jvdocs.pages.dev/junit-mockito/junit5-architecture",
      "prev_slug": "junit-mockito/junit5-architecture",
      "next": "https://jvdocs.pages.dev/junit-mockito/assertions",
      "next_slug": "junit-mockito/assertions"
    },
    {
      "course": "JUnit 5 & Mockito",
      "course_id": "junit-mockito",
      "num": "05",
      "title": "Assertions and Testing Exceptions",
      "slug": "junit-mockito/assertions",
      "url": "https://jvdocs.pages.dev/junit-mockito/assertions",
      "prev": "https://jvdocs.pages.dev/junit-mockito/lifecycle",
      "prev_slug": "junit-mockito/lifecycle",
      "next": "https://jvdocs.pages.dev/junit-mockito/extensions",
      "next_slug": "junit-mockito/extensions"
    },
    {
      "course": "JUnit 5 & Mockito",
      "course_id": "junit-mockito",
      "num": "06",
      "title": "Extensions",
      "slug": "junit-mockito/extensions",
      "url": "https://jvdocs.pages.dev/junit-mockito/extensions",
      "prev": "https://jvdocs.pages.dev/junit-mockito/assertions",
      "prev_slug": "junit-mockito/assertions",
      "next": "https://jvdocs.pages.dev/junit-mockito/repeated-test",
      "next_slug": "junit-mockito/repeated-test"
    },
    {
      "course": "JUnit 5 & Mockito",
      "course_id": "junit-mockito",
      "num": "07",
      "title": "@RepeatedTest",
      "slug": "junit-mockito/repeated-test",
      "url": "https://jvdocs.pages.dev/junit-mockito/repeated-test",
      "prev": "https://jvdocs.pages.dev/junit-mockito/extensions",
      "prev_slug": "junit-mockito/extensions",
      "next": "https://jvdocs.pages.dev/junit-mockito/parameterized-part1",
      "next_slug": "junit-mockito/parameterized-part1"
    },
    {
      "course": "JUnit 5 & Mockito",
      "course_id": "junit-mockito",
      "num": "08",
      "title": "Parameterized Tests Part 1: Single and Multiple Values",
      "slug": "junit-mockito/parameterized-part1",
      "url": "https://jvdocs.pages.dev/junit-mockito/parameterized-part1",
      "prev": "https://jvdocs.pages.dev/junit-mockito/repeated-test",
      "prev_slug": "junit-mockito/repeated-test",
      "next": "https://jvdocs.pages.dev/junit-mockito/parameterized-part2",
      "next_slug": "junit-mockito/parameterized-part2"
    },
    {
      "course": "JUnit 5 & Mockito",
      "course_id": "junit-mockito",
      "num": "09",
      "title": "Parameterized Tests Part 2: Objects and Complex Data",
      "slug": "junit-mockito/parameterized-part2",
      "url": "https://jvdocs.pages.dev/junit-mockito/parameterized-part2",
      "prev": "https://jvdocs.pages.dev/junit-mockito/parameterized-part1",
      "prev_slug": "junit-mockito/parameterized-part1",
      "next": "https://jvdocs.pages.dev/junit-mockito/assumptions",
      "next_slug": "junit-mockito/assumptions"
    },
    {
      "course": "JUnit 5 & Mockito",
      "course_id": "junit-mockito",
      "num": "10",
      "title": "Assumptions",
      "slug": "junit-mockito/assumptions",
      "url": "https://jvdocs.pages.dev/junit-mockito/assumptions",
      "prev": "https://jvdocs.pages.dev/junit-mockito/parameterized-part2",
      "prev_slug": "junit-mockito/parameterized-part2",
      "next": "https://jvdocs.pages.dev/junit-mockito/tagging-filtering",
      "next_slug": "junit-mockito/tagging-filtering"
    },
    {
      "course": "JUnit 5 & Mockito",
      "course_id": "junit-mockito",
      "num": "11",
      "title": "Tagging and Filtering",
      "slug": "junit-mockito/tagging-filtering",
      "url": "https://jvdocs.pages.dev/junit-mockito/tagging-filtering",
      "prev": "https://jvdocs.pages.dev/junit-mockito/assumptions",
      "prev_slug": "junit-mockito/assumptions",
      "next": "https://jvdocs.pages.dev/junit-mockito/test-suites",
      "next_slug": "junit-mockito/test-suites"
    },
    {
      "course": "JUnit 5 & Mockito",
      "course_id": "junit-mockito",
      "num": "12",
      "title": "Test Suites, and Suites vs Tags",
      "slug": "junit-mockito/test-suites",
      "url": "https://jvdocs.pages.dev/junit-mockito/test-suites",
      "prev": "https://jvdocs.pages.dev/junit-mockito/tagging-filtering",
      "prev_slug": "junit-mockito/tagging-filtering",
      "next": "https://jvdocs.pages.dev/junit-mockito/test-factory",
      "next_slug": "junit-mockito/test-factory"
    },
    {
      "course": "JUnit 5 & Mockito",
      "course_id": "junit-mockito",
      "num": "13",
      "title": "Dynamic Tests with @TestFactory",
      "slug": "junit-mockito/test-factory",
      "url": "https://jvdocs.pages.dev/junit-mockito/test-factory",
      "prev": "https://jvdocs.pages.dev/junit-mockito/test-suites",
      "prev_slug": "junit-mockito/test-suites",
      "next": "https://jvdocs.pages.dev/junit-mockito/mock-stub-spy",
      "next_slug": "junit-mockito/mock-stub-spy"
    },
    {
      "course": "JUnit 5 & Mockito",
      "course_id": "junit-mockito",
      "num": "14",
      "title": "Mock vs Stub vs Spy",
      "slug": "junit-mockito/mock-stub-spy",
      "url": "https://jvdocs.pages.dev/junit-mockito/mock-stub-spy",
      "prev": "https://jvdocs.pages.dev/junit-mockito/test-factory",
      "prev_slug": "junit-mockito/test-factory",
      "next": "https://jvdocs.pages.dev/junit-mockito/mockito-architecture",
      "next_slug": "junit-mockito/mockito-architecture"
    },
    {
      "course": "JUnit 5 & Mockito",
      "course_id": "junit-mockito",
      "num": "15",
      "title": "Mockito Architecture: How Mocks, Stubs and Spies Work",
      "slug": "junit-mockito/mockito-architecture",
      "url": "https://jvdocs.pages.dev/junit-mockito/mockito-architecture",
      "prev": "https://jvdocs.pages.dev/junit-mockito/mock-stub-spy",
      "prev_slug": "junit-mockito/mock-stub-spy",
      "next": "https://jvdocs.pages.dev/junit-mockito/inject-mocks",
      "next_slug": "junit-mockito/inject-mocks"
    },
    {
      "course": "JUnit 5 & Mockito",
      "course_id": "junit-mockito",
      "num": "16",
      "title": "@Mock, @Spy and @InjectMocks",
      "slug": "junit-mockito/inject-mocks",
      "url": "https://jvdocs.pages.dev/junit-mockito/inject-mocks",
      "prev": "https://jvdocs.pages.dev/junit-mockito/mockito-architecture",
      "prev_slug": "junit-mockito/mockito-architecture",
      "next": "https://jvdocs.pages.dev/junit-mockito/mock-parameter",
      "next_slug": "junit-mockito/mock-parameter"
    },
    {
      "course": "JUnit 5 & Mockito",
      "course_id": "junit-mockito",
      "num": "17",
      "title": "@Mock as a Constructor or Method Parameter",
      "slug": "junit-mockito/mock-parameter",
      "url": "https://jvdocs.pages.dev/junit-mockito/mock-parameter",
      "prev": "https://jvdocs.pages.dev/junit-mockito/inject-mocks",
      "prev_slug": "junit-mockito/inject-mocks",
      "next": "https://jvdocs.pages.dev/junit-mockito/stubbing",
      "next_slug": "junit-mockito/stubbing"
    },
    {
      "course": "JUnit 5 & Mockito",
      "course_id": "junit-mockito",
      "num": "18",
      "title": "Stubbing: Matchers, Static and Dynamic Answers",
      "slug": "junit-mockito/stubbing",
      "url": "https://jvdocs.pages.dev/junit-mockito/stubbing",
      "prev": "https://jvdocs.pages.dev/junit-mockito/mock-parameter",
      "prev_slug": "junit-mockito/mock-parameter",
      "next": "https://jvdocs.pages.dev/junit-mockito/verification",
      "next_slug": "junit-mockito/verification"
    },
    {
      "course": "JUnit 5 & Mockito",
      "course_id": "junit-mockito",
      "num": "19",
      "title": "Verification",
      "slug": "junit-mockito/verification",
      "url": "https://jvdocs.pages.dev/junit-mockito/verification",
      "prev": "https://jvdocs.pages.dev/junit-mockito/stubbing",
      "prev_slug": "junit-mockito/stubbing",
      "next": null,
      "next_slug": null
    },
    {
      "course": "Microservices",
      "course_id": "microservices",
      "num": "01",
      "title": "Service-to-Service Calls with RestTemplate",
      "slug": "microservices/rest-template",
      "url": "https://jvdocs.pages.dev/microservices/rest-template",
      "prev": null,
      "prev_slug": null,
      "next": "https://jvdocs.pages.dev/microservices/rest-client",
      "next_slug": "microservices/rest-client"
    },
    {
      "course": "Microservices",
      "course_id": "microservices",
      "num": "02",
      "title": "RestClient and Its Fluent API",
      "slug": "microservices/rest-client",
      "url": "https://jvdocs.pages.dev/microservices/rest-client",
      "prev": "https://jvdocs.pages.dev/microservices/rest-template",
      "prev_slug": "microservices/rest-template",
      "next": "https://jvdocs.pages.dev/microservices/feign-client",
      "next_slug": "microservices/feign-client"
    },
    {
      "course": "Microservices",
      "course_id": "microservices",
      "num": "03",
      "title": "FeignClient: Declarative HTTP Calls",
      "slug": "microservices/feign-client",
      "url": "https://jvdocs.pages.dev/microservices/feign-client",
      "prev": "https://jvdocs.pages.dev/microservices/rest-client",
      "prev_slug": "microservices/rest-client",
      "next": "https://jvdocs.pages.dev/microservices/service-discovery",
      "next_slug": "microservices/service-discovery"
    },
    {
      "course": "Microservices",
      "course_id": "microservices",
      "num": "04",
      "title": "Service Discovery with Eureka",
      "slug": "microservices/service-discovery",
      "url": "https://jvdocs.pages.dev/microservices/service-discovery",
      "prev": "https://jvdocs.pages.dev/microservices/feign-client",
      "prev_slug": "microservices/feign-client",
      "next": "https://jvdocs.pages.dev/microservices/load-balancer",
      "next_slug": "microservices/load-balancer"
    },
    {
      "course": "Microservices",
      "course_id": "microservices",
      "num": "05",
      "title": "Client-Side Load Balancing",
      "slug": "microservices/load-balancer",
      "url": "https://jvdocs.pages.dev/microservices/load-balancer",
      "prev": "https://jvdocs.pages.dev/microservices/service-discovery",
      "prev_slug": "microservices/service-discovery",
      "next": "https://jvdocs.pages.dev/microservices/rate-limiter",
      "next_slug": "microservices/rate-limiter"
    },
    {
      "course": "Microservices",
      "course_id": "microservices",
      "num": "06",
      "title": "Fault Tolerance and the Rate Limiter",
      "slug": "microservices/rate-limiter",
      "url": "https://jvdocs.pages.dev/microservices/rate-limiter",
      "prev": "https://jvdocs.pages.dev/microservices/load-balancer",
      "prev_slug": "microservices/load-balancer",
      "next": "https://jvdocs.pages.dev/microservices/bulkhead",
      "next_slug": "microservices/bulkhead"
    },
    {
      "course": "Microservices",
      "course_id": "microservices",
      "num": "07",
      "title": "The Bulkhead and the Time Limiter",
      "slug": "microservices/bulkhead",
      "url": "https://jvdocs.pages.dev/microservices/bulkhead",
      "prev": "https://jvdocs.pages.dev/microservices/rate-limiter",
      "prev_slug": "microservices/rate-limiter",
      "next": "https://jvdocs.pages.dev/microservices/retry-pattern",
      "next_slug": "microservices/retry-pattern"
    },
    {
      "course": "Microservices",
      "course_id": "microservices",
      "num": "08",
      "title": "The Retry Pattern",
      "slug": "microservices/retry-pattern",
      "url": "https://jvdocs.pages.dev/microservices/retry-pattern",
      "prev": "https://jvdocs.pages.dev/microservices/bulkhead",
      "prev_slug": "microservices/bulkhead",
      "next": "https://jvdocs.pages.dev/microservices/circuit-breaker",
      "next_slug": "microservices/circuit-breaker"
    },
    {
      "course": "Microservices",
      "course_id": "microservices",
      "num": "09",
      "title": "The Circuit Breaker",
      "slug": "microservices/circuit-breaker",
      "url": "https://jvdocs.pages.dev/microservices/circuit-breaker",
      "prev": "https://jvdocs.pages.dev/microservices/retry-pattern",
      "prev_slug": "microservices/retry-pattern",
      "next": "https://jvdocs.pages.dev/microservices/api-gateway-routing",
      "next_slug": "microservices/api-gateway-routing"
    },
    {
      "course": "Microservices",
      "course_id": "microservices",
      "num": "10",
      "title": "API Gateway: Routing and Load Balancing",
      "slug": "microservices/api-gateway-routing",
      "url": "https://jvdocs.pages.dev/microservices/api-gateway-routing",
      "prev": "https://jvdocs.pages.dev/microservices/circuit-breaker",
      "prev_slug": "microservices/circuit-breaker",
      "next": "https://jvdocs.pages.dev/microservices/api-gateway-auth",
      "next_slug": "microservices/api-gateway-auth"
    },
    {
      "course": "Microservices",
      "course_id": "microservices",
      "num": "11",
      "title": "API Gateway: Filters and Authentication",
      "slug": "microservices/api-gateway-auth",
      "url": "https://jvdocs.pages.dev/microservices/api-gateway-auth",
      "prev": "https://jvdocs.pages.dev/microservices/api-gateway-routing",
      "prev_slug": "microservices/api-gateway-routing",
      "next": "https://jvdocs.pages.dev/microservices/centralized-config",
      "next_slug": "microservices/centralized-config"
    },
    {
      "course": "Microservices",
      "course_id": "microservices",
      "num": "12",
      "title": "Centralized Configuration with Spring Cloud Config",
      "slug": "microservices/centralized-config",
      "url": "https://jvdocs.pages.dev/microservices/centralized-config",
      "prev": "https://jvdocs.pages.dev/microservices/api-gateway-auth",
      "prev_slug": "microservices/api-gateway-auth",
      "next": "https://jvdocs.pages.dev/microservices/refresh-scope",
      "next_slug": "microservices/refresh-scope"
    },
    {
      "course": "Microservices",
      "course_id": "microservices",
      "num": "13",
      "title": "@RefreshScope: Reloading Configuration at Runtime",
      "slug": "microservices/refresh-scope",
      "url": "https://jvdocs.pages.dev/microservices/refresh-scope",
      "prev": "https://jvdocs.pages.dev/microservices/centralized-config",
      "prev_slug": "microservices/centralized-config",
      "next": "https://jvdocs.pages.dev/microservices/spring-cloud-bus",
      "next_slug": "microservices/spring-cloud-bus"
    },
    {
      "course": "Microservices",
      "course_id": "microservices",
      "num": "14",
      "title": "Spring Cloud Bus",
      "slug": "microservices/spring-cloud-bus",
      "url": "https://jvdocs.pages.dev/microservices/spring-cloud-bus",
      "prev": "https://jvdocs.pages.dev/microservices/refresh-scope",
      "prev_slug": "microservices/refresh-scope",
      "next": "https://jvdocs.pages.dev/microservices/distributed-tracing",
      "next_slug": "microservices/distributed-tracing"
    },
    {
      "course": "Microservices",
      "course_id": "microservices",
      "num": "15",
      "title": "Distributed Tracing with Micrometer and OpenTelemetry",
      "slug": "microservices/distributed-tracing",
      "url": "https://jvdocs.pages.dev/microservices/distributed-tracing",
      "prev": "https://jvdocs.pages.dev/microservices/spring-cloud-bus",
      "prev_slug": "microservices/spring-cloud-bus",
      "next": "https://jvdocs.pages.dev/microservices/logging-part1",
      "next_slug": "microservices/logging-part1"
    },
    {
      "course": "Microservices",
      "course_id": "microservices",
      "num": "16",
      "title": "Logging Foundations: SLF4J, Logback and the Logger Hierarchy",
      "slug": "microservices/logging-part1",
      "url": "https://jvdocs.pages.dev/microservices/logging-part1",
      "prev": "https://jvdocs.pages.dev/microservices/distributed-tracing",
      "prev_slug": "microservices/distributed-tracing",
      "next": "https://jvdocs.pages.dev/microservices/logging-part2",
      "next_slug": "microservices/logging-part2"
    },
    {
      "course": "Microservices",
      "course_id": "microservices",
      "num": "17",
      "title": "Logging Appenders: Console, File, Rolling and Custom",
      "slug": "microservices/logging-part2",
      "url": "https://jvdocs.pages.dev/microservices/logging-part2",
      "prev": "https://jvdocs.pages.dev/microservices/logging-part1",
      "prev_slug": "microservices/logging-part1",
      "next": "https://jvdocs.pages.dev/microservices/logging-part3",
      "next_slug": "microservices/logging-part3"
    },
    {
      "course": "Microservices",
      "course_id": "microservices",
      "num": "18",
      "title": "Async Logging, Filters, Structured JSON and PII",
      "slug": "microservices/logging-part3",
      "url": "https://jvdocs.pages.dev/microservices/logging-part3",
      "prev": "https://jvdocs.pages.dev/microservices/logging-part2",
      "prev_slug": "microservices/logging-part2",
      "next": "https://jvdocs.pages.dev/microservices/logging-part4",
      "next_slug": "microservices/logging-part4"
    },
    {
      "course": "Microservices",
      "course_id": "microservices",
      "num": "19",
      "title": "Distributed Logging: MDC, Correlation IDs and Trace IDs",
      "slug": "microservices/logging-part4",
      "url": "https://jvdocs.pages.dev/microservices/logging-part4",
      "prev": "https://jvdocs.pages.dev/microservices/logging-part3",
      "prev_slug": "microservices/logging-part3",
      "next": "https://jvdocs.pages.dev/microservices/scheduler-part1",
      "next_slug": "microservices/scheduler-part1"
    },
    {
      "course": "Microservices",
      "course_id": "microservices",
      "num": "20",
      "title": "How Schedulers Work: ScheduledThreadPoolExecutor and Leader–Follower",
      "slug": "microservices/scheduler-part1",
      "url": "https://jvdocs.pages.dev/microservices/scheduler-part1",
      "prev": "https://jvdocs.pages.dev/microservices/logging-part4",
      "prev_slug": "microservices/logging-part4",
      "next": "https://jvdocs.pages.dev/microservices/scheduler-part2",
      "next_slug": "microservices/scheduler-part2"
    },
    {
      "course": "Microservices",
      "course_id": "microservices",
      "num": "21",
      "title": "@Scheduled: Fixed Rate, Fixed Delay and Cron",
      "slug": "microservices/scheduler-part2",
      "url": "https://jvdocs.pages.dev/microservices/scheduler-part2",
      "prev": "https://jvdocs.pages.dev/microservices/scheduler-part1",
      "prev_slug": "microservices/scheduler-part1",
      "next": "https://jvdocs.pages.dev/microservices/scheduler-part3",
      "next_slug": "microservices/scheduler-part3"
    },
    {
      "course": "Microservices",
      "course_id": "microservices",
      "num": "22",
      "title": "Scheduled Jobs: Common Pitfalls and Fixes",
      "slug": "microservices/scheduler-part3",
      "url": "https://jvdocs.pages.dev/microservices/scheduler-part3",
      "prev": "https://jvdocs.pages.dev/microservices/scheduler-part2",
      "prev_slug": "microservices/scheduler-part2",
      "next": "https://jvdocs.pages.dev/microservices/scheduler-part4",
      "next_slug": "microservices/scheduler-part4"
    },
    {
      "course": "Microservices",
      "course_id": "microservices",
      "num": "23",
      "title": "ShedLock: Running a Job on Exactly One Instance",
      "slug": "microservices/scheduler-part4",
      "url": "https://jvdocs.pages.dev/microservices/scheduler-part4",
      "prev": "https://jvdocs.pages.dev/microservices/scheduler-part3",
      "prev_slug": "microservices/scheduler-part3",
      "next": null,
      "next_slug": null
    }
  ]
}