<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>JSBlogs</title><description>A blog about Java, Spring, Security, and more by Jitendra Singh Bisht.</description><link>https://blogs.jsbisht.com/</link><item><title>Apache Kafka 4.2 — what&apos;s new and what it means for Java developers</title><link>https://blogs.jsbisht.com/blog/kafka-4-2-whats-new/</link><guid isPermaLink="true">https://blogs.jsbisht.com/blog/kafka-4-2-whats-new/</guid><description>Apache Kafka 4.2 ships Share Groups (Kafka Queues) as production-ready, brings Kafka Streams DLQ support and server-side rebalance to GA, standardises the CLI, and adds Java 25 support. This post walks through every meaningful change with code examples.</description><pubDate>Thu, 05 Mar 2026 02:30:00 GMT</pubDate><category>kafka</category><category>java</category><category>messaging</category></item><item><title>What to learn next — your AI engineering learning path after this course</title><link>https://blogs.jsbisht.com/blog/ai-whats-next-learning-path/</link><guid isPermaLink="true">https://blogs.jsbisht.com/blog/ai-whats-next-learning-path/</guid><description>You have built a production-ready AI application from scratch. You understand embeddings, RAG, agents, memory, and how to ship safely. This post maps where to go from here — deeper specialisations, adjacent skills, and the emerging areas worth watching.</description><pubDate>Tue, 03 Mar 2026 13:50:00 GMT</pubDate><category>spring-ai</category><category>ai-concepts</category><category>java</category></item><item><title>LangChain4j vs Spring AI — which Java AI framework should you use?</title><link>https://blogs.jsbisht.com/blog/langchain4j-vs-spring-ai-comparison/</link><guid isPermaLink="true">https://blogs.jsbisht.com/blog/langchain4j-vs-spring-ai-comparison/</guid><description>Two mature Java AI frameworks exist — Spring AI and LangChain4j. They solve the same problems with different philosophies. This post maps their concepts side-by-side, compares their strengths, and offers a clear decision guide for new projects.</description><pubDate>Tue, 03 Mar 2026 13:30:00 GMT</pubDate><category>spring-ai</category><category>java</category><category>ai-concepts</category></item><item><title>Multimodal AI in Spring AI — adding image understanding to your Java app</title><link>https://blogs.jsbisht.com/blog/spring-ai-multimodal-image-understanding/</link><guid isPermaLink="true">https://blogs.jsbisht.com/blog/spring-ai-multimodal-image-understanding/</guid><description>Multimodal models process images alongside text. A customer can send a photo of a damaged product, and the LLM reads both image and question together to answer. Spring AI&apos;s UserMessage API handles images via URL or base64 — this post shows both.</description><pubDate>Tue, 03 Mar 2026 13:10:00 GMT</pubDate><category>spring-ai</category><category>springboot</category><category>java</category></item><item><title>Running local AI models with Ollama and Spring AI — private, free, offline</title><link>https://blogs.jsbisht.com/blog/spring-ai-local-models-ollama/</link><guid isPermaLink="true">https://blogs.jsbisht.com/blog/spring-ai-local-models-ollama/</guid><description>Ollama runs open-weight LLMs and embedding models on your own machine. No API key, no data leaving your network, no per-token cost. This post shows how to swap Spring AI from OpenAI to Ollama with a profile switch — and where local models fall short.</description><pubDate>Tue, 03 Mar 2026 12:50:00 GMT</pubDate><category>spring-ai</category><category>springboot</category><category>java</category></item><item><title>Deployment and configuration best practices for AI-powered Spring Boot apps</title><link>https://blogs.jsbisht.com/blog/ai-deployment-configuration-best-practices/</link><guid isPermaLink="true">https://blogs.jsbisht.com/blog/ai-deployment-configuration-best-practices/</guid><description>Shipping an AI feature involves more than the code: API key management, environment-specific model routing, database schema for vector storage, feature flags for safe rollouts, and a pre-deploy checklist. This post covers the production-readiness concerns specific to AI applications.</description><pubDate>Tue, 03 Mar 2026 12:30:00 GMT</pubDate><category>spring-ai</category><category>springboot</category><category>java</category></item><item><title>Error handling for AI apps — rate limits, timeouts, and fallback strategies</title><link>https://blogs.jsbisht.com/blog/ai-error-handling-rate-limits-fallbacks/</link><guid isPermaLink="true">https://blogs.jsbisht.com/blog/ai-error-handling-rate-limits-fallbacks/</guid><description>LLM API calls fail in ways that normal service calls don&apos;t — rate limits, content policy rejections, context window overflows, and intermittent 503s. This post covers the error types, retry strategies, timeout configuration, and graceful fallbacks for production resilience.</description><pubDate>Tue, 03 Mar 2026 12:10:00 GMT</pubDate><category>spring-ai</category><category>springboot</category><category>java</category></item><item><title>Safety and guardrails for AI apps — protecting users and your system</title><link>https://blogs.jsbisht.com/blog/ai-safety-guardrails-input-output/</link><guid isPermaLink="true">https://blogs.jsbisht.com/blog/ai-safety-guardrails-input-output/</guid><description>AI applications face threats that traditional APIs do not — prompt injection, jailbreaks, off-topic responses, and toxic content generation. This post covers the practical guardrails every production AI application needs on both input and output.</description><pubDate>Tue, 03 Mar 2026 11:50:00 GMT</pubDate><category>spring-ai</category><category>springboot</category><category>java</category></item><item><title>Testing AI features — how do you test something non-deterministic?</title><link>https://blogs.jsbisht.com/blog/ai-testing-strategies-non-deterministic/</link><guid isPermaLink="true">https://blogs.jsbisht.com/blog/ai-testing-strategies-non-deterministic/</guid><description>LLM outputs vary on every call. You cannot assert exact strings. But you can test structure, facts, boundaries, and behaviour — with the right strategies. This post covers unit tests with mocked models, integration tests with real calls, and evaluation harnesses for answer quality.</description><pubDate>Tue, 03 Mar 2026 11:30:00 GMT</pubDate><category>spring-ai</category><category>springboot</category><category>java</category></item><item><title>Controlling AI costs in production — token budgets, caching, and model selection</title><link>https://blogs.jsbisht.com/blog/ai-cost-management-token-budgets/</link><guid isPermaLink="true">https://blogs.jsbisht.com/blog/ai-cost-management-token-budgets/</guid><description>LLM API costs scale directly with token volume. A busy support assistant can easily spend hundreds of dollars per day if left unmanaged. This post covers the practical techniques that meaningfully reduce costs without sacrificing answer quality.</description><pubDate>Tue, 03 Mar 2026 11:10:00 GMT</pubDate><category>spring-ai</category><category>springboot</category><category>java</category></item><item><title>Observability for AI applications — tracing and logging LLM calls in Spring Boot</title><link>https://blogs.jsbisht.com/blog/ai-observability-tracing-llm-calls/</link><guid isPermaLink="true">https://blogs.jsbisht.com/blog/ai-observability-tracing-llm-calls/</guid><description>An LLM call is a black box by default: you send text, you get text back. Without observability you cannot diagnose latency, debug wrong answers, or track costs. This post wires Spring AI&apos;s Micrometer integration, distributed tracing, and structured logging into the support assistant.</description><pubDate>Tue, 03 Mar 2026 10:50:00 GMT</pubDate><category>spring-ai</category><category>springboot</category><category>java</category></item><item><title>AI agent patterns — when to use simple chains, RAG, or full agents</title><link>https://blogs.jsbisht.com/blog/ai-agent-patterns-when-to-use-what/</link><guid isPermaLink="true">https://blogs.jsbisht.com/blog/ai-agent-patterns-when-to-use-what/</guid><description>Not every AI feature needs an agent. This post maps the decision: when a single LLM call is enough, when a prompt chain is better, when RAG solves it, and when you actually need a multi-step agent. Includes reliability considerations and a decision framework.</description><pubDate>Tue, 03 Mar 2026 10:30:00 GMT</pubDate><category>spring-ai</category><category>ai-concepts</category><category>java</category></item><item><title>Combining RAG and tool calling in one Spring AI agent</title><link>https://blogs.jsbisht.com/blog/spring-ai-combining-rag-and-tools/</link><guid isPermaLink="true">https://blogs.jsbisht.com/blog/spring-ai-combining-rag-and-tools/</guid><description>RAG retrieves knowledge from documents. Tools retrieve live data from systems. Most production AI assistants need both. This post shows how QuestionAnswerAdvisor and @Tool methods compose naturally in Spring AI, and how the LLM decides which to use.</description><pubDate>Tue, 03 Mar 2026 10:10:00 GMT</pubDate><category>spring-ai</category><category>springboot</category><category>java</category></item><item><title>Building an AI agent that checks order status — a step-by-step example</title><link>https://blogs.jsbisht.com/blog/spring-ai-agent-order-status/</link><guid isPermaLink="true">https://blogs.jsbisht.com/blog/spring-ai-agent-order-status/</guid><description>This post builds a complete Spring AI agent that fetches live order data from a service, assesses refund eligibility, and provides actionable answers — all in a single conversation turn. The full application wires tools, RAG, and memory together.</description><pubDate>Tue, 03 Mar 2026 09:50:00 GMT</pubDate><category>spring-ai</category><category>springboot</category><category>java</category></item><item><title>Function calling in Spring AI — let the LLM use your Java methods</title><link>https://blogs.jsbisht.com/blog/spring-ai-function-calling-basics/</link><guid isPermaLink="true">https://blogs.jsbisht.com/blog/spring-ai-function-calling-basics/</guid><description>Spring AI&apos;s @Tool annotation turns ordinary Java methods into tools the LLM can invoke. This post covers the full API — annotating methods, registering tools with ChatClient, controlling execution, and reading tool call results.</description><pubDate>Tue, 03 Mar 2026 09:30:00 GMT</pubDate><category>spring-ai</category><category>springboot</category><category>java</category></item><item><title>What is an AI agent? Moving beyond single LLM calls</title><link>https://blogs.jsbisht.com/blog/ai-agents-explained-for-developers/</link><guid isPermaLink="true">https://blogs.jsbisht.com/blog/ai-agents-explained-for-developers/</guid><description>A single LLM call answers a question. An AI agent reasons, decides which tools to use, calls them, observes results, and loops until the task is complete. This post explains the concept clearly and when you actually need an agent vs a simpler approach.</description><pubDate>Tue, 03 Mar 2026 09:10:00 GMT</pubDate><category>spring-ai</category><category>ai-concepts</category><category>java</category></item><item><title>Managing context window efficiently — windowed memory and summarization</title><link>https://blogs.jsbisht.com/blog/ai-memory-window-and-summarization/</link><guid isPermaLink="true">https://blogs.jsbisht.com/blog/ai-memory-window-and-summarization/</guid><description>Sending full conversation history on every request is expensive and eventually hits the context window limit. Windowed memory keeps only recent turns. Summarization condenses older history into a compact summary. This post shows both techniques and when to use each.</description><pubDate>Tue, 03 Mar 2026 08:50:00 GMT</pubDate><category>spring-ai</category><category>ai-concepts</category><category>java</category></item><item><title>Persistent chat memory in Spring AI — survive restarts and scale horizontally</title><link>https://blogs.jsbisht.com/blog/spring-ai-persistent-chat-memory/</link><guid isPermaLink="true">https://blogs.jsbisht.com/blog/spring-ai-persistent-chat-memory/</guid><description>InMemoryChatMemory loses all conversations on restart and doesn&apos;t work across multiple application instances. JdbcChatMemory stores conversation history in PostgreSQL — persistent, durable, and load-balancer friendly.</description><pubDate>Tue, 03 Mar 2026 08:30:00 GMT</pubDate><category>spring-ai</category><category>springboot</category><category>java</category></item><item><title>Chat memory in Spring AI — building a chatbot that remembers</title><link>https://blogs.jsbisht.com/blog/spring-ai-chat-memory-in-memory/</link><guid isPermaLink="true">https://blogs.jsbisht.com/blog/spring-ai-chat-memory-in-memory/</guid><description>Spring AI&apos;s MessageChatMemoryAdvisor automatically injects conversation history into every LLM call and saves each turn back to a ChatMemory store. This post wires InMemoryChatMemory into the support assistant with per-session isolation.</description><pubDate>Tue, 03 Mar 2026 08:10:00 GMT</pubDate><category>spring-ai</category><category>springboot</category><category>java</category></item><item><title>Why LLMs forget everything — and what you must do about it</title><link>https://blogs.jsbisht.com/blog/ai-why-llms-forget-context-window/</link><guid isPermaLink="true">https://blogs.jsbisht.com/blog/ai-why-llms-forget-context-window/</guid><description>Every LLM call is stateless. The model has no memory of previous turns unless you explicitly provide them. This post explains why, what the context window limit means for conversations, and the three strategies for managing memory in AI applications.</description><pubDate>Tue, 03 Mar 2026 07:50:00 GMT</pubDate><category>spring-ai</category><category>ai-concepts</category><category>java</category></item><item><title>Improving RAG quality — reranking and hybrid search</title><link>https://blogs.jsbisht.com/blog/rag-quality-reranking-hybrid-search/</link><guid isPermaLink="true">https://blogs.jsbisht.com/blog/rag-quality-reranking-hybrid-search/</guid><description>Vector search retrieves semantically similar chunks, but similarity alone doesn&apos;t guarantee relevance. Reranking scores retrieved candidates by true relevance. Hybrid search adds keyword matching to catch exact terms. Together they meaningfully improve RAG answer quality.</description><pubDate>Tue, 03 Mar 2026 07:30:00 GMT</pubDate><category>spring-ai</category><category>ai-concepts</category><category>java</category></item><item><title>Building a document Q&amp;A chatbot with Spring AI and RAG</title><link>https://blogs.jsbisht.com/blog/spring-ai-rag-document-qa-chatbot/</link><guid isPermaLink="true">https://blogs.jsbisht.com/blog/spring-ai-rag-document-qa-chatbot/</guid><description>This post assembles all of Module 3 and 4 into one working application — ingestion pipeline, pgvector storage, QuestionAnswerAdvisor, streaming responses, and a simple chat interface. By the end, you have a chatbot that answers from your own documents.</description><pubDate>Tue, 03 Mar 2026 07:10:00 GMT</pubDate><category>spring-ai</category><category>springboot</category><category>java</category></item><item><title>Chunking strategy in RAG — the decision that silently kills answer quality</title><link>https://blogs.jsbisht.com/blog/rag-chunking-strategy-matters/</link><guid isPermaLink="true">https://blogs.jsbisht.com/blog/rag-chunking-strategy-matters/</guid><description>How you split documents before indexing determines whether your RAG pipeline retrieves useful context or useless fragments. Chunk too large and embeddings average out. Chunk too small and context is missing. This post covers the tradeoffs.</description><pubDate>Tue, 03 Mar 2026 06:50:00 GMT</pubDate><category>spring-ai</category><category>ai-concepts</category><category>java</category></item><item><title>Building your first RAG pipeline with Spring AI</title><link>https://blogs.jsbisht.com/blog/spring-ai-rag-pipeline-basics/</link><guid isPermaLink="true">https://blogs.jsbisht.com/blog/spring-ai-rag-pipeline-basics/</guid><description>Spring AI&apos;s QuestionAnswerAdvisor wires retrieval directly into ChatClient. Attach it to your VectorStore and every call automatically retrieves relevant context before the LLM sees the question. This post builds the complete pipeline.</description><pubDate>Tue, 03 Mar 2026 06:30:00 GMT</pubDate><category>spring-ai</category><category>springboot</category><category>java</category></item><item><title>What is RAG and why your AI app almost certainly needs it</title><link>https://blogs.jsbisht.com/blog/ai-rag-explained-for-java-devs/</link><guid isPermaLink="true">https://blogs.jsbisht.com/blog/ai-rag-explained-for-java-devs/</guid><description>LLMs know a lot, but they don&apos;t know about your business. RAG — Retrieval-Augmented Generation — fixes this by retrieving relevant documents at query time and injecting them into the prompt. Here is why it exists and when to use it.</description><pubDate>Tue, 03 Mar 2026 06:10:00 GMT</pubDate><category>spring-ai</category><category>ai-concepts</category><category>java</category></item><item><title>Semantic search in Spring AI — find by meaning, not by keyword</title><link>https://blogs.jsbisht.com/blog/spring-ai-semantic-search/</link><guid isPermaLink="true">https://blogs.jsbisht.com/blog/spring-ai-semantic-search/</guid><description>With documents indexed in pgvector, VectorStore.similaritySearch() finds the most relevant chunks for any query. This post covers SearchRequest, similarity thresholds, metadata filters, and how to expose semantic search as an API endpoint.</description><pubDate>Tue, 03 Mar 2026 05:50:00 GMT</pubDate><category>spring-ai</category><category>springboot</category><category>java</category></item><item><title>Embedding and storing documents with Spring AI — a step-by-step guide</title><link>https://blogs.jsbisht.com/blog/spring-ai-embedding-documents/</link><guid isPermaLink="true">https://blogs.jsbisht.com/blog/spring-ai-embedding-documents/</guid><description>Before you can search your knowledge base semantically, you need to read documents, split them into chunks, generate embeddings, and store them in the vector database. Spring AI&apos;s ETL pipeline handles all of it.</description><pubDate>Tue, 03 Mar 2026 05:30:00 GMT</pubDate><category>spring-ai</category><category>springboot</category><category>java</category></item><item><title>Setting up pgvector with Spring AI — store and search embeddings in PostgreSQL</title><link>https://blogs.jsbisht.com/blog/spring-ai-pgvector-setup/</link><guid isPermaLink="true">https://blogs.jsbisht.com/blog/spring-ai-pgvector-setup/</guid><description>pgvector adds native vector search to PostgreSQL. Spring AI auto-configures the schema and wires an EmbeddingModel to it automatically. This post sets up the complete stack with Docker Compose and verifies it works.</description><pubDate>Tue, 03 Mar 2026 05:10:00 GMT</pubDate><category>spring-ai</category><category>springboot</category><category>java</category></item><item><title>GraalVM native image with Spring Boot 4 — startup gains, build costs, and when it&apos;s worth it</title><link>https://blogs.jsbisht.com/blog/graalvm-native-image-with-spring-boot-4-performance-tradeoffs/</link><guid isPermaLink="true">https://blogs.jsbisht.com/blog/graalvm-native-image-with-spring-boot-4-performance-tradeoffs/</guid><description>GraalVM native image can cut Spring Boot startup from seconds to milliseconds and halve memory usage. Spring Boot 4 ships improved AOT support and requires GraalVM 25. This post covers the real performance numbers, every meaningful limitation, and a decision guide for when native is worth the build complexity.</description><pubDate>Tue, 03 Mar 2026 05:00:00 GMT</pubDate><category>springboot</category><category>spring</category><category>java</category><category>graalvm</category></item><item><title>Vector databases explained — why regular databases are not enough for AI</title><link>https://blogs.jsbisht.com/blog/ai-vector-databases-explained/</link><guid isPermaLink="true">https://blogs.jsbisht.com/blog/ai-vector-databases-explained/</guid><description>Semantic search requires finding the nearest neighbours among millions of high-dimensional vectors. PostgreSQL with B-tree indexes was not built for this. Here is what vector databases do differently and which options work with Spring AI.</description><pubDate>Tue, 03 Mar 2026 04:50:00 GMT</pubDate><category>spring-ai</category><category>ai-concepts</category><category>java</category></item><item><title>What are embeddings? A practical explanation for Java developers</title><link>https://blogs.jsbisht.com/blog/ai-embeddings-explained-for-java-devs/</link><guid isPermaLink="true">https://blogs.jsbisht.com/blog/ai-embeddings-explained-for-java-devs/</guid><description>Embeddings are the foundation of semantic search, RAG, and most production AI features. This post explains what they are, what they look like, and why they matter — without the maths.</description><pubDate>Tue, 03 Mar 2026 04:30:00 GMT</pubDate><category>spring-ai</category><category>ai-concepts</category><category>java</category></item><item><title>Spring Boot 3 to Spring Boot 4 migration guide</title><link>https://blogs.jsbisht.com/blog/spring-boot-3-to-4-migration-guide/</link><guid isPermaLink="true">https://blogs.jsbisht.com/blog/spring-boot-3-to-4-migration-guide/</guid><description>Spring Boot 4.0 is a major version upgrade that drops Java 8/11 support, ships Jackson 3, removes Undertow, and cleans out years of deprecated APIs. This post walks you through a phased migration plan, every common breakage, and a rollback-safe rollout strategy.</description><pubDate>Tue, 03 Mar 2026 03:30:00 GMT</pubDate><category>springboot</category><category>spring</category><category>java</category></item><item><title>Java 25: What&apos;s new in the latest LTS release</title><link>https://blogs.jsbisht.com/blog/java-25-new-features/</link><guid isPermaLink="true">https://blogs.jsbisht.com/blog/java-25-new-features/</guid><description>Java 25 is the new Long-Term Support release, shipping seven finalized language and library features alongside significant performance improvements. This post covers every JEP that matters for Java application developers.</description><pubDate>Tue, 03 Mar 2026 02:30:00 GMT</pubDate><category>java</category><category>java25</category></item><item><title>Streaming LLM responses in Spring AI for a better user experience</title><link>https://blogs.jsbisht.com/blog/spring-ai-streaming-responses/</link><guid isPermaLink="true">https://blogs.jsbisht.com/blog/spring-ai-streaming-responses/</guid><description>LLMs generate text token by token. Streaming lets your users see that text as it arrives instead of staring at a loading spinner. This post shows how to wire Spring AI&apos;s stream() to a Server-Sent Events endpoint.</description><pubDate>Mon, 02 Mar 2026 16:30:00 GMT</pubDate><category>spring-ai</category><category>springboot</category><category>java</category></item><item><title>Getting structured JSON responses from LLMs in Spring AI</title><link>https://blogs.jsbisht.com/blog/spring-ai-structured-output/</link><guid isPermaLink="true">https://blogs.jsbisht.com/blog/spring-ai-structured-output/</guid><description>LLMs return free-form text by default. Spring AI&apos;s structured output support maps that text directly into Java records and classes — no manual JSON parsing, no fragile string manipulation.</description><pubDate>Mon, 02 Mar 2026 16:10:00 GMT</pubDate><category>spring-ai</category><category>java</category><category>json</category></item><item><title>Prompt templates in Spring AI — stop hardcoding your prompts</title><link>https://blogs.jsbisht.com/blog/spring-ai-prompt-templates/</link><guid isPermaLink="true">https://blogs.jsbisht.com/blog/spring-ai-prompt-templates/</guid><description>Hardcoded prompt strings in Java code are hard to review, impossible to change without a redeploy, and a maintenance nightmare at scale. Spring AI&apos;s PromptTemplate solves this. Here is how to use it properly.</description><pubDate>Mon, 02 Mar 2026 15:50:00 GMT</pubDate><category>spring-ai</category><category>prompt-engineering</category><category>java</category></item><item><title>Understanding Spring AI&apos;s ChatClient — the heart of every AI call</title><link>https://blogs.jsbisht.com/blog/spring-ai-chat-client-deep-dive/</link><guid isPermaLink="true">https://blogs.jsbisht.com/blog/spring-ai-chat-client-deep-dive/</guid><description>ChatClient is the central abstraction in Spring AI. This post covers the builder API, default system prompts, per-call options, advisors, and the difference between call() and stream() — everything you need to use it effectively.</description><pubDate>Mon, 02 Mar 2026 15:30:00 GMT</pubDate><category>springboot</category><category>spring-ai</category><category>java</category></item><item><title>Setting up Spring AI in a Spring Boot project — step by step</title><link>https://blogs.jsbisht.com/blog/spring-ai-getting-started-setup/</link><guid isPermaLink="true">https://blogs.jsbisht.com/blog/spring-ai-getting-started-setup/</guid><description>Module 2 starts with code. This post walks through adding Spring AI to a Spring Boot project, configuring OpenAI and Ollama, and making your first real LLM API call from Java.</description><pubDate>Mon, 02 Mar 2026 15:10:00 GMT</pubDate><category>springboot</category><category>spring-ai</category><category>java</category></item><item><title>Prompt engineering basics every developer needs before writing any code</title><link>https://blogs.jsbisht.com/blog/ai-prompt-engineering-basics-for-developers/</link><guid isPermaLink="true">https://blogs.jsbisht.com/blog/ai-prompt-engineering-basics-for-developers/</guid><description>A prompt is not just a question — it is an instruction set. This post covers the anatomy of effective prompts, zero-shot vs few-shot prompting, chain-of-thought reasoning, and the most common mistakes developers make when writing their first prompts.</description><pubDate>Mon, 02 Mar 2026 14:50:00 GMT</pubDate><category>java</category><category>llm</category><category>prompt-engineering</category></item><item><title>Choosing an AI model for your Java application — OpenAI, Anthropic, or local</title><link>https://blogs.jsbisht.com/blog/ai-openai-vs-anthropic-vs-ollama-for-java-devs/</link><guid isPermaLink="true">https://blogs.jsbisht.com/blog/ai-openai-vs-anthropic-vs-ollama-for-java-devs/</guid><description>With Spring AI abstracting the model layer, switching providers is mostly a config change. The harder question is which model to pick for your use case. This post gives you a practical comparison and a decision guide.</description><pubDate>Mon, 02 Mar 2026 14:30:00 GMT</pubDate><category>java</category><category>llm</category><category>spring-ai</category><category>ollama</category></item><item><title>Temperature, top-p, and model parameters — what to actually set</title><link>https://blogs.jsbisht.com/blog/ai-model-parameters-temperature-explained/</link><guid isPermaLink="true">https://blogs.jsbisht.com/blog/ai-model-parameters-temperature-explained/</guid><description>Temperature is not magic. It is a dial that controls randomness. This post explains temperature, top-p, max tokens, and system vs user prompts in plain terms — with concrete recommendations for different use cases.</description><pubDate>Mon, 02 Mar 2026 14:10:00 GMT</pubDate><category>java</category><category>llm</category></item><item><title>Tokens and context windows — what every developer must understand</title><link>https://blogs.jsbisht.com/blog/ai-tokens-and-context-windows-explained/</link><guid isPermaLink="true">https://blogs.jsbisht.com/blog/ai-tokens-and-context-windows-explained/</guid><description>Tokens and context windows are not just billing details. They are hard engineering constraints that shape how you design prompts, manage conversation history, and build RAG pipelines. Here is everything you need to know.</description><pubDate>Mon, 02 Mar 2026 13:50:00 GMT</pubDate><category>java</category><category>llm</category><category>spring-ai</category></item><item><title>How LLMs work — a developer&apos;s mental model (no PhD required)</title><link>https://blogs.jsbisht.com/blog/ai-how-llms-work-for-developers/</link><guid isPermaLink="true">https://blogs.jsbisht.com/blog/ai-how-llms-work-for-developers/</guid><description>Before writing a single line of Spring AI code, you need to understand what an LLM actually is and how it behaves. This post builds the mental model that will inform every architectural decision you make.</description><pubDate>Mon, 02 Mar 2026 13:30:00 GMT</pubDate><category>java</category><category>llm</category><category>spring-ai</category></item><item><title>The AI project we will build throughout this course</title><link>https://blogs.jsbisht.com/blog/ai-for-java-devs-what-we-will-build/</link><guid isPermaLink="true">https://blogs.jsbisht.com/blog/ai-for-java-devs-what-we-will-build/</guid><description>Before diving into code, meet Dev — a Java developer who just got assigned an AI task — and see the complete architecture of what we build across all 8 modules of this course.</description><pubDate>Mon, 02 Mar 2026 13:20:00 GMT</pubDate><category>java</category><category>spring-ai</category></item><item><title>Why Java developers should care about AI engineering right now</title><link>https://blogs.jsbisht.com/blog/ai-for-java-devs-why-now/</link><guid isPermaLink="true">https://blogs.jsbisht.com/blog/ai-for-java-devs-why-now/</guid><description>AI engineering is no longer a research discipline. It is a set of API calls, prompt design, and system architecture — and Java developers are already equipped to do most of it. Here is why now is the right moment to start.</description><pubDate>Mon, 02 Mar 2026 13:00:00 GMT</pubDate><category>java</category><category>spring-ai</category><category>llm</category></item><item><title>Async context propagation improvements in Spring Boot 4.1</title><link>https://blogs.jsbisht.com/blog/spring-boot-4-1-async-context-propagation/</link><guid isPermaLink="true">https://blogs.jsbisht.com/blog/spring-boot-4-1-async-context-propagation/</guid><description>Spring Boot 4.1 improves how Micrometer observation context, security context, and MDC values carry over to async threads. Learn why context used to get lost, what changed, and how to configure it.</description><pubDate>Mon, 02 Mar 2026 12:35:00 GMT</pubDate><category>springboot</category><category>spring</category><category>java</category></item><item><title>Fine-grained Jackson configuration in Spring Boot 4.1</title><link>https://blogs.jsbisht.com/blog/spring-boot-4-1-jackson-read-write-properties/</link><guid isPermaLink="true">https://blogs.jsbisht.com/blog/spring-boot-4-1-jackson-read-write-properties/</guid><description>Spring Boot 4.1 adds dedicated spring.jackson.read.* and spring.jackson.write.* properties so you can control serialization and deserialization separately without touching Java code. Here&apos;s what changed and how to use it.</description><pubDate>Mon, 02 Mar 2026 12:15:00 GMT</pubDate><category>springboot</category><category>spring</category><category>java</category><category>jackson</category></item><item><title>JmsClient in Spring Boot 4.x for cleaner messaging code</title><link>https://blogs.jsbisht.com/blog/spring-boot-4-jmsclient-modern-jms-access/</link><guid isPermaLink="true">https://blogs.jsbisht.com/blog/spring-boot-4-jmsclient-modern-jms-access/</guid><description>Spring Boot 4.x adds auto-configuration for JmsClient, a modern alternative to JmsTemplate with a fluent API. Learn what made the old approach painful, what changed, and how to migrate.</description><pubDate>Mon, 02 Mar 2026 11:55:00 GMT</pubDate><category>springboot</category><category>spring</category><category>java</category></item><item><title>RestTestClient in Spring Boot 4.x for cleaner HTTP tests</title><link>https://blogs.jsbisht.com/blog/spring-boot-4-resttestclient-for-http-tests/</link><guid isPermaLink="true">https://blogs.jsbisht.com/blog/spring-boot-4-resttestclient-for-http-tests/</guid><description>Spring Boot 4.x introduces RestTestClient to simplify integration testing for HTTP endpoints. Learn what made testing friction-heavy before, what changed, and how to migrate your test setup.</description><pubDate>Mon, 02 Mar 2026 11:35:00 GMT</pubDate><category>springboot</category><category>spring</category><category>java</category></item><item><title>OpenTelemetry starter in Spring Boot 4.x for easier observability</title><link>https://blogs.jsbisht.com/blog/spring-boot-4-opentelemetry-starter-observability/</link><guid isPermaLink="true">https://blogs.jsbisht.com/blog/spring-boot-4-opentelemetry-starter-observability/</guid><description>Spring Boot 4.x adds a dedicated OpenTelemetry starter to reduce manual telemetry setup. This post covers old pain points, what changed, and how to migrate safely.</description><pubDate>Mon, 02 Mar 2026 11:11:39 GMT</pubDate><category>springboot</category><category>spring</category><category>java</category><category>rest-api</category></item><item><title>HTTP service clients in Spring Boot 4.x made simpler</title><link>https://blogs.jsbisht.com/blog/spring-boot-4-http-service-clients-simplified/</link><guid isPermaLink="true">https://blogs.jsbisht.com/blog/spring-boot-4-http-service-clients-simplified/</guid><description>Spring Boot 4.x improves support for HTTP service clients so you can replace repetitive RestTemplate code with cleaner, typed interfaces. Learn the old pain points, what changed, and a practical migration path.</description><pubDate>Mon, 02 Mar 2026 10:50:35 GMT</pubDate><category>springboot</category><category>spring</category><category>rest-api</category><category>java</category></item><item><title>API versioning in Spring Boot 4.x for safer REST upgrades</title><link>https://blogs.jsbisht.com/blog/spring-boot-4-api-versioning-for-safer-rest-upgrades/</link><guid isPermaLink="true">https://blogs.jsbisht.com/blog/spring-boot-4-api-versioning-for-safer-rest-upgrades/</guid><description>Spring Boot 4.x adds first-class API versioning support for Spring MVC and WebFlux. Learn the old pain points, what changed, and how this feature helps teams ship API changes with less risk.</description><pubDate>Mon, 02 Mar 2026 08:54:00 GMT</pubDate><category>springboot</category><category>spring</category><category>rest-api</category><category>java</category></item><item><title>Introduction to Lombok (Speeding-up Java development)</title><link>https://blogs.jsbisht.com/blog/introduction-to-lombok-speeding-up-java-development/</link><guid isPermaLink="true">https://blogs.jsbisht.com/blog/introduction-to-lombok-speeding-up-java-development/</guid><description>This blog post covers Project Lombok annotations — updated for Lombok 1.18.x with modern setup, new annotations like @With, @SuperBuilder, @Slf4j, and deprecation notes.</description><pubDate>Mon, 02 Mar 2026 05:00:00 GMT</pubDate><category>java</category><category>lombok</category></item><item><title>How to enable auto-configuration for custom spring-boot module</title><link>https://blogs.jsbisht.com/blog/spring-boot-auto-configuration-tutorial/</link><guid isPermaLink="true">https://blogs.jsbisht.com/blog/spring-boot-auto-configuration-tutorial/</guid><description>This blog post will explain how to enable auto-configuration for custom spring-boot module</description><pubDate>Wed, 30 Jun 2021 04:00:00 GMT</pubDate><category>java</category><category>springboot</category><category>spring</category></item><item><title>Azure Resource Owner Password Credentials flow</title><link>https://blogs.jsbisht.com/blog/azure-resource-owner-password-credentials-flow/</link><guid isPermaLink="true">https://blogs.jsbisht.com/blog/azure-resource-owner-password-credentials-flow/</guid><description>This blog post will demonstrates how to setup Resource Owner Password Credentials flow in Azure.</description><pubDate>Wed, 30 Sep 2020 04:00:00 GMT</pubDate><category>java</category><category>azure</category><category>azure-ad</category><category>ROPC</category></item><item><title>Spring security using OAuth2 with Microsoft AzureAD B2C</title><link>https://blogs.jsbisht.com/blog/spring-security-using-oauth2-with-azuread-b2c/</link><guid isPermaLink="true">https://blogs.jsbisht.com/blog/spring-security-using-oauth2-with-azuread-b2c/</guid><description>This blog post will explain how to configure AzureAD B2C tenant and integrate the same with Spring-Security OAuth2.</description><pubDate>Sat, 12 Sep 2020 04:00:00 GMT</pubDate><category>java</category><category>springboot</category><category>spring-security</category><category>oauth2</category><category>azure-b2c</category><category>spring</category></item><item><title>Spring security with JWT based login [Without OAuth]</title><link>https://blogs.jsbisht.com/blog/spring-security-with-jwt-token-based-login-without-oauth/</link><guid isPermaLink="true">https://blogs.jsbisht.com/blog/spring-security-with-jwt-token-based-login-without-oauth/</guid><description>This video tutorial demonstrates JWT based login using spring-security.</description><pubDate>Fri, 28 Aug 2020 04:00:00 GMT</pubDate><category>springboot</category><category>spring-security</category><category>jwt</category><category>java</category><category>spring</category></item><item><title>Spring security using OAuth2 with AngularJs [JWT]</title><link>https://blogs.jsbisht.com/blog/spring-security-using-oauth2-with-angular-js-jwt/</link><guid isPermaLink="true">https://blogs.jsbisht.com/blog/spring-security-using-oauth2-with-angular-js-jwt/</guid><description>This tutorial is an addition over my spring-security with angular JS video tutorial and will be focusing on the JWT token part.</description><pubDate>Sun, 23 Aug 2020 04:00:00 GMT</pubDate><category>java</category><category>springboot</category><category>spring-security</category><category>oauth2</category><category>angular-js</category><category>jwt</category><category>spring</category></item><item><title>Spring security using OAuth2 with AngularJs</title><link>https://blogs.jsbisht.com/blog/spring-security-using-oauth2-with-angular-js/</link><guid isPermaLink="true">https://blogs.jsbisht.com/blog/spring-security-using-oauth2-with-angular-js/</guid><description>This video tutorial demonstrates Spring-Security OAuth2 integration Angular JS 8.</description><pubDate>Fri, 26 Jun 2020 04:00:00 GMT</pubDate><category>java</category><category>springboot</category><category>spring-security</category><category>oauth2</category><category>angular-js</category><category>spring</category></item><item><title>Spring security using OAuth2 with Microsoft AzureAD</title><link>https://blogs.jsbisht.com/blog/spring-security-using-oauth2-with-azure-ad/</link><guid isPermaLink="true">https://blogs.jsbisht.com/blog/spring-security-using-oauth2-with-azure-ad/</guid><description>This blog post will demonstrates Spring-Security OAuth2 integration with Microsoft Azure AD.</description><pubDate>Sat, 11 Apr 2020 04:00:00 GMT</pubDate><category>java</category><category>springboot</category><category>spring-security</category><category>oauth2</category><category>azure-ad</category><category>spring</category></item><item><title>How to execute code on Spring application start-up</title><link>https://blogs.jsbisht.com/blog/how-to-execute-code-on-spring-application-start-up/</link><guid isPermaLink="true">https://blogs.jsbisht.com/blog/how-to-execute-code-on-spring-application-start-up/</guid><description>SpringFramework provides a way to perform some tasks at the time of application/context started.</description><pubDate>Tue, 25 Feb 2020 04:00:00 GMT</pubDate><category>spring</category><category>context-started</category><category>java</category><category>springboot</category></item><item><title>Custom Auto-Configuration in SpringBoot</title><link>https://blogs.jsbisht.com/blog/custom-auto-configuration-in-springboot/</link><guid isPermaLink="true">https://blogs.jsbisht.com/blog/custom-auto-configuration-in-springboot/</guid><description>This blog post will explain how to enable spring boot auto-configuration for your shared library/project.</description><pubDate>Tue, 18 Feb 2020 04:00:00 GMT</pubDate><category>java</category><category>springboot</category><category>spring</category><category>auto-configuration</category></item><item><title>Getting started with GraphQL (Java)</title><link>https://blogs.jsbisht.com/blog/getting-started-with-graphql/</link><guid isPermaLink="true">https://blogs.jsbisht.com/blog/getting-started-with-graphql/</guid><description>This blog post will guide you through GraphQL Java development</description><pubDate>Tue, 23 Jul 2019 04:00:00 GMT</pubDate><category>java</category><category>graphql</category><category>rest-api</category><category>blogs</category></item><item><title>Whats new in Java 10</title><link>https://blogs.jsbisht.com/blog/whats-new-in-java-10/</link><guid isPermaLink="true">https://blogs.jsbisht.com/blog/whats-new-in-java-10/</guid><description>Finally Java10 is available for GA. This blog will cover some of the new features introduced in java 10. e.g. Local Variable Type Inference, UnmodifiableCollections in java streams etc</description><pubDate>Wed, 21 Mar 2018 04:00:00 GMT</pubDate><category>java</category><category>java10</category><category>optional</category></item><item><title>Optional to stream in java 9</title><link>https://blogs.jsbisht.com/blog/optional-to-stream-in-java9/</link><guid isPermaLink="true">https://blogs.jsbisht.com/blog/optional-to-stream-in-java9/</guid><description>How to do optional as stream in java9</description><pubDate>Thu, 08 Mar 2018 04:00:00 GMT</pubDate><category>java</category><category>java9</category><category>collections</category><category>optional</category></item><item><title>How Dispatcher servlet gets registered in Spring java based config</title><link>https://blogs.jsbisht.com/blog/how-dispatcher-servlet-gets-registered-in-spring-java-based-config/</link><guid isPermaLink="true">https://blogs.jsbisht.com/blog/how-dispatcher-servlet-gets-registered-in-spring-java-based-config/</guid><description>This blog post will explain how Spring Web context gets registered in servlet context.</description><pubDate>Mon, 28 Aug 2017 04:00:00 GMT</pubDate><category>java</category><category>spring</category><category>spring-framework</category><category>servlet</category></item><item><title>Spring-Session Grails Plugin (Part 3)</title><link>https://blogs.jsbisht.com/blog/spring-session-grails-plugin-part-3/</link><guid isPermaLink="true">https://blogs.jsbisht.com/blog/spring-session-grails-plugin-part-3/</guid><description>Part 3 of &quot;Spring Session Grails Plugin&quot; series. This blog series will cover JDBC Data store.</description><pubDate>Thu, 30 Mar 2017 04:00:00 GMT</pubDate><category>grails</category><category>java</category><category>spring-session</category><category>blogs</category></item><item><title>Spring-Session Grails Plugin (Part 2)</title><link>https://blogs.jsbisht.com/blog/spring-session-grails-plugin-part-2/</link><guid isPermaLink="true">https://blogs.jsbisht.com/blog/spring-session-grails-plugin-part-2/</guid><description>Part 2 of &quot;Spring Session Grails Plugin&quot; series. This blog series will cover Mongo Data store.</description><pubDate>Wed, 01 Feb 2017 04:00:00 GMT</pubDate><category>grails</category><category>java</category><category>spring-session</category><category>blogs</category></item><item><title>Spring-Session Grails Plugin (Part 1)</title><link>https://blogs.jsbisht.com/blog/spring-session-grails-plugin/</link><guid isPermaLink="true">https://blogs.jsbisht.com/blog/spring-session-grails-plugin/</guid><description>Part 1 of &quot;Spring Session Grails Plugin&quot; series. This blog series will cover Introduction, Installation and Redis Datastore.</description><pubDate>Thu, 15 Dec 2016 04:00:00 GMT</pubDate><category>grails</category><category>java</category><category>spring-session</category><category>blogs</category></item><item><title>Deserialize json with Java parameterized constructor</title><link>https://blogs.jsbisht.com/blog/deserialize-json-with-java-parameterized-constructor/</link><guid isPermaLink="true">https://blogs.jsbisht.com/blog/deserialize-json-with-java-parameterized-constructor/</guid><description>In this blog post we are going to learn how to deserialize json into Java class which doesn&apos;t have default constructor.</description><pubDate>Mon, 12 Sep 2016 18:17:25 GMT</pubDate><category>jackson</category><category>java</category><category>json</category><category>blogs</category></item><item><title>JSON deserialize generic types using Gson and Jackson</title><link>https://blogs.jsbisht.com/blog/json-deserialize-generic-types-using-gson-and-jackson/</link><guid isPermaLink="true">https://blogs.jsbisht.com/blog/json-deserialize-generic-types-using-gson-and-jackson/</guid><description>In this blog post we are going to learn how to deserialize json into java generic types.</description><pubDate>Wed, 07 Sep 2016 18:17:25 GMT</pubDate><category>gson</category><category>jackson</category><category>java</category><category>json</category><category>blogs</category></item></channel></rss>