<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Preet Shah Blog</title>
        <link>https://shahpreetk.com/blog</link>
        <description>Preet Shah Blog</description>
        <lastBuildDate>Sat, 12 Oct 2024 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <item>
            <title><![CDATA[Git Tips and Tricks]]></title>
            <link>https://shahpreetk.com/blog/git-tips-and-tricks</link>
            <guid>https://shahpreetk.com/blog/git-tips-and-tricks</guid>
            <pubDate>Sat, 12 Oct 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[A collection of useful Git tips and tricks to enhance your workflow and productivity.]]></description>
            <content:encoded><![CDATA[<p>Git is an essential tool for developers, providing a robust version control system that facilitates code management, collaboration, and version tracking. While many developers use Git daily, mastering some advanced features can significantly improve your workflow and productivity. In this article, we’ll cover some handy Git tips and tricks that can streamline your development process.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="efficiently-managing-commits-with-git-rebase">Efficiently Managing Commits with <code>git rebase</code><a href="https://shahpreetk.com/blog/git-tips-and-tricks#efficiently-managing-commits-with-git-rebase" class="hash-link" aria-label="Direct link to efficiently-managing-commits-with-git-rebase" title="Direct link to efficiently-managing-commits-with-git-rebase">​</a></h3>
<p>Rebasing is one of Git’s most powerful features, allowing you to clean up and restructure your commit history. It helps you keep your commit timeline more concise by combining or reordering commits, making the project history easier to understand and maintain.</p>
<p>Here’s a basic example of how to rebase your feature branch onto the latest state of the <code>main</code> branch:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">git checkout main</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">git pull --all</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">git checkout &lt;feature-branch&gt;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">git rebase -i main</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>This command opens an interactive rebase session (<code>-i</code>), where you can choose to squash, reorder, or edit individual commits. In the interactive rebase editor, you’ll see options like <code>pick</code>, <code>reword</code>, <code>squash</code>, and <code>edit</code>, giving you control over how each commit should be handled.</p>
<p>Once you’ve made your adjustments, save and close the editor (<code>Esc</code>, followed by <code>:wq</code>). If there are no conflicts, Git will automatically reapply your changes on top of the <code>main</code> branch.</p>
<p>However, if conflicts arise during the rebase process, Git will pause and allow you to resolve them manually. After resolving conflicts, use:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">git rebase --continue</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Repeat this process until the rebase is complete. Once finished, you’ll see a message like <code>Successfully rebased....</code> At this point, you’ll need to push your changes with a force push:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">git push origin &lt;feature-branch&gt; --force</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>This is necessary because you have rewritten the commit history, and a standard push would result in conflicts.</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="why-use-rebasing">Why Use Rebasing?<a href="https://shahpreetk.com/blog/git-tips-and-tricks#why-use-rebasing" class="hash-link" aria-label="Direct link to Why Use Rebasing?" title="Direct link to Why Use Rebasing?">​</a></h4>
<p>The primary advantage of rebasing is maintaining a cleaner and linear commit history. Instead of creating "merge commits" that branch off, rebasing applies your commits directly on top of the target branch, creating a straight line of progress. This makes it easier to follow the evolution of the project and track changes back to their origins without needing to navigate through branches and merge commits.</p>
<div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>warning</div><div class="admonitionContent_BuS1"><p>Be cautious when using git rebase in a shared branch. Since rebasing rewrites commit history, any collaborators who have pulled the original commit history will encounter issues. Only force-push after a rebase when you are sure others aren’t depending on your branch.</p></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="using-git-bisect-to-find-bugs">Using <code>git bisect</code> to Find Bugs<a href="https://shahpreetk.com/blog/git-tips-and-tricks#using-git-bisect-to-find-bugs" class="hash-link" aria-label="Direct link to using-git-bisect-to-find-bugs" title="Direct link to using-git-bisect-to-find-bugs">​</a></h3>
<p>When you're trying to locate the commit that introduced a bug in a large codebase, <code>git bisect</code> is incredibly useful. It performs a binary search through your commit history to pinpoint where things went wrong.</p>
<p>To use <code>git bisect</code>:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">git bisect start</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">git bisect bad #mark the current commit as bad</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">git bisect good &lt;commit-SHA&gt; #mark a known good commit (like a tag or SHA)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Git will start checking commits between the good and bad points, allowing you to test each one. You can mark each commit as "good" or "bad" until you find the problematic commit. After you’ve found it:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">git bisect reset</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="using-git-reflog-to-recover-lost-commits">Using <code>git reflog</code> to Recover Lost Commits<a href="https://shahpreetk.com/blog/git-tips-and-tricks#using-git-reflog-to-recover-lost-commits" class="hash-link" aria-label="Direct link to using-git-reflog-to-recover-lost-commits" title="Direct link to using-git-reflog-to-recover-lost-commits">​</a></h3>
<p><code>git reflog</code> keeps a log of every action you’ve taken in Git, even after commits are deleted or reset. It’s useful for recovering commits that you may have thought were lost.</p>
<p>For example, if you accidentally reset a branch or force-pushed to the wrong branch, you can find your lost commits with:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">git reflog</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Once you find the SHA of the lost commit, you can restore it with:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">git checkout &lt;commit-SHA&gt;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="cherry-picking-specific-commits-git-cherry-pick">Cherry-Picking Specific Commits (<code>git cherry-pick</code>)<a href="https://shahpreetk.com/blog/git-tips-and-tricks#cherry-picking-specific-commits-git-cherry-pick" class="hash-link" aria-label="Direct link to cherry-picking-specific-commits-git-cherry-pick" title="Direct link to cherry-picking-specific-commits-git-cherry-pick">​</a></h3>
<p>If you need to apply a specific commit from one branch to another without merging the entire branch, you can use <code>git cherry-pick</code>. This command applies individual commits to your current branch:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">git cherry-pick &lt;commit-SHA&gt;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>To get the commit-SHA of a commit, you can use <code>git log --oneline</code>. Copy the SHA of the commit you want to cherry-pick and use it in the command above.</p></div></div>
<p>This is helpful when you need to bring over a bug fix or a feature that’s present in one branch but not another.</p>]]></content:encoded>
            <category>git</category>
            <category>version-control</category>
            <category>productivity</category>
            <category>github</category>
        </item>
        <item>
            <title><![CDATA[Java Spring Boot Project - Part 3]]></title>
            <link>https://shahpreetk.com/blog/setting-up-a-java-spring-boot-project-part-3</link>
            <guid>https://shahpreetk.com/blog/setting-up-a-java-spring-boot-project-part-3</guid>
            <pubDate>Tue, 11 Jun 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[In this blog post, we will write unit tests for the CRUD operations using JUnit and Mockito. We will also create API documentation using [Swagger](https://swagger.io/) and update our codebase with exception handling.]]></description>
            <content:encoded><![CDATA[<p>In the previous blog post, we used Lombok to reduce boilerplate code and added CRUD operations to our Spring Boot project. In this blog post, we will write unit tests for the CRUD operations using JUnit and Mockito. We will also create API documentation using <a href="https://swagger.io/" target="_blank" rel="noopener noreferrer">Swagger</a> and update our codebase with exception handling.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="custom-exception-handling">Custom Exception Handling<a href="https://shahpreetk.com/blog/setting-up-a-java-spring-boot-project-part-3#custom-exception-handling" class="hash-link" aria-label="Direct link to Custom Exception Handling" title="Direct link to Custom Exception Handling">​</a></h2>
<p>Custom exception handling is invaluable as it allows us to define and throw exceptions specific to our application's needs. By creating custom exceptions, we can handle specific conditions and scenarios more effectively. This not only makes our codebase cleaner and more maintainable but also simplifies debugging by providing clear, meaningful error messages. Additionally, custom exceptions enhance the user experience by offering precise and understandable feedback when errors occur.</p>
<p>We will create a custom exception class named <code>BookNotFoundException</code> that extends the <code>RuntimeException</code> class. This exception will be unchecked, meaning it occurs at runtime. It will be thrown when a user searches for or attempts to update a book that is not found in the database.</p>
<table><thead><tr><th><img decoding="async" loading="lazy" alt="BookNotFoundException Class" src="https://shahpreetk.com/assets/images/book-not-found-exception-b4789ba49cd80d2152e5ac800bfa2d21.png" width="1738" height="536" class="img_ev3q"></th></tr></thead></table>
<p>Update the <code>updateBook(int id, Book updatedBook)</code> method in the <code>BookService</code> class to throw a <code>BookNotFoundException</code> if the book is not found in the database.</p>
<div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">  public Book updateBook(int id, Book updatedBook) {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      if (updatedBook.getId() != id) {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          throw new RuntimeException("The ID in the request body does not match the ID in the URL.");</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      Optional&lt;Book&gt; optionalBook = bookLibraryRepository.findById(id);</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      if (optionalBook.isPresent()) {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          Book existingBook = optionalBook.get();</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          existingBook.setName(updatedBook.getName());</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          existingBook.setAuthor(updatedBook.getAuthor());</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          existingBook.setDescription(updatedBook.getDescription());</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          return bookLibraryRepository.save(existingBook);</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      } else {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          throw new BookNotFoundException(id);</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  }</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>If we run the application and attempt to update a book that does not exist in the database, a <code>BookNotFoundException</code> will be thrown, displaying a message in the console logs indicating that the book was not found. However, the response displayed in Hoppscotch.io will still be unclear and generic.</p>
<p>To provide a more user-friendly message in the response body, we need to create a custom error response class. This class will contain the error message and status code that will be returned to the user when an exception occurs.</p>
<p>Create a new class named <code>CustomExceptionHandler</code>. This class will be annotated with <code>@ControllerAdvice</code> and will contain methods to handle specific exceptions. In this case, we will create a method to handle the <code>BookNotFoundException</code>.</p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p><code>@ControllerAdvice</code> in Spring is an annotation used to handle exceptions globally across all controllers. It allows you to define common exception handling logic in one place, ensuring consistent error responses throughout your application. Additionally, you can use it to add global attributes and configure data binding for all controllers, making your code cleaner and easier to maintain.</p></div></div>
<table><thead><tr><th><img decoding="async" loading="lazy" alt="CustomExceptionHandler Class" src="https://shahpreetk.com/assets/images/custom-exception-handler-480d7351d4c12d55178f773d551cd529.png" width="1844" height="1590" class="img_ev3q"></th></tr></thead></table>
<p>Re-run the application and attempt to update a book that does not exist in the database. The response will now include a custom error message indicating that the book was not found.</p>
<table><thead><tr><th><img decoding="async" loading="lazy" alt="Hoppscotch.io BookNotFound error" src="https://shahpreetk.com/assets/images/hoppscotch-book-not-found-176cc12c774a4f196e48630b42db574e.png" width="2146" height="1166" class="img_ev3q"></th></tr></thead></table>
<p>Similarly, you can create custom exception classes and handlers for other scenarios in your application. For example, I have implemented a service and controller method to GET a book by its ID and used the <code>BookNotFoundException</code> to handle cases where the book is not found in the database. You can check the Service class on my <a href="https://github.com/shahpreetk/java-spring-boot-book-library/blob/main/src/main/java/com/shahpreetk/javaSpringBootBookLibrary/service/BookLibraryService.java" target="_blank" rel="noopener noreferrer">GitHub repository</a>.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="api-documentation-with-swagger">API Documentation with Swagger<a href="https://shahpreetk.com/blog/setting-up-a-java-spring-boot-project-part-3#api-documentation-with-swagger" class="hash-link" aria-label="Direct link to API Documentation with Swagger" title="Direct link to API Documentation with Swagger">​</a></h2>
<p>API documentation is essential for developers using your API. It provides detailed information about the endpoints, request and response formats, error codes, and other relevant details. By creating API documentation, you make it easier for developers to understand and interact with your API, reducing the learning curve and enabling faster integration.</p>
<p><a href="https://swagger.io/" target="_blank" rel="noopener noreferrer">Swagger</a> is a popular tool for generating API documentation. It allows you to define your API using the OpenAPI Specification (formerly known as Swagger Specification) and automatically generates interactive documentation based on your API definition. Swagger provides a user-friendly interface that displays all your endpoints, request and response formats, and other details in an organized and visually appealing manner.</p>
<p>To generate the Swagger documentation for our Spring Boot project, we will use the <code>springdoc-openapi</code> library. This library integrates Swagger with Spring Boot v3, allowing you to create API documentation easily and efficiently. Add the following code to the <code>build.gradle</code> file.</p>
<div class="language-groovy codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-groovy codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">  implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.5.0'</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Run the application and navigate to <a href="http://localhost:8080/v3/api-docs" target="_blank" rel="noopener noreferrer">http://localhost:8080/v3/api-docs</a> to view the generated OpenAPI JSON documentation.</p>
<table><thead><tr><th><img decoding="async" loading="lazy" alt="OpenAPI JSON documentation" src="https://shahpreetk.com/assets/images/open-api-json-docs-a55c3e846ee9cfb15f2b6ca85bc2e950.png" width="1826" height="1716" class="img_ev3q"></th></tr></thead></table>
<p>You can now navigate to <a href="http://localhost:8080/swagger-ui.html" target="_blank" rel="noopener noreferrer">http://localhost:8080/swagger-ui.html</a> to view the Swagger UI interface, which offers an interactive documentation view of your API. The springdoc-openapi library includes Swagger UI out-of-the-box, so no additional setup is required. Currently, since we haven't added any custom annotations or descriptions to our endpoints, Swagger UI will display the default information based on the request and response objects. To enhance the documentation, you can add custom annotations and descriptions to your controllers and endpoints. You can check the Swagger code on my <a href="https://github.com/shahpreetk/java-spring-boot-book-library/blob/main/src/main/java/com/shahpreetk/javaSpringBootBookLibrary/documentation/OpenAPIConfiguration.java" target="_blank" rel="noopener noreferrer">GitHub repository</a>.</p>
<table><thead><tr><th><img decoding="async" loading="lazy" alt="Swagger UI interface" src="https://shahpreetk.com/assets/images/swagger-interface-a56c6099393509d98ebca814f45fc71d.png" width="2876" height="1794" class="img_ev3q"></th></tr></thead></table>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="unit-testing-with-junit-and-mockito">Unit Testing with JUnit and Mockito<a href="https://shahpreetk.com/blog/setting-up-a-java-spring-boot-project-part-3#unit-testing-with-junit-and-mockito" class="hash-link" aria-label="Direct link to Unit Testing with JUnit and Mockito" title="Direct link to Unit Testing with JUnit and Mockito">​</a></h2>
<p>Unit testing is a critical aspect of software development. It allows you to test individual units or components of your codebase in isolation, ensuring that each unit functions correctly and meets the specified requirements. By writing unit tests, you can identify bugs and issues early in the development process, improve code quality, and increase the reliability and maintainability of your application.</p>
<p>We will use <a href="https://site.mockito.org/" target="_blank" rel="noopener noreferrer">Mockito</a> to mock dependencies and <a href="https://junit.org/junit5/" target="_blank" rel="noopener noreferrer">JUnit</a> to write test cases for our service and controller classes. Mockito is a popular mocking framework that allows you to create mock objects for dependencies, enabling you to test your code in isolation. JUnit is a widely used testing framework for Java that provides annotations and assertions to write test cases and validate the behavior of your code.</p>
<p>For the Controller class, we will write test cases using <code>MockMvc</code> to test the CRUD operations. MockMvc is a Spring testing framework that allows you to test Spring MVC controllers without starting a full HTTP server. It provides a fluent API for making requests and validating responses, making it easy to write comprehensive tests for your controllers.</p>
<p>Create a <code>BookLibraryControllerTest</code> class in the <code>src/test/java/com/example/booklibrary/controller</code> package.</p>
<div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">package com.shahpreetk.javaSpringBootBookLibrary.controller;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">import com.shahpreetk.javaSpringBootBookLibrary.Book;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">import com.shahpreetk.javaSpringBootBookLibrary.exceptions.BookNotFoundException;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">import com.shahpreetk.javaSpringBootBookLibrary.exceptions.CustomExceptionHandler;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">import com.shahpreetk.javaSpringBootBookLibrary.service.BookLibraryService;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">import org.junit.jupiter.api.BeforeEach;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">import org.junit.jupiter.api.Test;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">import org.mockito.InjectMocks;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">import org.mockito.Mock;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">import org.mockito.MockitoAnnotations;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">import org.springframework.http.MediaType;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">import org.springframework.test.web.servlet.MockMvc;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">import org.springframework.test.web.servlet.setup.MockMvcBuilders;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">import java.util.List;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">import static org.hamcrest.Matchers.hasSize;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">import static org.mockito.ArgumentMatchers.any;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">import static org.mockito.ArgumentMatchers.anyInt;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">import static org.mockito.Mockito.when;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">public class BookLibraryControllerTest {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    private MockMvc mockMvc;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    @Mock</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    private BookLibraryService bookLibraryService;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    @InjectMocks</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    private BookLibraryController bookLibraryController;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    @BeforeEach</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    public void setUp() {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        MockitoAnnotations.openMocks(this);</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        mockMvc = MockMvcBuilders.standaloneSetup(bookLibraryController)</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">                .setControllerAdvice(new CustomExceptionHandler())</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">                .build();</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    private Book createBook(int id, String name, String author, String description) {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        Book book = new Book();</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        book.setId(id);</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        book.setName(name);</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        book.setAuthor(author);</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        book.setDescription(description);</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        return book;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    @Test</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    public void testGetAllBooks() throws Exception {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        Book book1 = createBook(1, "Book1", "Author1", "Description1");</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        Book book2 = createBook(2, "Book2", "Author2", "Description2");</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        List&lt;Book&gt; books = List.of(book1, book2);</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        when(bookLibraryService.getAllBooks()).thenReturn(books);</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        mockMvc.perform(get("/api/books"))</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">                .andExpect(status().isOk())</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">                .andExpect(jsonPath("$", hasSize(2)))</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">                .andExpect(jsonPath("$[0].id").value(1))</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">                .andExpect(jsonPath("$[0].name").value("Book1"))</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">                .andExpect(jsonPath("$[0].author").value("Author1"))</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">                .andExpect(jsonPath("$[0].description").value("Description1"))</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">                .andExpect(jsonPath("$[1].id").value(2))</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">                .andExpect(jsonPath("$[1].name").value("Book2"))</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">                .andExpect(jsonPath("$[1].author").value("Author2"))</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">                .andExpect(jsonPath("$[1].description").value("Description2"));</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>In the <code>BookLibraryControllerTest</code> class, we have created a test case for the <code>getAllBooks()</code> method in the <code>BookLibraryController</code> class. We have mocked the <code>BookLibraryService</code> dependency using Mockito and defined the behavior of the <code>getAllBooks()</code> method to return a list of books. We then use MockMvc to perform a GET request to the <code>/api/books</code> endpoint and validate the response using assertions.</p>
<p>You can write similar test cases for other controller methods and service classes to ensure that your code functions correctly and handles various scenarios effectively. You can find more tests for the Controller on my <a href="https://github.com/shahpreetk/java-spring-boot-book-library/blob/main/src/test/java/com/shahpreetk/javaSpringBootBookLibrary/controller/BookLibraryControllerTest.java" target="_blank" rel="noopener noreferrer">GitHub repository</a>.</p>
<div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">package com.shahpreetk.javaSpringBootBookLibrary.service;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">import com.shahpreetk.javaSpringBootBookLibrary.Book;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">import com.shahpreetk.javaSpringBootBookLibrary.BookLibraryRepository;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">import com.shahpreetk.javaSpringBootBookLibrary.exceptions.BookNotFoundException;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">import org.junit.jupiter.api.BeforeEach;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">import org.junit.jupiter.api.Test;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">import org.mockito.InjectMocks;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">import org.mockito.Mock;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">import org.mockito.MockitoAnnotations;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">import java.util.List;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">import java.util.Optional;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">import static org.junit.jupiter.api.Assertions.assertEquals;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">import static org.junit.jupiter.api.Assertions.assertThrows;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">import static org.mockito.ArgumentMatchers.any;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">import static org.mockito.Mockito.when;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">public class BookLibraryServiceTest {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    @Mock</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    private BookLibraryRepository bookLibraryRepository;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    @InjectMocks</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    private BookLibraryService bookLibraryService;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    @BeforeEach</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    public void setUp() {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        MockitoAnnotations.openMocks(this);</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    private Book createBook(int id, String name, String author, String description) {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        Book book = new Book();</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        book.setId(id);</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        book.setName(name);</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        book.setAuthor(author);</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        book.setDescription(description);</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        return book;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    @Test</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    public void testGetAllBooks() {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        Book book1 = createBook(1, "Book1", "Author1", "Description1");</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        Book book2 = createBook(2, "Book2", "Author2", "Description2");</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        when(bookLibraryRepository.findAll()).thenReturn(java.util.List.of(book1, book2));</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        List&lt;Book&gt; result = bookLibraryService.getAllBooks();</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        assertEquals(2, result.size());</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        assertEquals("Book1", result.getFirst().getName());</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        assertEquals("Author1", result.get(0).getAuthor());</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        assertEquals("Description1", result.get(0).getDescription());</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        assertEquals("Book2", result.get(1).getName());</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        assertEquals("Author2", result.get(1).getAuthor());</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        assertEquals("Description2", result.get(1).getDescription());</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><code>@Mock</code> annotation is used to create and initialize mock instances of the fields it is applied to. When a field is annotated with <code>@Mock</code>, Mockito will create a mock implementation of that field which can then be used in your tests to simulate the behavior of the actual dependency. This allows you to define how the mock should behave when certain methods are called, without actually invoking the real methods. It's particularly useful for isolating the class under test from its dependencies.</p>
<p><code>@InjectMocks</code> annotation is used to create an instance of the class under test and inject the mock dependencies into it. When a class field is annotated with <code>@InjectMocks</code>, Mockito will automatically inject the mocks created with <code>@Mock (or @Spy)</code> into this instance. This simplifies the setup process by automatically performing dependency injection, ensuring that the class under test is properly initialized with all its dependencies mocked. This allows you to focus on testing the behavior of the class without worrying about the initialization of its dependencies.</p>
<p><code>MockitoAnnotations.openMocks(this)</code> is a method used in Mockito to initialize the mocks and inject them into the annotated fields of the test class. This method is typically used in the <code>@BeforeEach</code> setup method to ensure that the mocks are properly set up before each test case runs.</p>
<p>You can write similar test cases for other service methods to ensure that your code functions correctly and handles various scenarios effectively. You can find the entire test suite on my <a href="https://github.com/shahpreetk/java-spring-boot-book-library/tree/main/src/test/java/com/shahpreetk/javaSpringBootBookLibrary" target="_blank" rel="noopener noreferrer">GitHub repository</a>.</p>
<p>This is how you can write unit tests for your Spring Boot application using JUnit and Mockito, create API documentation using Swagger, and update your codebase with custom exception handling. By following these best practices, you can improve the quality, reliability, and maintainability of your codebase, making it easier to develop, test, and deploy your applications.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="things-you-can-learn-next-intermediate-to-advanced">Things You Can Learn Next (Intermediate to Advanced)<a href="https://shahpreetk.com/blog/setting-up-a-java-spring-boot-project-part-3#things-you-can-learn-next-intermediate-to-advanced" class="hash-link" aria-label="Direct link to Things You Can Learn Next (Intermediate to Advanced)" title="Direct link to Things You Can Learn Next (Intermediate to Advanced)">​</a></h2>
<p>As you continue to develop your Book Library application, here are some advanced topics you can explore to enhance its functionality and performance:</p>
<ul>
<li><strong>Add Actuator Endpoints:</strong> Expose health and metrics endpoints to monitor and manage your application more effectively.</li>
<li><strong>Creating Docker Setup:</strong> Containerize your Book Library app for easier deployment and scalability using Docker.</li>
<li><strong>Deploying to a Cloud Platform:</strong> Learn how to deploy your Spring Boot application to cloud platforms like AWS, Azure, or Google Cloud.</li>
<li><strong>Implementing Logging:</strong> Enhance your application with effective logging strategies to monitor and debug more efficiently.</li>
<li><strong>Add Authentication and Authorization:</strong> Protect your endpoints and enhance API security by implementing authentication and authorization mechanisms.</li>
<li><strong>Add Features like Pagination, Sorting, and Rate Limiting:</strong> Improve your API by adding advanced features such as pagination, sorting, and rate limiting.</li>
<li><strong>Implement Caching:</strong> Boost performance by implementing caching strategies to reduce load times and database queries.</li>
<li><strong>Add Internationalization (i18n):</strong> Make your application accessible to a global audience by adding support for multiple languages.</li>
</ul>
<p>These topics will help you take your Book Library application to the next level, ensuring it is robust, secure, and scalable.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="conclusion">Conclusion<a href="https://shahpreetk.com/blog/setting-up-a-java-spring-boot-project-part-3#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion">​</a></h2>
<p>In this three-part blog series, we explored building a Book Library application with Java Spring Boot. We started with project setup and dependencies, then used Lombok for simplifying entity classes and implemented CRUD operations. Finally, we covered unit testing and custom exception handling, emphasizing their importance for robust application development. By following these steps, you’ve created a scalable and maintainable Spring Boot application.</p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>For the complete codebase, visit my <a href="https://github.com/shahpreetk/java-spring-boot-book-library" target="_blank" rel="noopener noreferrer">GitHub repository</a>.</p></div></div>
<p>Happy coding! 🚀</p>]]></content:encoded>
            <category>java</category>
            <category>springboot</category>
            <category>intellij</category>
            <category>exception-handling</category>
            <category>custom-errors</category>
            <category>swagger</category>
            <category>api-documentation</category>
            <category>unit-testing</category>
            <category>junit</category>
        </item>
        <item>
            <title><![CDATA[Java Spring Boot Project - Part 2]]></title>
            <link>https://shahpreetk.com/blog/setting-up-a-java-spring-boot-project-part-2</link>
            <guid>https://shahpreetk.com/blog/setting-up-a-java-spring-boot-project-part-2</guid>
            <pubDate>Mon, 20 May 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[In this blog post, we use lombok to create the Book Entity class. We will then create a repository, service and controller class to perform CRUD operations on the Book Entity.]]></description>
            <content:encoded><![CDATA[<p>In the previous blog post, we covered the initial setup of a Book Library Project using Java Spring Boot. In this blog post, we will use Lombok to simplify the creation of the Book Entity class. We will then create a repository, service, and controller class to perform CRUD operations on the Book Entity.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="using-lombok-for-the-book-entity">Using Lombok for the Book Entity<a href="https://shahpreetk.com/blog/setting-up-a-java-spring-boot-project-part-2#using-lombok-for-the-book-entity" class="hash-link" aria-label="Direct link to Using Lombok for the Book Entity" title="Direct link to Using Lombok for the Book Entity">​</a></h2>
<p>Lombok is a library that helps reduce boilerplate code in Java classes by providing annotations to generate getters, setters, constructors, and other common methods automatically. In this blog post, we will leverage Lombok to simplify the creation of the Book Entity class in our Java Spring Boot project.</p>
<ul>
<li>
<p><strong>Step 1: Add Lombok Dependency</strong></p>
<p>To use Lombok in your project, you need to add the Lombok dependency to your <code>build.gradle</code> file. You can copy the latest version from the <a href="https://mvnrepository.com/artifact/org.projectlombok/lombok" target="_blank" rel="noopener noreferrer">Maven Central Repository</a> or add the following line in the <code>dependencies</code> block:</p>
<div class="language-groovy codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-groovy codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">compileOnly 'org.projectlombok:lombok:1.18.32'</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>After adding the dependency, sync your Gradle project to download the Lombok library.</p>
<table><thead><tr><th><img decoding="async" loading="lazy" alt="Sync Gradle project after adding Lombok" src="https://shahpreetk.com/assets/images/sync-gradle-project-2a33a8f4d168a169a2138bf179d6a541.png" width="1600" height="1308" class="img_ev3q"></th></tr></thead></table>
</li>
<li>
<p><strong>Step 2: Create the Book Entity Class</strong></p>
<p>The Lombok <code>@Getter</code> and <code>@Setter</code> annotations automatically generate getter and setter methods for the fields in a Java class. <code>@Getter</code> creates a public method to retrieve the value of a field, while <code>@Setter</code> creates a public method to set the value of a field. This reduces boilerplate code, making the class definitions cleaner and easier to read.</p>
<p>We will use these annotations to create the <code>Book</code> entity class. Open the <code>Book.java</code> file and add the following code:</p>
<table><thead><tr><th><img decoding="async" loading="lazy" alt="Book Class using Lombok" src="https://shahpreetk.com/assets/images/book-class-with-lombok-ef53c3ec47a80ff83e34a9ed30fe4a2b.png" width="674" height="622" class="img_ev3q"></th></tr></thead></table>
</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="get-all-books">Get All Books<a href="https://shahpreetk.com/blog/setting-up-a-java-spring-boot-project-part-2#get-all-books" class="hash-link" aria-label="Direct link to Get All Books" title="Direct link to Get All Books">​</a></h3>
<ul>
<li>
<p><strong>Step 3: Create the Book Repository</strong></p>
<p>Next, we will create a repository interface to interact with the <code>Book</code> entity. Create a new interface named <code>BookLibraryRepository</code> in the package and extend it with the <code>JpaRepository</code> interface provided by Spring Data JPA:</p>
<table><thead><tr><th><img decoding="async" loading="lazy" alt="Book Library Repository" src="https://shahpreetk.com/assets/images/book-repository-e28b3aee64d3b2e12d438891f38de066.png" width="1501" height="679" class="img_ev3q"></th></tr></thead></table>
</li>
<li>
<p><strong>Step 4: Create the Book Service</strong></p>
<p>Now, we will create a service class to handle business logic related to the <code>Book</code> entity. Create a new class named <code>BookLibraryService</code> in the <code>service</code> package and annotate it with <code>@Service</code>:</p>
<table><thead><tr><th><img decoding="async" loading="lazy" alt="Book Library Service" src="https://shahpreetk.com/assets/images/book-service-0c864470dbc202894615fc6c474a919d.png" width="848" height="563" class="img_ev3q"></th></tr></thead></table>
</li>
<li>
<p><strong>Step 5: Create the Book Controller</strong></p>
<p>Finally, we will create a controller class to expose RESTful endpoints for CRUD operations on the <code>Book</code> entity. Create a new class named <code>BookLibraryController</code> in the <code>controller</code> package and annotate it with <code>@RestController</code>:</p>
<table><thead><tr><th><img decoding="async" loading="lazy" alt="Book Library Controller" src="https://shahpreetk.com/assets/images/book-controller-e13df3537500ca17a5cff6a624417a3e.png" width="1922" height="1148" class="img_ev3q"></th></tr></thead></table>
</li>
<li>
<p><strong>Step 6: Start the server and test the API in the browser</strong></p>
<p>Run the project and navigate to <code>http://localhost:8080/api/books</code> in your browser.
You will see an empty ouput:</p>
<table><thead><tr><th><img decoding="async" loading="lazy" alt="No Output" src="https://shahpreetk.com/assets/images/no-output-fd6ca84679d5435a586092d8cfc5c69c.png" width="1324" height="1114" class="img_ev3q"></th></tr></thead></table>
<p>Even though we have data in our H2 database, the browser shows an array with multiple empty objects. This is because the <code>BookLibraryRepository</code> is not mapping the data from the database to the JSON we are trying to return.</p>
<p>I tried multiple StackOverflow solutions, such as adding a Lombok Plugin or the <code>jackson-databind dependency</code>, but none worked because the plugin doesn't help at runtime and the <code>jackson-databind</code> dependency was already present in the project as a default part of the <code>spring-boot-starter-web</code> dependency.</p>
</li>
<li>
<p><strong>Step 7: Solution to the JSON issue</strong></p>
<p>The solution was to add the <code>Lombok dependency</code> to the <code>build.gradle</code> file as a <code>annotationProcessor</code> along with the <code>compileOnly</code>. This is because the <code>annotationProcessor</code> scope is used to process annotations at compile time, necessary for Lombok to generate the necessary methods in the compiled class files. Sync the Gradle project after adding the <code>annotationProcessor</code> scope.</p>
<p>The <code>compileOnly</code> part of the dependency is needed to compile the project, without which the import statements for the Lombok annotations would not be recognized by the compiler.</p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><ul>
<li>Please install the Lombok Plugin from the IntelliJ IDEA marketplace (<code>Settings</code> -&gt; <code>Plugins</code> ) to enable the IDE to recognize the Lombok annotations.</li>
<li>Then go into the <code>Settings</code> -&gt; <code>Build, Execution, Deployment</code> -&gt; <code>Compiler</code> -&gt; <code>Annotation Processors</code> and check the box for <code>Enable annotation processing</code>.</li>
</ul></div></div>
<table><thead><tr><th><img decoding="async" loading="lazy" alt="Updated build.gradle file" src="https://shahpreetk.com/assets/images/updated-gradle-be3960422f9017200f8ee794ff82c6f0.png" width="2686" height="1404" class="img_ev3q"></th></tr></thead></table>
<p>Run the project again and navigate to <code>http://localhost:8080/api/books</code> in your browser. You should now see the list of books displayed correctly in JSON format.</p>
<table><thead><tr><th><img decoding="async" loading="lazy" alt="JSON Output with Lombok" src="https://shahpreetk.com/assets/images/json-output-c20c3f3d152a84cbed4ae70ede864cc6.png" width="1487" height="1600" class="img_ev3q"></th></tr></thead></table>
</li>
<li>
<p><strong>Step 8: Testing the GET API using Hoppscotch.io</strong></p>
<p>In the past, I used Postman to test the API, but now it requires users to create an account.I recently discovered <a href="https://hoppscotch.io/" target="_blank" rel="noopener noreferrer">Hoppscotch.io</a>, a free and open-source, lightweight, web-based API development suite. You can use it to test the GET API by entering the URL <code>http://localhost:8080/api/books</code> and clicking on the <code>Send</code> button.</p>
<p>Since our app runs on <code>http</code>, Hoppscotch.io will throw an error. To solve this, you can use the Hoppscotch browser extension. It can be downloaded from the following links:</p>
<p><a href="https://chromewebstore.google.com/detail/hoppscotch-browser-extens/amknoiejhlmhancpahfcfcfhllgkpbld" target="_blank" rel="noopener noreferrer">Hoppscotch Chrome Extension</a></p>
<p><a href="https://addons.mozilla.org/en-US/firefox/addon/hoppscotch/" target="_blank" rel="noopener noreferrer">Hoppscotch Firefox Extension</a></p>
<p>Once you have the extension installed, reload the page and re-send the request. Then choose the <strong>Browser extension option</strong> from the error and click on the <code>Send</code> button. You should see the list of books displayed in JSON format.</p>
<table><thead><tr><th><img decoding="async" loading="lazy" alt="GET Request on Hoppscotch.io" src="https://shahpreetk.com/assets/images/get-hoppscotch-d3482d6b7ddb2f21f0af118d76e39401.png" width="2874" height="1606" class="img_ev3q"></th></tr></thead></table>
</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="crud-operations-on-the-book-entity">CRUD Operations on the Book Entity<a href="https://shahpreetk.com/blog/setting-up-a-java-spring-boot-project-part-2#crud-operations-on-the-book-entity" class="hash-link" aria-label="Direct link to CRUD Operations on the Book Entity" title="Direct link to CRUD Operations on the Book Entity">​</a></h2>
<p>In the above section, we saw how to GET all the books from the database. Now, let's implement the remaining CRUD operations on the <code>Book</code> entity.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="create-a-new-book">Create a New Book<a href="https://shahpreetk.com/blog/setting-up-a-java-spring-boot-project-part-2#create-a-new-book" class="hash-link" aria-label="Direct link to Create a New Book" title="Direct link to Create a New Book">​</a></h3>
<p>To create a new book, we need to implement a <code>POST</code> API that accepts a JSON payload containing the book details. Add the following method to the <code>BookLibraryController</code> class:</p>
<div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">// In BookLibraryController.java</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  @PostMapping</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  @ResponseStatus(HttpStatus.CREATED)</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  public Book addBook(@RequestBody Book book) {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      return bookLibraryService.addBook(book);</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  }</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>We now create the Service method which will make the repository call to save the book.</p>
<div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">// In BookLibraryService.java</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  public Book addBook(Book book) {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      return bookLibraryRepository.save(book);</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  }</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<table><thead><tr><th><img decoding="async" loading="lazy" alt="POST Request Error on Hoppscotch.io" src="https://shahpreetk.com/assets/images/post-hoppscotch-error-a5341d97e69a09de1f41c5c18ee6e216.png" width="2156" height="1374" class="img_ev3q"></th></tr></thead></table>
<p>When you try to send a POST request you will encounter the following <code>SqlExceptionHelper</code> error.</p>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">  2024-06-01T17:33:42.470+01:00 ERROR 68886 --- [javaSpringBootBookLibrary] [nio-8080-exec-2] o.h.engine.jdbc.spi.SqlExceptionHelper   : Unique index or primary key violation: "PRIMARY KEY ON PUBLIC.BOOK(ID) ( /* key:1 */ 1, 'Harper Lee', 'A gripping novel about racial injustice.', 'To Kill a Mockingbird')"; SQL statement:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">insert into book (author,description,name,id) values (?,?,?,default) [23505-224]</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>This error occurs because even though we are asking the database to auto-generate the <code>id</code>, the <code>id</code> field in the <code>Book</code> class, we are filling it with a value in the <code>data.sql</code> file. This causes a conflict when we try to insert a new book. To resolve this, remove the <code>id</code> field from the <code>data.sql</code> file.</p>
<div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">INSERT</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">INTO</span><span class="token plain"> BOOK </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">NAME</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> AUTHOR</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> DESCRIPTION</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">VALUES</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'To Kill a Mockingbird'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'Harper Lee'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'A gripping novel about racial injustice.'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">INSERT</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">INTO</span><span class="token plain"> BOOK </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">NAME</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> AUTHOR</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> DESCRIPTION</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">VALUES</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'Pride and Prejudice'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'Jane Austen'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'A classic romance novel.'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">INSERT</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">INTO</span><span class="token plain"> BOOK </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">NAME</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> AUTHOR</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> DESCRIPTION</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">VALUES</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'The Great Gatsby'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'F. Scott Fitzgerald'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'A story of the American dream gone wrong.'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">INSERT</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">INTO</span><span class="token plain"> BOOK </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">NAME</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> AUTHOR</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> DESCRIPTION</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">VALUES</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'Moby Dick'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'Herman Melville'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'A thrilling adventure of the whaling industry.'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">INSERT</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">INTO</span><span class="token plain"> BOOK </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">NAME</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> AUTHOR</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> DESCRIPTION</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">VALUES</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'The Catcher in the Rye'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'J.D. Salinger'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'A novel about teenage rebellion.'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">INSERT</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">INTO</span><span class="token plain"> BOOK </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">NAME</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> AUTHOR</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> DESCRIPTION</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">VALUES</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'The Hobbit'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'J.R.R. Tolkien'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'A fantasy adventure of a reluctant hero.'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">INSERT</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">INTO</span><span class="token plain"> BOOK </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">NAME</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> AUTHOR</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> DESCRIPTION</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">VALUES</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'Crime and Punishment'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'Fyodor Dostoevsky'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'A psychological drama about guilt and redemption.'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">INSERT</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">INTO</span><span class="token plain"> BOOK </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">NAME</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> AUTHOR</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> DESCRIPTION</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">VALUES</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'The Odyssey'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'Homer'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'An ancient epic of a hero''s journey home.'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">INSERT</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">INTO</span><span class="token plain"> BOOK </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">NAME</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> AUTHOR</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> DESCRIPTION</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">VALUES</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'The Adventures of Sherlock Holmes'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'Arthur Conan Doyle'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'Mysteries solved by the famous detective.'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">INSERT</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">INTO</span><span class="token plain"> BOOK </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">NAME</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> AUTHOR</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> DESCRIPTION</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">VALUES</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'Harry Potter and the Philosopher''s Stone'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'J.K. Rowling'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'The beginning of a young wizard''s journey.'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Re-run your app and re-send the POST request on Hoppscotch.io. You should see a success message with the newly created book details.</p>
<table><thead><tr><th><img decoding="async" loading="lazy" alt="POST Request Success on Hoppscotch.io" src="https://shahpreetk.com/assets/images/post-hoppscotch-success-8923adaa2a483df07f0488b26d133d22.png" width="2158" height="1484" class="img_ev3q"></th></tr></thead></table>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="update-an-existing-book">Update an Existing Book<a href="https://shahpreetk.com/blog/setting-up-a-java-spring-boot-project-part-2#update-an-existing-book" class="hash-link" aria-label="Direct link to Update an Existing Book" title="Direct link to Update an Existing Book">​</a></h3>
<p>To update an existing book, we need to implement a <code>PUT</code> API that accepts the book <code>id</code> and the updated book details. Add the following method to the <code>BookLibraryController</code> class:</p>
<div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">// In BookLibraryController.java</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  @PutMapping(value = "/{id}")</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  public ResponseEntity&lt;Book&gt; updateBook(@PathVariable int id, @RequestBody Book updatedBook) {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      Book updated = bookLibraryService.updateBook(id, updatedBook);</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      return new ResponseEntity&lt;&gt;(updated, HttpStatus.OK);</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  }</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>We now create the Service method which will make the repository call to update the book.</p>
<div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">// In BookLibraryService.java</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  public Book updateBook(int id, Book updatedBook) {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      if (updatedBook.getId() != id) {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          throw new RuntimeException("The ID in the request body does not match the ID in the URL.");</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      Optional&lt;Book&gt; optionalBook = bookLibraryRepository.findById(id);</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      if (optionalBook.isPresent()) {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          Book existingBook = optionalBook.get();</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          existingBook.setName(updatedBook.getName());</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          existingBook.setAuthor(updatedBook.getAuthor());</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          existingBook.setDescription(updatedBook.getDescription());</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          return bookLibraryRepository.save(existingBook);</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      } else {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          throw new RuntimeException(String.format("Book with id {%s} not found", id));</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  }</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<table><thead><tr><th><img decoding="async" loading="lazy" alt="PUT Request on Hoppscotch.io" src="https://shahpreetk.com/assets/images/put-hoppscotch-38ea78ddd1131fd124d002cf30254a0c.png" width="2170" height="1310" class="img_ev3q"></th></tr></thead></table>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="delete-a-book">Delete a Book<a href="https://shahpreetk.com/blog/setting-up-a-java-spring-boot-project-part-2#delete-a-book" class="hash-link" aria-label="Direct link to Delete a Book" title="Direct link to Delete a Book">​</a></h3>
<p>To delete a book, we need to implement a <code>DELETE</code> API that accepts the book <code>id</code>. Add the following method to the <code>BookLibraryController</code> class:</p>
<div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">// In BookLibraryController.java</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  @DeleteMapping(value = "/{id}")</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  @ResponseStatus(HttpStatus.NO_CONTENT)</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  public void deleteBook(@PathVariable int id) {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      bookLibraryService.deleteBook(id);</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  }</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>We now create the Service method which will make the repository call to delete the book.</p>
<div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">// In BookLibraryService.java</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  public void deleteBook(int id) {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      bookLibraryRepository.deleteById(id);</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  }</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<table><thead><tr><th><img decoding="async" loading="lazy" alt="DELETE Request on Hoppscotch.io" src="https://shahpreetk.com/assets/images/delete-hoppscotch-4924bb6fe37403a0f5f9741e7aa8ca58.png" width="2868" height="1410" class="img_ev3q"></th></tr></thead></table>
<p>With that, we have successfully implemented the CRUD operations on the <code>Book</code> entity in our Java Spring Boot project.</p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>Part 3 of this series will cover the testing of the CRUD operations using JUnit and Mockito. We will also create API documentation using <a href="https://swagger.io/" target="_blank" rel="noopener noreferrer">Swagger</a> and update our codebase with exception handling.</p></div></div>]]></content:encoded>
            <category>java</category>
            <category>springboot</category>
            <category>intellij</category>
            <category>gradle</category>
            <category>h2-database</category>
            <category>RestApi</category>
            <category>web-development</category>
            <category>CRUD-operations</category>
            <category>lombok</category>
        </item>
        <item>
            <title><![CDATA[Java Spring Boot Project - Part 1]]></title>
            <link>https://shahpreetk.com/blog/setting-up-a-java-spring-boot-project-part-1</link>
            <guid>https://shahpreetk.com/blog/setting-up-a-java-spring-boot-project-part-1</guid>
            <pubDate>Sun, 19 May 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[In this blog post, we guide you through the initial setup of a Java Spring Boot project using Gradle and IntelliJ IDEA. We cover creating a new project with Spring Initializr, setting up dependencies, and configuring an in-memory H2 database.]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorWithStickyNavbar_LWe7" id="initial-setup-for-a-java-spring-boot-project">Initial Setup for a Java Spring Boot Project<a href="https://shahpreetk.com/blog/setting-up-a-java-spring-boot-project-part-1#initial-setup-for-a-java-spring-boot-project" class="hash-link" aria-label="Direct link to Initial Setup for a Java Spring Boot Project" title="Direct link to Initial Setup for a Java Spring Boot Project">​</a></h2>
<p>In this blog post, we will cover the initial steps to set up a Java Spring Boot project using Gradle and IntelliJ IDEA. Spring Boot is a popular framework for building Java applications, providing a robust and efficient platform for developing web applications, RESTful APIs, and microservices.</p>
<ul>
<li>It is not possible to directly create a new Spring Boot application in <strong>IntelliJ IDEA Community Edition</strong>. However, you can create a new Spring Boot project using the <a href="https://start.spring.io/" target="_blank" rel="noopener noreferrer">Spring Initializr</a> website and then import it into IntelliJ IDEA.</li>
</ul>
<table><thead><tr><th><img decoding="async" loading="lazy" alt="Demo project init" src="https://shahpreetk.com/assets/images/demo-init-f615ba57a69ea3e0ef86cf503ea71254.png" width="1436" height="871" class="img_ev3q"></th></tr></thead></table>
<ul>
<li>
<p>Add the following dependencies as shown in the image below:</p>
<ul>
<li>
<p><strong>Spring Web:</strong> Provides tools and features to build web applications, including RESTful APIs, using Spring MVC.</p>
</li>
<li>
<p><strong>Spring Data JDBC:</strong> Simplifies database access by providing a simple, lightweight approach to using JDBC with Spring, focusing on SQL queries.</p>
</li>
<li>
<p><strong>Spring Data JPA:</strong> Eases database access by providing a repository abstraction layer on top of JPA (Java Persistence API) to simplify CRUD operations and data access patterns.</p>
</li>
<li>
<p><strong>H2 Database:</strong> A fast, lightweight, in-memory relational database management system that is commonly used for development and testing purposes.</p>
</li>
<li>
<p><strong>MySQL Driver:</strong> Enables Java applications to connect to and interact with MySQL databases by providing the necessary JDBC (Java Database Connectivity) implementation.</p>
</li>
</ul>
</li>
</ul>
<table><thead><tr><th><img decoding="async" loading="lazy" alt="Demo dependencies" src="https://shahpreetk.com/assets/images/demo-dependencies-7d38f0cb6ecfaf4f5209296004855950.png" width="1504" height="861" class="img_ev3q"></th></tr></thead></table>
<ul>
<li>
<p>After adding the dependencies, click on the <code>Generate</code> button to download the project as a zip file.</p>
</li>
<li>
<p>Extract the downloaded zip file and open the project in IntelliJ IDEA.</p>
</li>
<li>
<p>Run the DemoApplication file to start the project. By default, the project will run on port 8080.</p>
</li>
</ul>
<table><thead><tr><th><img decoding="async" loading="lazy" alt="Demo project run" src="https://shahpreetk.com/assets/images/demo-run-7df68833e7b07551c40d39658b529e1e.png" width="1600" height="994" class="img_ev3q"></th></tr></thead></table>
<ul>
<li>In the folder containing the <code>DemoApplication</code> file, create a new class named <code>HelloWorld</code>.<!-- -->
<ul>
<li>Annotate the <code>HelloWorld</code> class as a <code>@RestController</code> from the <code>org.springframework.web.bind.annotation</code> package.</li>
<li>In the <code>HelloWorld</code> class, create a method named <code>helloWorld</code> that returns a <code>String "Hello World"</code>.</li>
<li>Annotate the method with <code>@GetMapping</code> and provide the path as <code>"/hello"</code>.</li>
</ul>
</li>
</ul>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>An annotation in Java is a form of metadata that provides additional information about the program's code elements, such as classes, methods, or variables, and can be used to influence program behavior at runtime or compile time.</p></div></div>
<table><thead><tr><th><img decoding="async" loading="lazy" alt="Hello World Code" src="https://shahpreetk.com/assets/images/hello-world-code-035549271df6e7b14f3cbee4aeda304a.png" width="1600" height="613" class="img_ev3q"></th></tr></thead></table>
<ul>
<li>Run the project and navigate to <code>http://localhost:8080/hello</code> in your browser. You should see the message "Hello World" displayed on the screen.</li>
</ul>
<table><thead><tr><th><img decoding="async" loading="lazy" alt="Hello World" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABMAAAAJqCAMAAAD6w8wWAAAAolBMVEX///8gISQ1NTUAAABjY2OQkZKampqMjIxoaGgmJiiNjo8tLjDMzMwpKixgYGF8fX3Gxsf39/eJiov7+/t1dXY2Nzn9/f1YWVs6OjyFhYdGRkfe3t5/gIFSU1VMTVBKSku6ursxMjQ9PkAXFxeurq6lpaUNDQ14eXrr6+tCQkPT09RvcHFrbG3v7+/m5ubAwMDx8fG0tLSenp6Vlpbh4eLY2NhK9XamAAATrUlEQVR42uza2wnDMBBE0ZXyZYSKMIb0X2JwHqSGYc8p4rIDWw+AUAIGxBIwIJaAAbH+AXuOvc4JEOMXsEu7gDT1ydeaAGneATsmQJ47YM4vIFLpF5Cq7EcgVV0TIFN5nwBS1QQIJWBALAEDYgnY17n2cQwgiYDdlnRBIgFTL4jVPmDyBbmaB0y+IFnvgO0BBOscMOcXhGscsDWAbH0DZj5CvLYBe7FrBykMwzAURCstjISiQ/T+lyw0C9spFLKL0LxVTjA44tMvoL6uAUv54RHvc5PPcQyooWnAUi4ydBO80IDn6xmwkF1w5AcqahmwkE1yJwNqahkwl4UHSzGgqI4BS1m4/kXBgAdrGLCQRTK3AOpqGDCXKRmMAYX1C1jI5PrFXyRQU7+ALT1yVQoGFNYuYCFT6IWZDTMGYUARdQNmZtvX/QdY6saO43UagzMY8GHXbpfUhMEwDOdxjIQvrYoiVEUZZ1xXd7fbbc//1PqSBCIwY6V2Vncm148SPkLxR++J1K/g+oCpf9W3Gw57Nxvo1gTymWh8/bPBaOSLGc37wbKsR8SubsaFSnQxdJwbCtZuzaBbwHxU/PrHaxCNWW1P8zG6287nz2Zzs+167eNcHov4gHPuYZW7OJfGYjWD4XreEannrXDJ0puUG8t6EOzqfhHRu1nmkBsK1m7NoFPAXFTa91TvvwZ6529LsDGborsZY9/N5jbhyOPEi1xosyUvJDlKq4k6kqKUObww8s0RzmOsiz8umXCv3FjWg2AdovF/VmC3FixgJAgEUaUJugQMlbD58YILHzdE02cHbDedHlG38Lg22ULqVUdyKCdeGkJZV5NCmIsWNmDWV8Q+s1+3F8w8itnr8mxbVPyewYi4tOD00fTZAfvG2BI1IUXIifM89njZlAll6eDmCR1wURB0zTGbrfe8zNOWRqOZm9GkJbSE5tuAWV8R6xKNByhY8SiBMPuiW8B8VBo31XcIBua+Qc9A0/0DNuQ8CUF8h/MVyKoMV1IuuLg8oy6eoBBRv+Qkr1qmuXTIBsz6kliHfj1CwVprJdEpYCFKbqtfeijMQXHhx6y1gK32EzGD4cbJfgsjXe7V6UbAwijyYRyOzvEAYxstUz1aBIx5i4ULY6/iRPqcC0B2K0NhptdkW84dKJQyEJe2IQqxKhlJZe5UwMIsx5lemi2gtQPmH9YH+yM5615MwD6jX7cXzLRGY4VOATMB8Os3NTkcmHdtwaXvkCZgfMwK31Nomzkj43dI7pvcne4A1AKWvcjLBBTxxAovJygjedv5myv/LmUDkqsYRpynkGIVMFdnCzJlM8iAJVA8FbCM8z0kc7XgPFcBSyecLEMoK7nrDUHaAcur/zCwrHthHfr1AAULdGv+a8Bq80Uta9cEjDNtPIMUMO1XMWs2ZloAYgL2qk/MYxTiOdP7KhjvTHsJTcDeIMMlZww5P0Iacb6GXEmNoJz0NZQtH4UF5xN9Qt1eR04PIAMWcSVxAXlEUjNaAZt5XFvAsu6EdenX/QtWf5buAUNla5LVnG8Oi/bbf0MHLGKUpEG0ocY8hSA7atBz4vymIH0DsCkWX5HY0O4JZwEjrx/iY0qFAjkUg91x90SXZwAWdH63Xv+kwwOgf/zO2PvxmALgelnlUkFOLhDudZxiVTQ9POmtlwNIPdm4qnV6mIG4nC+hc3XM8iFtBEhOg2idnbic0gyYT3dMhod4ybm3hWXdB7umXyxoEr1OsqjJaRese8CE0esasHqpqvFgIBoB09CkA+bO9Re7xVQN+jQvATlRyEJgrJdYH1Qg1AL2GySn+S6AV+ofYAY/9W37c/YKYl7iL3Wc4FOCuOMUQdvKS2u/lYhQWHkUmAkncTl5AeWk36Ed1LR1eU2qggZP72d0AmgGbKmukh1MYFn3wa7pV1vXgDktnQtmonIDVOqf8Ww8aMbycsAS1RsiGBtDluYbpM2PH31UtoxKVAuYj8IzY325P1dlmVEIDzRZ9s4wAQuHKxdSb8KlRN3pZFZXi+rb5JArK0gJ5yGqM0NAdi8HsK5CREnE+RfSo4xePWAhdVHdKKTQ2Tf51r+xAfvD3tk2qQkDATjrKCWiUPAE9ECF0fE8te3U6///a0026wUulsHaHleb5wvKq355ZrPsJgbXR2A3CAzFsgaFMM8U4MiYCxfwlOm0wEIQYK4rAshQb8gjY58AtkyIMAeCBFbHxRT7gMKriwIrhnQO1a1eElgmfYUC2wOS4TmuvCuSo/7qAtN6g618rMXSAS2HkKOPNISkRxsR1E0Ccy8IrN0Q8gdjASieGEtQYx5UKU7P4SRmrCIw2iAb9JVzjtsw9toA8C9MMHmkOOeCwBKZXvcACimyJVwaQvJIviXkwOefKL7KdJH+nsIyGgvqOrAtCuxBmg8ZoNrqAsspUaYem4DF0gGGwP58E+TfSeLfLrCiUWDtk/jCMzlI0GV7gJjFUCUJGdIssDVaCzmp7Nf4c8wk8RokpsCEV3aA5JjF10l8jK4OapNxkIxnqCsjiY+5+j6AITB5WBPAG4H52lq5vIHF0gEosA4Mdr2/jOIsDfutXm6vdlPHEFjbMoofWixP6DLhqwI0ntBQONqcskOjwE5vIjAJzz5/YwI0mCGwUifPsVqiNqzbK79kWCqG5Mpuro7SIlVG4aMHL0Zgh4UiX5RgRmAHkNgIzNIlrNeBwW4sZDV23S4wZggMvdhCYJ91sj1GdR0xDiMwyf8NJGWjwAKdA3vBt5hE8sjwMabAchwlIiQqs5BV59fJd1pymIanazmAKTC37iUzB5aBIrA5MEtXtG8lcj+Cv37Vdt0zad9KpPsetcC0F5tbidA8R3XwQeXlV4w9gwDfQiZSPA5ITo0CKxiLMVjCuooUIKV6e46vBlBgJ6gy17riA+Wr2VklKR3DcaME46StOpWc5qsdoMRmCkyrjuPfrwlM3wcLwuyUtZZO0AJ7H4Pd3sztGs3cDQFY22buEf49mlbaMf3V1MzNJzT428UqFssZKgvVNuGwoXqufNIoMHghEfInFYuFFIcVMT6m4sV0u/cAIyhKefGAfLWg2gZ+buZ2qY5V6oj8tKfQqaAS+pSy8YbAYHjObQXmW8hK+ddM3tBi6QbWa2+wD+AvYzqd1v4yp9NpsqDbfjodNxZmWg9Gk/MgUP6ml++nH6rCdSErVgezrzFrFlgqjBV+Ha7EZlKCqudfPSSDkPw4wIJ/qZiIQidfVoD5y2U/ojIvlEm09Hav0+mM8Q1iPk8exDYCiSc+ZaWXDynA8ilNZgqslGf68ySiu9UFNha7I3fhymfZMjBLV7ArtOF+AH+dJzR0HDmhofrca0vzhIbOb05omDHi6AGyYsTjGHRn5KhZYLCcMEWMMiqOjHgq8Tse/gq6lQjywStLQLy3/Yme8AsRcEDmAyLCHQGlwEyBwXJADKcARi9kMTwftUsGWN6Je5xSusFf108pLT6iF6+aUjpD18TPKRCbkAnCNSDriSqGUAIrpLlog3ynsSLm6wUvPlSuY+EKFMlzrATmvybNS5pSOugBUQSqND+FM+5M7fHhzC7CPTSRz5BsWBMYOW2prj3IMw2BwTRQYrS93Jb34x4W9agarKGk9rZFPRzjqgbS/iHnUGHn+pWgrTzk0AYv2SdF9Xu/74GGp6Xa8sop890YqkzzJE+hRrqcQo0yTxYFna7LIS4xLsuG/86nu6ld9dfyntzJsmoO6ev63wQaQ4uXvXjXy6olcvhpsfyr3MPCto20X9jWcbS+/puFbcVw0cZQlp/s3EEKwzAMRFGsRcEZfIjse//zNbtGxIWSVeT57xAfSQmuq27AblL70jWKr0kXV/7ItvEWDiqzC9h5BOvxl4VHFG3buwFl+QUsncXN+wUU5xewFKQREzYHMKA6w4CpnQz6BdRlGLDcpM7+CJTlGLBcpa74SfQLeDLLgKklg/URqMkyYKGWKQ5Ov38Ba/AM2HW2GopETF/A85kGbLYddmmPwy5OX0ANrgHjvgUswDZgFOzDrh3bAAjAQAykoEGIIdh/SRqWsP5uCCuJAn27AXOkh7zhgPnygrrlgFkjIW47YIYwSBsPmIRB2XzAJAy6BEzDIEvAfu/9XDIGLQIGZAkYkCVgQJaAAVkCBmQJGJAlYECWgAFZAgZkCRiQJWBAloABWccJECVgQNYBAAB87NTBTsJAFIXhG44hgESKJWgaDQ0tUETaqvD+r2absY4ltK5c+X+rM4u5yx8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/rlwWvrxB7KptZW5AUCfdPYlNrNN8yisrUxHiQI/uhQzJ/V38zpObnb+W75M1orsh9PmWRMDgD5vr1tVkkNR12zkHovAWmLVAj+6FCvVRnF1SrX9fVYH7GksadX5b61KZN6dKh8GAP3OquTmTFXJ7MIyLCQFfnRbfKdoqMrRnEy6sU7h8aEdsHk+kIYGAL/YSrfWkDSwK8ZS4Ee3cislodUiSWdzTkrm1iN1AfMOBAxAH9+mvTUSaWVXPEqBHz12kuImSpqZM9TO+sRSdHnm3YBPdu5sKXEgDMPwDy/joCISg1FZyiWLyL7e/61N0gnbkHEcqZqj7zkhjYBnb3WS7oj814B1gQfLePvJmH0w/OeAxSYi8v2ABX8JWBDYic7uKtoYWFhmzc3pb6Z8Lx17vwfMnyhgInJWwILlQ8hNffrHgLXG9yQf7a4di4HVLmV9yzzx0zLT905CtT6zfHRV6fk/LhkdBixYdSCs1xQwEfl2wOZ9PsZvkCzKA+Y/Qe+imcAqsEMexU2BNdv7m8Ela0tFCbVlO4Tx3GzRAW7HpNb7gHl9ruPGVYICJiLfDZh/z0V+KSqZlgasnr+2gCc7UgMabtp1CVy5D71ZKsZNxAYhdIJipVgySsDbBSx443qQvs4UMBH5YsC42aIIWJy/eMC4LGAtqO+We23s0AwYmQUVNsBlYDZmaWaThEvPUsOiTmPgxSbLzf4UMoKZZd4UMBH5YsCSrSJgXkh7mKlAtSxgr9uxl0DfDgUhJJ61eLY60Mo+MsnXuN6Z04fEN/sBr8d3Ib3QBS81VsBE5JunkA3YKwmYt1+9P4LQjvSAyGrE7mfqFuWFu4fInAjouslb+zhgLahpGYWInBewGOJhoVsSsAYQmLMA5iebkzpz9+4NMO+7cAVAy5wJsDBbngRsCT0FTETOC1gPos8Wsi4Az5whMLQjVaBH08xWwB2JV1RrZjlgVRawtgImImcH7A56nwWsBazNmZ5u/76AYkPRgMzYUj4Q7/9lVBawGjQVMBE5L2ARVHzLzV5OAlacBDobSOzYALa7iB5g+83Xfa9C2JQF7AkqgQImImcFbAhcmDNkeRowC+Gh6Jv7xrFn4H1bJsK8SbVt1MwD/LKARcCLAiYiXxbCo21R1OxxuwZ/GoZeScCWuxPHtnvjWLy7LuaHMCpKuJu1LeDOygI2SaA6t1QHPZFVRP7KK+ZIzgQIi6JAcxn1EmaWqsCLHRwEb/Ds581p2u8mcG25233fehC6nUUdKlkUr+BhX7zq9urZW9cmP4HqS9dERP7M79ZJ3a4DN6iR6k3TwS2FOEtOBDS9gwNbv0J9bdNHnid2Yv9E+yGhbzmvCY/DwBtRGabD7iuwmFtq8FFsP/KbpBKcRA+VFpHP1Ci0XXYKT+lgmZC6z1LTSHBudwdZjt6BEJ58OxUxtcLNyHbiBBLoZ8l7Jjc0a+K46dmPEKjG7/Qjz0REvqkbzQb2Ca9xsWx45X9a2FZjbXv+Jl615vapdWti1h2YiIiIiIiIiIiIiIiIiIiIiIj8Yg8OBAAAAACA/F8bQVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV2IMDAQAAAAAg/9dGUFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUV9uBAAAAAAADI/7URVFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVWFPTgQAAAAAADyf20EVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVhDw4EAAAAAID8XxtBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVXYgwMBAAAAACD/10ZQVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRX24EAAAAAAAMj/tRFUVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVYU9OBAAAAAAAPJ/bQRVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVWEPDgQAAAAAgPxfG0FVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVdqDAwEAAAAAQf7Wg1wBAAAAAAAAAAAAAAAAAAAAAABDAeQu0VMKKSgRAAAAAElFTkSuQmCC" width="1216" height="618" class="img_ev3q"></th></tr></thead></table>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="setup-of-a-book-library-project">Setup of a Book Library Project<a href="https://shahpreetk.com/blog/setting-up-a-java-spring-boot-project-part-1#setup-of-a-book-library-project" class="hash-link" aria-label="Direct link to Setup of a Book Library Project" title="Direct link to Setup of a Book Library Project">​</a></h2>
<p>In this section, we will set up a Book Library project created with Java Spring Boot and Gradle, allowing us to perform CRUD operations on a collection of books. We will use an in-memory H2 database to store the book data.</p>
<ul>
<li>First, create a new project for the book library using <a href="https://start.spring.io/" target="_blank" rel="noopener noreferrer">Spring Initializr</a> with the following dependencies:<!-- -->
<ul>
<li>Spring Web</li>
<li>Spring Data JDBC</li>
<li>Spring Data JPA</li>
<li>H2 Database</li>
<li>MySQL Driver</li>
</ul>
</li>
</ul>
<table><thead><tr><th><img decoding="async" loading="lazy" alt="Book Library project init" src="https://shahpreetk.com/assets/images/book-library-init-2182ba520fc8854d0166409794e7e717.png" width="1600" height="949" class="img_ev3q"></th></tr></thead></table>
<ul>
<li>
<p>Generate and extract the project, then open it in IntelliJ IDEA.</p>
</li>
<li>
<p>In the <code>src/main/resources/application.properties</code> file, add the following configuration to use the H2 in-memory database:</p>
</li>
</ul>
<div class="language-properties codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-properties codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">spring.application.name=javaSpringBootBookLibrary</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"># H2 in-memory database. It can also be a file path.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">spring.datasource.url=jdbc:h2:mem:testdb</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">spring.datasource.driverClassName=org.h2.Driver</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">spring.datasource.username=sa</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">spring.datasource.password=password</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">spring.jpa.database-platform=org.hibernate.dialect.H2Dialect</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"># Defer the datasource initialization</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">spring.jpa.defer-datasource-initialization=true</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"># Always run the SQL scripts</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">spring.sql.init.mode=always</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"># Create and drop the tables on startup</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">spring.jpa.hibernate.ddl-auto=create-drop</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"># Enable H2 console</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">spring.h2.console.enabled=true</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<ul>
<li>
<p>Create the <code>Book</code> class to represent a book entity in the library. The <code>Book</code> class will have the following fields:</p>
<ul>
<li><code>id</code> of type <code>int</code>. Annotation <code>@Id</code> and <code>@GeneratedValue</code> to auto-generate the id.</li>
<li><code>name</code> of type <code>String</code></li>
<li><code>author</code> of type <code>String</code></li>
<li><code>description</code> of type <code>String</code></li>
</ul>
</li>
<li>
<p>Annotate the <code>Book</code> class with <code>@Entity</code> and <code>@NoArgsConstructor</code> to map it to the database table.</p>
</li>
<li>
<p>Generate the getters and setters for the fields using the <code>Generate</code> option in IntelliJ IDEA.</p>
</li>
</ul>
<table><thead><tr><th><img decoding="async" loading="lazy" alt="Book Class with Getters and Setters" src="https://shahpreetk.com/assets/images/book-class-with-getters-setters-b8e48cc4920a9f4803b9571f755b16a8.png" width="1558" height="1964" class="img_ev3q"></th></tr></thead></table>
<ul>
<li>In the <code>src/main/resources</code> folder, create a new file named <code>data.sql</code> to insert some sample data into the <code>book</code> table. Add the following SQL script to insert books into the table:</li>
</ul>
<div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">INSERT</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">INTO</span><span class="token plain"> BOOK </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">ID</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> NAME</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> AUTHOR</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> DESCRIPTION</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">VALUES</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token number">1</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'To Kill a Mockingbird'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'Harper Lee'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'A gripping novel about racial injustice.'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">INSERT</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">INTO</span><span class="token plain"> BOOK </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">ID</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> NAME</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> AUTHOR</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> DESCRIPTION</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">VALUES</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token number">2</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'Pride and Prejudice'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'Jane Austen'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'A classic romance novel.'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">INSERT</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">INTO</span><span class="token plain"> BOOK </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">ID</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> NAME</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> AUTHOR</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> DESCRIPTION</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">VALUES</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token number">3</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'The Great Gatsby'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'F. Scott Fitzgerald'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'A story of the American dream gone wrong.'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">INSERT</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">INTO</span><span class="token plain"> BOOK </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">ID</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> NAME</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> AUTHOR</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> DESCRIPTION</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">VALUES</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token number">4</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'Moby Dick'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'Herman Melville'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'A thrilling adventure of the whaling industry.'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">INSERT</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">INTO</span><span class="token plain"> BOOK </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">ID</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> NAME</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> AUTHOR</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> DESCRIPTION</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">VALUES</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token number">5</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'The Catcher in the Rye'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'J.D. Salinger'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'A novel about teenage rebellion.'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">INSERT</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">INTO</span><span class="token plain"> BOOK </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">ID</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> NAME</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> AUTHOR</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> DESCRIPTION</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">VALUES</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token number">6</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'The Hobbit'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'J.R.R. Tolkien'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'A fantasy adventure of a reluctant hero.'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">INSERT</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">INTO</span><span class="token plain"> BOOK </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">ID</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> NAME</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> AUTHOR</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> DESCRIPTION</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">VALUES</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token number">7</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'Crime and Punishment'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'Fyodor Dostoevsky'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'A psychological drama about guilt and redemption.'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">INSERT</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">INTO</span><span class="token plain"> BOOK </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">ID</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> NAME</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> AUTHOR</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> DESCRIPTION</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">VALUES</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token number">8</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'The Odyssey'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'Homer'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'An ancient epic of a hero''s journey home.'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">INSERT</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">INTO</span><span class="token plain"> BOOK </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">ID</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> NAME</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> AUTHOR</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> DESCRIPTION</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">VALUES</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token number">9</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'The Adventures of Sherlock Holmes'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'Arthur Conan Doyle'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'Mysteries solved by the famous detective.'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">INSERT</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">INTO</span><span class="token plain"> BOOK </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">ID</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> NAME</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> AUTHOR</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> DESCRIPTION</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">VALUES</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token number">10</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'Harry Potter and the Philosopher''s Stone'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'J.K. Rowling'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'The beginning of a young wizard''s journey.'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<table><thead><tr><th><img decoding="async" loading="lazy" alt="SQL inserts" src="https://shahpreetk.com/assets/images/sql-inserts-599a7887e6ce1477aa9bbe4fe9e2c577.png" width="1600" height="448" class="img_ev3q"></th></tr></thead></table>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>If your SQL string has a apostrophe(‘), you need to escape it by adding two apostrophes(‘’). Check descriptions of book ID 8 and 10.</p></div></div>
<ul>
<li>Run the project, and the H2 console can be accessed at <code>http://localhost:8080/h2-console</code>. The JDBC URL should be <code>jdbc:h2:mem:testdb</code>, and the username and password should be <code>sa</code> and <code>password</code> respectively.</li>
</ul>
<table><thead><tr><th><img decoding="async" loading="lazy" alt="H2 console" src="https://shahpreetk.com/assets/images/h2-console-e8bfac303897f7e1037420b76f394569.png" width="1522" height="858" class="img_ev3q"></th></tr></thead></table>
<table><thead><tr><th><img decoding="async" loading="lazy" alt="H2 SELECT ALL BOOKS" src="https://shahpreetk.com/assets/images/h2-all-books-ce55cd6ea3c3e512b113d447c18a920a.png" width="1600" height="1047" class="img_ev3q"></th></tr></thead></table>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>Part 2 of this blog post will use Lombok for the Book Entity and will cover the creation of the Book Repository, Service, and Controller classes to perform CRUD operations on the Book Entity.</p></div></div>]]></content:encoded>
            <category>java</category>
            <category>springboot</category>
            <category>intellij</category>
            <category>gradle</category>
            <category>h2-database</category>
            <category>RestApi</category>
            <category>web-development</category>
        </item>
        <item>
            <title><![CDATA[Multithreading in Java]]></title>
            <link>https://shahpreetk.com/blog/multithreading-in-java</link>
            <guid>https://shahpreetk.com/blog/multithreading-in-java</guid>
            <pubDate>Wed, 06 Mar 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Multithreading and Concurrency in Java are essential concepts for building scalable and responsive applications. This guide covers the basics of multithreading in Java.]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorWithStickyNavbar_LWe7" id="introduction-to-multithreading">Introduction to Multithreading<a href="https://shahpreetk.com/blog/multithreading-in-java#introduction-to-multithreading" class="hash-link" aria-label="Direct link to Introduction to Multithreading" title="Direct link to Introduction to Multithreading">​</a></h2>
<p>Multi-threading in Java enables a single process to manage multiple threads concurrently, allowing tasks to be executed in parallel. This is achieved through the Thread class or the Runnable interface, empowering developers to create and oversee threads for parallel task execution.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="thread-class-example">Thread Class Example<a href="https://shahpreetk.com/blog/multithreading-in-java#thread-class-example" class="hash-link" aria-label="Direct link to Thread Class Example" title="Direct link to Thread Class Example">​</a></h3>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">class</span><span class="token plain"> </span><span class="token class-name">MyThread</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">extends</span><span class="token plain"> </span><span class="token class-name">Thread</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">public</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">void</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">run</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token comment" style="color:rgb(98, 114, 164)">// Task to be performed concurrently</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token maybe-class-name">System</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">out</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">println</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"Thread running..."</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// Printing a message indicating that the thread is running</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">public</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">class</span><span class="token plain"> </span><span class="token class-name">Main</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">public</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">static</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">void</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">main</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token parameter known-class-name class-name">String</span><span class="token parameter punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token parameter punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token parameter"> args</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token maybe-class-name">MyThread</span><span class="token plain"> thread1 </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">MyThread</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// Creating an instance of MyThread</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token maybe-class-name">MyThread</span><span class="token plain"> thread2 </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">MyThread</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// Creating another instance of MyThread</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token comment" style="color:rgb(98, 114, 164)">// Starting threads</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        thread1</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">start</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// Starting the first thread</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        thread2</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">start</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// Starting the second thread</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="race-condition">Race Condition<a href="https://shahpreetk.com/blog/multithreading-in-java#race-condition" class="hash-link" aria-label="Direct link to Race Condition" title="Direct link to Race Condition">​</a></h2>
<p>However, multi-threading can introduce race conditions, where program behavior depends on the timing of events, such as the order in which threads execute instructions. This unpredictability may lead to unexpected outcomes as threads concurrently access and modify shared resources, risking data corruption and program state inconsistencies.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="race-condition-example">Race Condition Example<a href="https://shahpreetk.com/blog/multithreading-in-java#race-condition-example" class="hash-link" aria-label="Direct link to Race Condition Example" title="Direct link to Race Condition Example">​</a></h3>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">class</span><span class="token plain"> </span><span class="token class-name">Counter</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">private</span><span class="token plain"> int count </span><span class="token operator">=</span><span class="token plain"> </span><span class="token number">0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// Initializing the counter</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)">// Method to increment the counter</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">public</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">void</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">increment</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token doc-comment comment" style="color:rgb(98, 114, 164)">/**</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token doc-comment comment" style="color:rgb(98, 114, 164)">         * Since this method is accessed by multiple threads (thread1 and thread2), there is a possibility that both threads may execute this line concurrently.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token doc-comment comment" style="color:rgb(98, 114, 164)">         * If both threads execute count++ at the same time, it can lead to a race condition where the final value of count may not be the expected result.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token doc-comment comment" style="color:rgb(98, 114, 164)">         * This is because both threads are reading the current value of count, incrementing it, and then writing the updated value back to count.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token doc-comment comment" style="color:rgb(98, 114, 164)">         * If these operations are not synchronized, the final result may be inconsistent due to interleaving of operations from different threads.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token doc-comment comment" style="color:rgb(98, 114, 164)">        */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        count</span><span class="token operator">++</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// This operation leads to race condition</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">public</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">class</span><span class="token plain"> </span><span class="token class-name">Main</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">public</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">static</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">void</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">main</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token parameter known-class-name class-name">String</span><span class="token parameter punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token parameter punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token parameter"> args</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token maybe-class-name">Counter</span><span class="token plain"> counter </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">Counter</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// Creating an instance of Counter</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token comment" style="color:rgb(98, 114, 164)">// Creating multiple threads to increment the counter</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token maybe-class-name">Thread</span><span class="token plain"> thread1 </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">Thread</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token operator">-</span><span class="token operator">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">for</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">int i </span><span class="token operator">=</span><span class="token plain"> </span><span class="token number">0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> i </span><span class="token operator">&lt;</span><span class="token plain"> </span><span class="token number">1000</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> i</span><span class="token operator">++</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">                counter</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">increment</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// Incrementing the counter</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token maybe-class-name">Thread</span><span class="token plain"> thread2 </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">Thread</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token operator">-</span><span class="token operator">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">for</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">int i </span><span class="token operator">=</span><span class="token plain"> </span><span class="token number">0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> i </span><span class="token operator">&lt;</span><span class="token plain"> </span><span class="token number">1000</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> i</span><span class="token operator">++</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">                counter</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">increment</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// Incrementing the counter</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token comment" style="color:rgb(98, 114, 164)">// Starting the threads</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        thread1</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">start</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// Starting the first thread</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        thread2</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">start</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// Starting the second thread</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token comment" style="color:rgb(98, 114, 164)">// Waiting for threads to complete</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">try</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            thread1</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">join</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// Waiting for the first thread to complete</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            thread2</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">join</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// Waiting for the second thread to complete</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">catch</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token maybe-class-name">InterruptedException</span><span class="token plain"> e</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            e</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">printStackTrace</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// Handling InterruptedException</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token comment" style="color:rgb(98, 114, 164)">// Displaying the final count</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token maybe-class-name">System</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">out</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">println</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"Final count: "</span><span class="token plain"> </span><span class="token operator">+</span><span class="token plain"> counter</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">getCount</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// Printing the final count</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="mitigating-race-conditions">Mitigating Race Conditions<a href="https://shahpreetk.com/blog/multithreading-in-java#mitigating-race-conditions" class="hash-link" aria-label="Direct link to Mitigating Race Conditions" title="Direct link to Mitigating Race Conditions">​</a></h2>
<p>To mitigate race conditions in Java, synchronization mechanisms like locks, semaphores, and monitors are utilized. These mechanisms control access to shared resources, ensuring that only one thread can access and modify the resource at a time. By preventing simultaneous access and modification of shared resources, these measures diminish the likelihood of data corruption and enhance program reliability.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="lock-example">Lock Example<a href="https://shahpreetk.com/blog/multithreading-in-java#lock-example" class="hash-link" aria-label="Direct link to Lock Example" title="Direct link to Lock Example">​</a></h3>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> java</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">util</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">concurrent</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">locks</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access maybe-class-name">Lock</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> java</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">util</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">concurrent</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">locks</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access maybe-class-name">ReentrantLock</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">class</span><span class="token plain"> </span><span class="token class-name">Counter</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">private</span><span class="token plain"> int count </span><span class="token operator">=</span><span class="token plain"> </span><span class="token number">0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// Initializing the counter</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)">// Creating a lock for synchronization</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">private</span><span class="token plain"> </span><span class="token maybe-class-name">Lock</span><span class="token plain"> lock </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">ReentrantLock</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// Creating a lock</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)">// Method to increment the counter using a lock</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">public</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">void</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">increment</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        lock</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">lock</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// Acquiring the lock</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">try</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            count</span><span class="token operator">++</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// Incrementing the counter</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">finally</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            lock</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">unlock</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// Releasing the lock</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)">// Method to get the current value of the counter</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">public</span><span class="token plain"> int </span><span class="token function" style="color:rgb(80, 250, 123)">getCount</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> count</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">public</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">class</span><span class="token plain"> </span><span class="token class-name">Main</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">public</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">static</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">void</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">main</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token parameter known-class-name class-name">String</span><span class="token parameter punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token parameter punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token parameter"> args</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token maybe-class-name">Counter</span><span class="token plain"> counter </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">Counter</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// Creating an instance of Counter</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token comment" style="color:rgb(98, 114, 164)">// Creating multiple threads to increment the counter</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token maybe-class-name">Thread</span><span class="token plain"> thread1 </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">Thread</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token operator">-</span><span class="token operator">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">for</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">int i </span><span class="token operator">=</span><span class="token plain"> </span><span class="token number">0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> i </span><span class="token operator">&lt;</span><span class="token plain"> </span><span class="token number">1000</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> i</span><span class="token operator">++</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">                counter</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">increment</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// Incrementing the counter</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token maybe-class-name">Thread</span><span class="token plain"> thread2 </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">Thread</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token operator">-</span><span class="token operator">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">for</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">int i </span><span class="token operator">=</span><span class="token plain"> </span><span class="token number">0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> i </span><span class="token operator">&lt;</span><span class="token plain"> </span><span class="token number">1000</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> i</span><span class="token operator">++</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">                counter</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">increment</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// Incrementing the counter</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token comment" style="color:rgb(98, 114, 164)">// Starting the threads</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        thread1</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">start</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        thread2</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">start</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token comment" style="color:rgb(98, 114, 164)">// Waiting for threads to complete</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">try</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            thread1</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">join</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            thread2</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">join</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">catch</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token maybe-class-name">InterruptedException</span><span class="token plain"> e</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            e</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">printStackTrace</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token comment" style="color:rgb(98, 114, 164)">// Displaying the final count</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token maybe-class-name">System</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">out</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">println</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"Final count: "</span><span class="token plain"> </span><span class="token operator">+</span><span class="token plain"> counter</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">getCount</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="conclusion">Conclusion<a href="https://shahpreetk.com/blog/multithreading-in-java#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion">​</a></h2>
<p>Multithreading and concurrency are crucial in Java for creating scalable and responsive apps. However, dealing with issues like race conditions requires careful attention. By using synchronization mechanisms, developers can handle these challenges and ensure their multithreaded apps run smoothly.</p>]]></content:encoded>
            <category>java</category>
            <category>multithreading</category>
            <category>race-condition</category>
            <category>concurrency</category>
            <category>lock</category>
            <category>semaphore</category>
            <category>monitor</category>
            <category>synchronization</category>
        </item>
        <item>
            <title><![CDATA[Garbage Collector in Java]]></title>
            <link>https://shahpreetk.com/blog/garbage-collector-in-java</link>
            <guid>https://shahpreetk.com/blog/garbage-collector-in-java</guid>
            <pubDate>Mon, 04 Mar 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Garbage Collection in Java is the process of reclaiming the runtime unused memory automatically. In this blog, we will learn about the Garbage Collector in Java.]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorWithStickyNavbar_LWe7" id="introduction-to-garbage-collection">Introduction to Garbage Collection<a href="https://shahpreetk.com/blog/garbage-collector-in-java#introduction-to-garbage-collection" class="hash-link" aria-label="Direct link to Introduction to Garbage Collection" title="Direct link to Introduction to Garbage Collection">​</a></h2>
<p>In languages like C/C++, managing memory manually is a crucial task for programmers. Forgetting to deallocate memory can lead to memory leaks and program crashes due to insufficient memory. However, Java provides an automatic memory management system known as the Garbage Collector (GC), which handles memory deallocation for you.</p>
<p>The garbage collection process operates within the JVM. Its job is to clean up heap memory by getting rid of objects that are no longer needed/referenced.</p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>A referenced object is one that some part of your program still points to, while an unreferenced object is not pointed to by any part of your program.</p></div></div>
<p>Therefore, memory occupied by an unreferenced object can be reclaimed. Programmers don't have to specify objects for deletion explicitly.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="how-to-invoke-the-garbage-collector">How to invoke the garbage collector?<a href="https://shahpreetk.com/blog/garbage-collector-in-java#how-to-invoke-the-garbage-collector" class="hash-link" aria-label="Direct link to How to invoke the garbage collector?" title="Direct link to How to invoke the garbage collector?">​</a></h2>
<p>You can request the JVM to run the garbage collector using - <code>System.gc()</code> or <code>Runtime.getRuntime().gc()</code>. However, it's not guaranteed that the garbage collector will run immediately after calling these methods. The garbage collector runs when the JVM thinks it's necessary.
Before an object is destroyed, the Garbage Collector triggers the <code>finalize()</code> method for cleanup. Once done, the Garbage Collector disposes of the object.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="the-finalize-method">The <code>finalize()</code> method<a href="https://shahpreetk.com/blog/garbage-collector-in-java#the-finalize-method" class="hash-link" aria-label="Direct link to the-finalize-method" title="Direct link to the-finalize-method">​</a></h3>
<p>The <code>finalize()</code> method, found in the Object class, can be overridden for custom cleanup tasks like closing database connections. Although called by the Garbage Collector, it's part of the JVM. It's advised to override <code>finalize()</code> for resource disposal since the default implementation is empty. <code>finalize()</code> is only invoked once per object and ignores uncaught exceptions during execution.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="how-does-the-garbage-collector-work">How does the Garbage Collector work?<a href="https://shahpreetk.com/blog/garbage-collector-in-java#how-does-the-garbage-collector-work" class="hash-link" aria-label="Direct link to How does the Garbage Collector work?" title="Direct link to How does the Garbage Collector work?">​</a></h2>
<p>Here's a simplified overview of how Java garbage collection works:</p>
<ul>
<li>
<p><u><strong>Memory Allocation</strong></u>: When you create objects in Java using the new keyword, memory is allocated for those objects on the heap. The heap is the region of memory where Java objects are stored.</p>
</li>
<li>
<p><u><strong>Marking Phase</strong></u>: Java garbage collection uses a process called <em>mark and sweep</em>. During the marking phase, the garbage collector identifies which objects in the heap are still reachable, starting from the root objects (e.g., objects referenced by active threads, static variables, and local variables on the stack) and recursively marking all objects that are reachable from them. <strong>Any objects not marked as reachable are considered garbage.</strong></p>
</li>
<li>
<p><u><strong>Sweeping Phase</strong></u>: In the sweeping phase, the garbage collector removes (sweeps) the memory occupied by the unreferenced objects, effectively reclaiming it for future use. This reclaimed memory becomes available for allocating new objects.</p>
</li>
<li>
<p><u><strong>Compacting (Optional)</strong></u>: Some garbage collectors, such as the G1 Garbage Collector, may perform an optional compaction phase after marking and sweeping. Compaction rearranges the memory to reduce fragmentation, which can improve memory allocation efficiency and reduce memory usage.</p>
</li>
<li>
<p><u><strong>Finalization</strong></u>: Before an object is reclaimed by the Garbage Collector, it invokes the <code>finalize()</code> method if it's overridden. This method allows for any necessary cleanup operations to be performed. Once the <code>finalize()</code> method completes, the Garbage Collector proceeds to dispose of the object.</p>
</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="types-of-garbage-collectors">Types of Garbage Collectors<a href="https://shahpreetk.com/blog/garbage-collector-in-java#types-of-garbage-collectors" class="hash-link" aria-label="Direct link to Types of Garbage Collectors" title="Direct link to Types of Garbage Collectors">​</a></h2>
<p>There are several types of garbage collectors in Java, each designed to handle memory management differently. Here are some common types:</p>
<ul>
<li>
<p><strong>Serial Garbage Collector:</strong></p>
<ul>
<li>Uses a single thread for garbage collection.</li>
<li>Suitable for applications with smaller heaps or those that prioritize low CPU usage.</li>
<li>Freezes the application thread during garbage collection.</li>
</ul>
</li>
<li>
<p><strong>Parallel Garbage Collector</strong> (also known as the <em>Throughput Collector</em>):</p>
<ul>
<li>Utilizes multiple threads to perform garbage collection tasks in parallel.</li>
<li>Significantly reduce pause times for large-scale applications.</li>
<li>Freezes the application thread during garbage collection, but it utilizes multiple threads to reduce the duration of the pause.</li>
</ul>
</li>
<li>
<p><strong>CMS (Concurrent Mark-Sweep) Garbage Collector:</strong></p>
<ul>
<li>Aims to minimize pause times by running most of its operations concurrently with the application threads.</li>
<li>Suitable for applications where low latency is critical.</li>
<li>May still freeze the application briefly during certain phases.</li>
</ul>
</li>
<li>
<p><strong>G1 (Garbage-First) Garbage Collector:</strong></p>
<ul>
<li>Engineered to achieve low pause times and high throughput, it divides the heap into smaller regions and prioritizes garbage collection on those regions with the most garbage, all while running concurrently with the application threads.</li>
<li>May still pause the application briefly during mixed garbage collection phases.</li>
</ul>
</li>
<li>
<p><strong>Z Garbage Collector (ZGC):</strong></p>
<ul>
<li>Introduced in Java 11.</li>
<li>Scalable garbage collector designed for large heaps and low-latency applications.</li>
<li>Operates concurrently to the application threads.</li>
<li>Aims to minimize pause times without freezing the application thread for extended periods.</li>
</ul>
</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="conclusion">Conclusion<a href="https://shahpreetk.com/blog/garbage-collector-in-java#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion">​</a></h2>
<p>Understanding Java's Garbage Collector is essential for Java developers to write efficient and reliable applications. With its automatic memory management capabilities, Java simplifies memory management and reduces the risk of memory-related issues.</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="references">References<a href="https://shahpreetk.com/blog/garbage-collector-in-java#references" class="hash-link" aria-label="Direct link to References" title="Direct link to References">​</a></h4>
<ul>
<li><a href="https://www.geeksforgeeks.org/garbage-collection-java/" target="_blank" rel="noopener noreferrer">Garbage Collection in Java</a></li>
</ul>]]></content:encoded>
            <category>java</category>
            <category>garbage-collector</category>
            <category>memory-management</category>
        </item>
        <item>
            <title><![CDATA[Access Modifiers in Java]]></title>
            <link>https://shahpreetk.com/blog/access-modifiers-in-java</link>
            <guid>https://shahpreetk.com/blog/access-modifiers-in-java</guid>
            <pubDate>Sun, 03 Mar 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Access Modifiers in Java are used to define the scope of classes, constructors, variables, and methods. Learn about public, private, protected, and default access modifiers in Java.]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorWithStickyNavbar_LWe7" id="introduction-to-access-modifiers">Introduction to Access Modifiers<a href="https://shahpreetk.com/blog/access-modifiers-in-java#introduction-to-access-modifiers" class="hash-link" aria-label="Direct link to Introduction to Access Modifiers" title="Direct link to Introduction to Access Modifiers">​</a></h2>
<p>Java access modifiers are fundamental to Java's object-oriented nature, providing various levels of encapsulation by controlling access to classes, fields, methods, and constructors. Understanding these is crucial for designing secure, well-structured, and maintainable Java applications. Here's a more detailed dive into each of the Java access modifiers:</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="no-modifier-default-access">No Modifier (Default Access)<a href="https://shahpreetk.com/blog/access-modifiers-in-java#no-modifier-default-access" class="hash-link" aria-label="Direct link to No Modifier (Default Access)" title="Direct link to No Modifier (Default Access)">​</a></h3>
<ul>
<li><strong>Scope</strong>: Accessible within the same package only.</li>
<li><strong>Usage Context</strong>: Used when you want to share data or methods among classes that are bundled together in the same package, without exposing them to the entire universe of your application.</li>
<li><strong>Example</strong>: If you have a class DefaultClass with default access in a package <code>com.example</code>, this class can be accessed by any other class within <code>com.example</code> but not outside of it.</li>
</ul>
<div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">class DefaultClass {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    int defaultVariable;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    void defaultMethod() {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        // Code...</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="private">Private<a href="https://shahpreetk.com/blog/access-modifiers-in-java#private" class="hash-link" aria-label="Direct link to Private" title="Direct link to Private">​</a></h3>
<ul>
<li><strong>Scope</strong>: Accessible within the class only.</li>
<li><strong>Usage Context</strong>: Typically used for utility methods or variables that are only meant to be used internally by the enclosing class. It's a way to hide the internal details and mechanics of a class.</li>
<li><strong>Example</strong>: Private member variables in a class are often used in conjunction with public <code>getter</code> and <code>setter</code> methods to provide controlled access (encapsulation).</li>
</ul>
<div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">class PrivateClass {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    private int privateVariable;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    private void privateMethod() {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        // Code...</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    public int getPrivateVariable() {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        return privateVariable;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    public void setPrivateVariable(int privateVariable) {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        this.privateVariable = privateVariable;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="protected">Protected<a href="https://shahpreetk.com/blog/access-modifiers-in-java#protected" class="hash-link" aria-label="Direct link to Protected" title="Direct link to Protected">​</a></h3>
<ul>
<li><strong>Scope</strong>: Accessible within the same package and by subclasses (even if they are located in different packages).</li>
<li><strong>Usage Context</strong>: Used when you want to hide a class, method, or field from other code except for subclasses, which might need to use or override the protected members.</li>
<li><strong>Example</strong>: In a class hierarchy, if a method in the superclass is marked as protected, then only subclasses (and other classes in the same package) can access it.</li>
</ul>
<div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">class ProtectedClass {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    protected int protectedVariable;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    protected void protectedMethod() {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        // Code...</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">}</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">@override</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">class SubClass extends ProtectedClass {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    void subClassMethod() {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        protectedMethod(); // Accessible</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">}</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="public">Public<a href="https://shahpreetk.com/blog/access-modifiers-in-java#public" class="hash-link" aria-label="Direct link to Public" title="Direct link to Public">​</a></h3>
<ul>
<li><strong>Scope</strong>: Accessible from any other class.</li>
<li><strong>Usage Context</strong>: Used when you need to provide a broad access level. Typically, public access is used for API definitions, where you want to expose functionalities to the outside world.</li>
<li><strong>Example</strong>: Public methods or constants which are intended to be used by any other classes.</li>
</ul>
<div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">public class PublicClass {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    public int publicVariable;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    public void publicMethod() {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        // Code...</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="additional-notes">Additional Notes<a href="https://shahpreetk.com/blog/access-modifiers-in-java#additional-notes" class="hash-link" aria-label="Direct link to Additional Notes" title="Direct link to Additional Notes">​</a></h3>
<ul>
<li>
<p><strong>Class Level Access</strong>: Note that top-level Java classes (those not inner classes) can only be public or package-private (no access modifier). Inner classes, however, can also be private or protected.</p>
</li>
<li>
<p><strong>Constructors</strong>: Like methods and variables, constructors can also have access modifiers. For instance, a private constructor means that a class cannot be instantiated outside of its own context, a common pattern in singleton classes.</p>
</li>
<li>
<p><strong>Interface Methods</strong>: All methods in an interface are implicitly public, so when you implement an interface, the implementing methods must be declared public.</p>
</li>
<li>
<p><strong>Inheritance and Access Modifiers</strong>: Access levels affect how classes inherit from one another. For example, a subclass cannot narrow the access of a method it inherits (e.g., cannot override a public method with a protected one).</p>
</li>
<li>
<p><strong>Best Practices</strong>: It's considered good practice to make fields private unless there is a good reason not to. This encapsulation principle helps in maintaining the integrity of an object's state. Similarly, always use the least permissive access level necessary for functionality to enhance security and robustness.</p>
</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="conclusion">Conclusion<a href="https://shahpreetk.com/blog/access-modifiers-in-java#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion">​</a></h2>
<p>By using access modifiers sensibly, Java developers can ensure that their classes are used correctly and that internal data remains protected from unintended access and modification.</p>]]></content:encoded>
            <category>java</category>
            <category>access-modifiers</category>
            <category>public</category>
            <category>protected</category>
            <category>default</category>
            <category>private</category>
        </item>
        <item>
            <title><![CDATA[Data Types in Java]]></title>
            <link>https://shahpreetk.com/blog/data-types-in-java</link>
            <guid>https://shahpreetk.com/blog/data-types-in-java</guid>
            <pubDate>Sat, 02 Mar 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Dive into the different data types in Java, including primitive types, reference types, and wrapper classes.]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorWithStickyNavbar_LWe7" id="introduction-to-data-types-in-java">Introduction to Data Types in Java<a href="https://shahpreetk.com/blog/data-types-in-java#introduction-to-data-types-in-java" class="hash-link" aria-label="Direct link to Introduction to Data Types in Java" title="Direct link to Introduction to Data Types in Java">​</a></h2>
<p>Data types in Java specify the size, type, and operations of data that can be stored in a variable. In Java, a statically-typed language, every variable must be declared with a data type. The data type of a variable determines how much space it occupies in memory and what kind of operations can be performed on it.</p>
<!-- -->
<p>Java categorizes data types into primitive types, reference types, and wrapper classes.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="primitive-data-types">Primitive Data Types<a href="https://shahpreetk.com/blog/data-types-in-java#primitive-data-types" class="hash-link" aria-label="Direct link to Primitive Data Types" title="Direct link to Primitive Data Types">​</a></h2>
<p>Primitive data types are built-in Java types that are not objects; they represent raw values. They include:</p>
<ol>
<li><code>byte</code>: 8-bit signed integer</li>
<li><code>short</code>: 16-bit signed integer</li>
<li><code>int</code>: 32-bit signed integer</li>
<li><code>long</code>: 64-bit signed integer</li>
<li><code>float</code>: 32-bit floating-point number</li>
<li><code>double</code>: 64-bit floating-point number</li>
<li><code>char</code>: 16-bit Unicode character</li>
<li><code>boolean</code>: true or false</li>
</ol>
<div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">byte exampleByte = 100;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">short exampleShort = 5000;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">int exampleInt = 123456;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">long exampleLong = 12345678910L;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">float exampleFloat = 3.14f;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">double exampleDouble = 3.14159;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">char exampleChar = 'A';</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">boolean exampleBoolean = true;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="reference-data-types">Reference Data Types<a href="https://shahpreetk.com/blog/data-types-in-java#reference-data-types" class="hash-link" aria-label="Direct link to Reference Data Types" title="Direct link to Reference Data Types">​</a></h2>
<p>Reference data types refer to objects and hence they are stored by reference. Examples include:</p>
<ul>
<li>
<p>Basic Reference Types:</p>
<ol>
<li><code>class</code>: Holds a reference to a class.</li>
<li><code>interface</code>: A reference to an implemented interface.</li>
<li><code>enum</code>: A special data type that enables for variables to be a set of predefined constants.</li>
<li><code>lambda</code>: A reference to a lambda expression.</li>
<li><code>String</code>: A reference to a string.</li>
<li><code>Runnable</code>: A reference to a runnable object.</li>
<li><code>Record</code>: A reference to a record.</li>
</ol>
</li>
</ul>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)">// Class</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">class</span><span class="token plain"> </span><span class="token class-name">ExampleClass</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token comment" style="color:rgb(98, 114, 164)">// Code...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)">// Interface</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">interface</span><span class="token plain"> </span><span class="token class-name">ExampleInterface</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token comment" style="color:rgb(98, 114, 164)">// Code...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)">// Enum</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">enum</span><span class="token plain"> </span><span class="token maybe-class-name">Size</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token constant" style="color:rgb(189, 147, 249)">SMALL</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token constant" style="color:rgb(189, 147, 249)">MEDIUM</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token constant" style="color:rgb(189, 147, 249)">LARGE</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token maybe-class-name">Size</span><span class="token plain"> exampleSize </span><span class="token operator">=</span><span class="token plain"> </span><span class="token maybe-class-name">Size</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token constant" style="color:rgb(189, 147, 249)">MEDIUM</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)">// Lambda</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token maybe-class-name">Runnable</span><span class="token plain"> exampleRunnable </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token operator">-</span><span class="token operator">&gt;</span><span class="token plain"> </span><span class="token maybe-class-name">System</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">out</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">println</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"Running"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)">// Lambda with parameters</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token maybe-class-name">Comparator</span><span class="token operator">&lt;</span><span class="token maybe-class-name">Integer</span><span class="token operator">&gt;</span><span class="token plain"> exampleComparator </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">a</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> b</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token operator">-</span><span class="token operator">&gt;</span><span class="token plain"> a </span><span class="token operator">-</span><span class="token plain"> b</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)">// Lambda with return statement</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token known-class-name class-name">Function</span><span class="token operator">&lt;</span><span class="token maybe-class-name">Integer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token maybe-class-name">Integer</span><span class="token operator">&gt;</span><span class="token plain"> exampleFunction </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">a</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token operator">-</span><span class="token operator">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> a </span><span class="token operator">*</span><span class="token plain"> a</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)">// String</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token known-class-name class-name">String</span><span class="token plain"> exampleString </span><span class="token operator">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Hello, World!"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)">// Runnable</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token maybe-class-name">Runnable</span><span class="token plain"> exampleRunnable </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token operator">-</span><span class="token operator">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token comment" style="color:rgb(98, 114, 164)">// Code...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)">// Record</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  record </span><span class="token function maybe-class-name" style="color:rgb(80, 250, 123)">ExampleRecord</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token parameter">int id</span><span class="token parameter punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token parameter"> </span><span class="token parameter known-class-name class-name">String</span><span class="token parameter"> name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token comment" style="color:rgb(98, 114, 164)">// Code...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<ul>
<li>
<p>Collections and Iterators:</p>
<ol>
<li><code>array</code>: A reference to a dynamically allocated array.</li>
<li><code>List</code>: A reference to a dynamically sized collection of elements.</li>
<li><code>Map</code>: A reference to a collection of key-value pairs.</li>
<li><code>Set</code>: A reference to a collection that contains no duplicate elements.</li>
<li><code>Iterator</code>: A reference to an object that enables traversal through a collection.</li>
</ol>
</li>
</ul>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)">// array</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  int</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"> exampleArray </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">int</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token number">5</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)">// List</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token maybe-class-name">List</span><span class="token operator">&lt;</span><span class="token known-class-name class-name">String</span><span class="token operator">&gt;</span><span class="token plain"> exampleList </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">ArrayList</span><span class="token operator">&lt;</span><span class="token operator">&gt;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)">// Map</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token known-class-name class-name">Map</span><span class="token operator">&lt;</span><span class="token known-class-name class-name">String</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token maybe-class-name">Integer</span><span class="token operator">&gt;</span><span class="token plain"> exampleMap </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">HashMap</span><span class="token operator">&lt;</span><span class="token operator">&gt;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)">// Set</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token known-class-name class-name">Set</span><span class="token operator">&lt;</span><span class="token known-class-name class-name">String</span><span class="token operator">&gt;</span><span class="token plain"> exampleSet </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">HashSet</span><span class="token operator">&lt;</span><span class="token operator">&gt;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)">// Iterator</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token maybe-class-name">Iterator</span><span class="token operator">&lt;</span><span class="token known-class-name class-name">String</span><span class="token operator">&gt;</span><span class="token plain"> exampleIterator </span><span class="token operator">=</span><span class="token plain"> exampleList</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token method function property-access" style="color:rgb(80, 250, 123)">iterator</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<ul>
<li>
<p>Concurrency and IO:</p>
<ol>
<li><code>Thread</code>: A reference to a thread of execution.</li>
<li><code>Exception</code>: A reference to an exception object.</li>
<li><code>Annotation</code>: A reference to an annotation.</li>
<li><code>Socket</code>: A reference to a network communication endpoint.</li>
<li><code>File</code>: A reference to a file or directory in the file system.</li>
<li><code>Scanner</code>: A reference to an object used to parse primitive types and strings from an input stream.</li>
</ol>
</li>
</ul>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)">// Thread</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token maybe-class-name">Thread</span><span class="token plain"> exampleThread </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">Thread</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token operator">-</span><span class="token operator">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token comment" style="color:rgb(98, 114, 164)">// Code...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)">// Exception</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">try</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token comment" style="color:rgb(98, 114, 164)">// Code...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:rgb(189, 147, 249);font-style:italic">catch</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token maybe-class-name">Exception</span><span class="token plain"> e</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token comment" style="color:rgb(98, 114, 164)">// Code...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)">// Annotation</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  @</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">interface</span><span class="token plain"> </span><span class="token class-name">ExampleAnnotation</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token comment" style="color:rgb(98, 114, 164)">// Code...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)">// Socket</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token maybe-class-name">Socket</span><span class="token plain"> exampleSocket </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">Socket</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"localhost"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">8080</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)">// File</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token maybe-class-name">File</span><span class="token plain"> exampleFile </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">File</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"example.txt"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)">// Scanner</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token maybe-class-name">Scanner</span><span class="token plain"> exampleScanner </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">Scanner</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token maybe-class-name">System</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">in</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="wrapper-classes">Wrapper Classes<a href="https://shahpreetk.com/blog/data-types-in-java#wrapper-classes" class="hash-link" aria-label="Direct link to Wrapper Classes" title="Direct link to Wrapper Classes">​</a></h2>
<p>Java also provides a set of wrapper classes that correspond to the primitive data types. These wrapper classes are used to create objects from primitive data types, and to perform operations on primitive data types. The wrapper classes are:</p>
<ol>
<li><code>Byte</code>: Wrapper class for <code>byte</code></li>
<li><code>Short</code>: Wrapper class for <code>short</code></li>
<li><code>Integer</code>: Wrapper class for <code>int</code></li>
<li><code>Long</code>: Wrapper class for <code>long</code></li>
<li><code>Float</code>: Wrapper class for <code>float</code></li>
</ol>
<div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">Byte exampleWrappedByte = 100;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">Short exampleWrappedShort = 5000;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">Integer exampleWrappedInt = 123456;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">Long exampleWrappedLong = 12345678910L;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">Float exampleWrappedFloat = 3.14f;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">Double exampleWrappedDouble = 3.14159;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">Character exampleWrappedChar = 'A';</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">Boolean exampleWrappedBoolean = true;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Autoboxing is the automatic conversion that the Java compiler makes between the primitive types and their corresponding object wrapper classes. For example, converting an <code>int</code> to an <code>Integer</code>, a <code>double</code> to a <code>Double</code>, etc. Similarly, unboxing is the reverse process:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">// Autoboxing</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token maybe-class-name">Integer</span><span class="token plain"> autoBoxedInt </span><span class="token operator">=</span><span class="token plain"> </span><span class="token number">10</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// int to Integer</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">// Unboxing</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">int unboxedInt </span><span class="token operator">=</span><span class="token plain"> autoBoxedInt</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// Integer to int</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="differences-between-primitive-and-wrapper-classes">Differences Between Primitive and Wrapper Classes<a href="https://shahpreetk.com/blog/data-types-in-java#differences-between-primitive-and-wrapper-classes" class="hash-link" aria-label="Direct link to Differences Between Primitive and Wrapper Classes" title="Direct link to Differences Between Primitive and Wrapper Classes">​</a></h2>
<table><thead><tr><th>Aspect</th><th>Primitive Types</th><th>Wrapper Classes</th></tr></thead><tbody><tr><td>Type</td><td>Basic data type</td><td>Class type (Object)</td></tr><tr><td>Storage</td><td>Stack</td><td>Heap</td></tr><tr><td>Default Value</td><td>Has default value (e.g., 0 for int)</td><td>Null (if not initialized)</td></tr><tr><td>Size</td><td>Fixed size</td><td>Larger than primitives due to object overhead</td></tr><tr><td>Speed</td><td>Fast</td><td>Slower than primitives due to additional processing</td></tr><tr><td>Utility</td><td>Limited to basic arithmetic and logical operations</td><td>Comes with methods for conversion, comparison, etc.</td></tr><tr><td>Usage in Generics</td><td>Not applicable</td><td>Can be used with generics and collections</td></tr><tr><td>Nullability</td><td>Cannot be null</td><td>Can be null</td></tr></tbody></table>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="conclusion">Conclusion<a href="https://shahpreetk.com/blog/data-types-in-java#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion">​</a></h2>
<p>In this article, we discussed the different data types and access modifiers in Java. We learned about primitive types, reference types, and wrapper classes, and how they differ from each other. We also explored the four access modifiers in Java and their use cases. Understanding these concepts is essential for writing efficient and secure Java code.</p>]]></content:encoded>
            <category>java</category>
            <category>data-types</category>
            <category>primitive-types</category>
            <category>reference-types</category>
            <category>wrapper-classes</category>
        </item>
        <item>
            <title><![CDATA[Java Deep Dive]]></title>
            <link>https://shahpreetk.com/blog/java-interview-guide</link>
            <guid>https://shahpreetk.com/blog/java-interview-guide</guid>
            <pubDate>Fri, 01 Mar 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[A guide to prepare for Java interviews]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorWithStickyNavbar_LWe7" id="java-interview-guide">Java Interview Guide<a href="https://shahpreetk.com/blog/java-interview-guide#java-interview-guide" class="hash-link" aria-label="Direct link to Java Interview Guide" title="Direct link to Java Interview Guide">​</a></h2>
<p>This guide is a collection of resources to prepare for Java interviews.</p>
<!-- -->
<table><thead><tr><th>ID</th><th>Blog Title</th><th>Blog Description</th></tr></thead><tbody><tr><td>1</td><td><a href="https://shahpreetk.com/blog/data-types-in-java"> <!-- -->Data Types in Java<!-- --> </a></td><td>Dive into the different data types in Java, including primitive types, reference types, and wrapper classes.</td></tr><tr><td>2</td><td><a href="https://shahpreetk.com/blog/access-modifiers-in-java"> <!-- -->Access Modifiers in Java<!-- --> </a></td><td>Access Modifiers in Java are used to define the scope of classes, constructors, variables, and methods. Learn about public, private, protected, and default access modifiers in Java.</td></tr><tr><td>3</td><td><a href="https://shahpreetk.com/blog/garbage-collector-in-java"> <!-- -->Garbage Collector in Java<!-- --> </a></td><td>Garbage Collection in Java is the process of reclaiming the runtime unused memory automatically. In this blog, we will learn about the Garbage Collector in Java.</td></tr><tr><td>4</td><td><a href="https://shahpreetk.com/blog/multithreading-in-java"> <!-- -->Multithreading in Java<!-- --> </a></td><td>Multithreading and Concurrency in Java are essential concepts for building scalable and responsive applications. This guide covers the basics of multithreading in Java.</td></tr><tr><td>5</td><td><a href="https://shahpreetk.com/blog/setting-up-a-java-spring-boot-project-part-1"> <!-- -->Java Spring Boot Project - Part 1<!-- --> </a></td><td>In this blog post, we guide you through the initial setup of a Java Spring Boot project using Gradle and IntelliJ IDEA. We cover creating a new project with Spring Initializr, setting up dependencies, and configuring an in-memory H2 database.</td></tr><tr><td>6</td><td><a href="https://shahpreetk.com/blog/setting-up-a-java-spring-boot-project-part-2"> <!-- -->Java Spring Boot Project - Part 2<!-- --> </a></td><td>In this blog post, we use lombok to create the Book Entity class. We will then create a repository, service and controller class to perform CRUD operations on the Book Entity. Finally, we will test the REST API using Postman.</td></tr><tr><td>7</td><td><a href="https://shahpreetk.com/blog/setting-up-a-java-spring-boot-project-part-3"> <!-- -->Java Spring Boot Project - Part 3<!-- --> </a></td><td>In this blog post, we will write unit tests for the CRUD operations using JUnit and Mockito. We will also create API documentation using Swagger.io and update our codebase with exception handling.</td></tr></tbody></table>]]></content:encoded>
            <category>data-structures</category>
            <category>java</category>
            <category>algorithms</category>
            <category>garbage-collector</category>
            <category>memory-management</category>
            <category>multithreading</category>
            <category>concurrency</category>
        </item>
        <item>
            <title><![CDATA[Android Development in 2024]]></title>
            <link>https://shahpreetk.com/blog/android-development-in-2024</link>
            <guid>https://shahpreetk.com/blog/android-development-in-2024</guid>
            <pubDate>Sun, 18 Feb 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Learning Android Development using Java in 2024]]></description>
            <content:encoded><![CDATA[<ol>
<li>I started learning Android Development with Java through a helpful guide at <a href="https://developer.android.com/codelabs/android-room-with-a-view" target="_blank" rel="noopener noreferrer">https://developer.android.com/codelabs/android-room-with-a-view</a></li>
</ol>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>I decided to begin my Android development journey with Java since it's what I'm already familiar with, even though most tutorials nowadays use Kotlin.</p><p>To prepare for the codelab, I checked out some prerequisite materials and stumbled upon the helpful Android Development videos by Meisam Mansourzadeh on <a href="https://www.freecodecamp.org/" target="_blank" rel="noopener noreferrer">freeCodeCamp.org</a>. These tutorials taught me a lot about RecyclerView and Adapters, which are essential for building Android apps.</p><p>Part 1: <a href="https://www.youtube.com/watch?v=fis26HvvDII" target="_blank" rel="noopener noreferrer">https://www.youtube.com/watch?v=fis26HvvDII</a></p><p>Part 2: <a href="https://www.youtube.com/watch?v=RcSHAkpwXAQ" target="_blank" rel="noopener noreferrer">https://www.youtube.com/watch?v=RcSHAkpwXAQ</a></p></div></div>
<ol start="2">
<li>
<p>The guide had lots of useful links that really helped me grasp the concepts.</p>
</li>
<li>
<p>Installing Android Studio was easy, and its templates made setting up my first project quick, which was great for a beginner like me.</p>
</li>
<li>
<p>I finished the entire guide in one day, which shows how good the instructions were.</p>
</li>
<li>
<p>Coming from using React for frontend, using XML for UI felt a bit odd to me, but I'm going to explore alternative ways to style the UI. I came across Jetpack Compose a lot, which I'm going to check out next.</p>
</li>
<li>
<p>I had a small issue with the app name not showing, maybe because of using a different Android version or template for Java, but my app worked well on the emulator without any major problems.</p>
</li>
</ol>
<p>A demo of the app -</p>
<video width="480" height="480" controls=""><source src="/files/androidApp.mp4" type="video/mp4"></video>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>Key Insights:</p><ul>
<li>I gained a comprehensive understanding of Architecture Components such as <code>LiveData</code>, <code>ViewModel</code>, and <code>Room</code>, and their pivotal role in architecting resilient Android applications.</li>
<li>Delving into Room for database management and migrations unveiled its significance in ensuring efficient data storage and seamless schema evolution. <a href="https://medium.com/androiddevelopers/understanding-migrations-with-room-f01e04b07929" target="_blank" rel="noopener noreferrer">Florina Muntenescu's article, 'Understanding Migrations with Room'</a>, offered indispensable guidance in navigating the complexities of database versioning and migration strategies.</li>
<li>Exploring the intricacies of <code>RecyclerView</code> and <code>Adapters</code> provided valuable insights into optimizing UI performance, particularly in the context of managing large datasets and dynamic content presentation.</li>
</ul></div></div>]]></content:encoded>
            <category>android</category>
            <category>app</category>
            <category>java</category>
            <category>development</category>
        </item>
        <item>
            <title><![CDATA[Disable CORS policy in Chrome]]></title>
            <link>https://shahpreetk.com/blog/disable-cors-policy-in-chrome</link>
            <guid>https://shahpreetk.com/blog/disable-cors-policy-in-chrome</guid>
            <pubDate>Mon, 15 Jan 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Opens a New Chrome Session with CORS disbaled]]></description>
            <content:encoded><![CDATA[<p>To initiate a new Chrome session with CORS disabled on <strong>Windows</strong> for testing purposes, you can use either of the following commands:</p>
<p>Launch the <code>Command Prompt (cmd)</code> terminal and navigate to the directory where the chrome.exe is situated.</p>
<p>Typically, it can be found in either the <strong>Program Files</strong> or <strong>Program Files (x86)</strong> directories. Executing the following commands will initiate a new Chrome window with the security policy disabled:</p>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">C:\Users\shahpreetk&gt; cd C:\Program Files\Google\Chrome\Application</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">⁠</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">C:\Program Files\Google\Chrome\Application&gt; chrome.exe --user-data-dir="C:/temp/chrome" -—disable-web-security </span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>OR</p>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">C:\Users\shahpreetk&gt; cd C:\Program Files (x86)\Google\Chrome\Application</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">⁠</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">C:\Program Files (x86)\Google\Chrome\Application\&gt; ⁠ chrome.exe --user-data-dir="C:/temp/chrome" --disable-web-security ⁠</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>For <strong>Mac</strong>, you can achieve the same testing setup with the following commands:</p>
<ul>
<li>To open a new Chrome session/window with CORS disabled:</li>
</ul>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">open -na "Google Chrome" --args --user-data-dir=/tmp/temporary-chrome-profile-dir --disable-web-security</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<ul>
<li>To open a new Chrome tab in an open Chrome session/window with CORS disabled:</li>
</ul>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">open -a "Google Chrome" --args --disable-web-security --user-data-dir</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>]]></content:encoded>
            <category>cors</category>
            <category>chrome</category>
            <category>same-origin-policy</category>
            <category>windows</category>
            <category>mac</category>
            <category>testing</category>
        </item>
        <item>
            <title><![CDATA[Deploying a Node.js project to Linode]]></title>
            <link>https://shahpreetk.com/blog/deploying-a-nodejs-project-to-linode</link>
            <guid>https://shahpreetk.com/blog/deploying-a-nodejs-project-to-linode</guid>
            <pubDate>Mon, 17 Jul 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Deploying a Node.js project to linode]]></description>
            <content:encoded><![CDATA[<p>To deploy a Node.js app to Linode, follow the instructions below:</p>
<ol start="0">
<li>
<p>Sign up for a Linode account</p>
</li>
<li>
<p>Click on <strong>Create Linode</strong></p>
</li>
<li>
<p>Choose <strong>Ubuntu LTS</strong> for the distribution</p>
</li>
<li>
<p>Choose a <strong>Region</strong> closest to you</p>
</li>
<li>
<p>In the <strong>Linode Plan</strong> section, choose <strong>Shared CPU</strong> and then choose <strong>Nanode 1GB</strong>.</p>
</li>
<li>
<p>Create a Root Password</p>
</li>
<li>
<p>Add an SSH key or choose one from your existing keys</p>
</li>
<li>
<p>Click <strong>Create Linode</strong></p>
</li>
<li>
<p>Wait for the Linode to show <strong>Running</strong></p>
</li>
<li>
<p>Copy the Linode SSH Access, paste it in the terminal and run it</p>
</li>
<li>
<p>When it prompts you asking -&gt; "Are you sure you want to continue connecting (yes/no/fingerprint)?", type "yes"</p>
</li>
<li>
<p>Now, run the following commands -&gt;</p>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">    apt-get update</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    apt-get upgrade</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    apt-get install npm</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    npm i -g n</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    n install lts</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    exit</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
</li>
<li>
<p>Restart the server by entering your SSH Access. The server will now be using the latest node version</p>
</li>
<li>
<p>Make sure your latest project code is pushed to a GitHub repository.</p>
</li>
<li>
<p>Create a SSH key on your server and copy and upload to GitHub.</p>
</li>
<li>
<p>Git clone the repository using SSH.</p>
</li>
<li>
<p>cd into your project and run <code>npm install</code></p>
</li>
<li>
<p>(optional) If you want to copy the .env file from your local machine to the remote server, run the following command:
<code>scp &lt;location_of_file_in_local_machine&gt;/.env root@&lt;server_ip_address&gt;:~/&lt;location_of_project&gt;</code>
You can add a -r flag to the command to copy an entire folder.</p>
</li>
<li>
<p>Run the node project to ensure it's running correctly.</p>
</li>
<li>
<p>Then run the following commands:</p>
</li>
</ol>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">npm i </span><span class="token operator">-</span><span class="token plain">g pm2 </span><span class="token comment" style="color:rgb(98, 114, 164)">// install pm2</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">pm2 start </span><span class="token operator">&lt;</span><span class="token plain">entry_file_name</span><span class="token operator">&gt;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token property-access">js</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">n </span><span class="token operator">&lt;</span><span class="token plain">project_name</span><span class="token operator">&gt;</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// start the project</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">pm2 startup ubuntu </span><span class="token comment" style="color:rgb(98, 114, 164)">// to restart API by itself, in case of crash</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">apt</span><span class="token operator">-</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">get</span><span class="token plain"> install nginx </span><span class="token comment" style="color:rgb(98, 114, 164)">// install nginx for reverse-proxy</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">cd </span><span class="token operator">~</span><span class="token operator">/</span><span class="token plain">etc</span><span class="token operator">/</span><span class="token plain">nginx</span><span class="token operator">/</span><span class="token plain">sites</span><span class="token operator">-</span><span class="token plain">available</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">nano </span><span class="token keyword module" style="color:rgb(189, 147, 249);font-style:italic">default</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<ol start="20">
<li>
<p>In this file make the following changes:</p>
<ul>
<li>
<p>a. At "server*name *;" replace the underscore with your domain name(with and without www prefix) or server IP address.</p>
</li>
<li>
<p>b. In the "location /" block, remove the existing code and add the following:</p>
<div class="language-nginx codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-nginx codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">location / {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">proxy_pass http://localhost:5000;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">proxy_http_version 1.1;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">proxy_set_header Upgrade $http_upgrade;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">proxy_set_header Connection 'upgrade';</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">proxy_set_header Host $host;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">proxy_cache_bypass $http_upgrade;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
</li>
<li>
<p>c. <strong>[Ctrl] + S</strong> to save the file. <strong>[Ctrl] + X</strong> to exit the file.</p>
</li>
</ul>
</li>
<li>
<p>Run <code>nginx -t</code> to check if the changes are correct.</p>
</li>
<li>
<p>Restart nginx by running <code>systemctl restart nginx</code>.</p>
</li>
<li>
<p><code>cd ~</code> and then <code>ufw enable</code> to enable the firewall.</p>
</li>
<li>
<p>Run <code>ufw allow ssh</code>, <code>ufw allow http</code> and <code>ufw allow https</code> to allow using these methods through the firewall. The firewall restricts access trough other ports like 5000.</p>
</li>
<li>
<p>Run <code>snap install --classic certbot</code> to install the Let's Encrypt certificate manager.</p>
</li>
<li>
<p>Run <code>ln -s /snap/bin/certbot /usr/bin/certbot</code> to link the certificate manager to the /usr/bin/certbot folder.</p>
</li>
<li>
<p>Setup Domain on Linode by -&gt;</p>
<ol>
<li>Go to <strong>Domains</strong> tab in sidebar.</li>
<li>Create a new domain.</li>
<li>In the "Domain" section, type the domain name.</li>
<li>Provide an email address.</li>
<li>In <strong>Insert Default Records</strong>, select <strong>Insert Default Records from one of my Linodes</strong></li>
<li>Select the Linode you want to use.</li>
<li>Click <strong>Create Domain</strong></li>
<li>Copy the NS(name servers) and add them to your domain name provider (example: namecheap) as <strong>Custom DNS</strong></li>
<li>Click <strong>Save</strong></li>
<li>Check if your domain (without https) now shows your project.</li>
</ol>
</li>
<li>
<p>Run <code>certbot --nginx</code></p>
</li>
<li>
<p>(optional) Run <code>certbot renew --dry-run</code> to check if the SSL certificate gets renewed successfully.</p>
</li>
<li>
<p>Reload your domain to check if it is now secure.</p>
</li>
</ol>
<p>You have now successfully deployed your project to a Linode with a SSL certificate.</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="references">References<a href="https://shahpreetk.com/blog/deploying-a-nodejs-project-to-linode#references" class="hash-link" aria-label="Direct link to References" title="Direct link to References">​</a></h4>
<ul>
<li><a href="https://www.linode.com/docs/guides/use-public-key-authentication-with-ssh/" target="_blank" rel="noopener noreferrer">Creating and Using SSH keys</a></li>
</ul>]]></content:encoded>
            <category>deployment</category>
            <category>backend</category>
            <category>linode</category>
        </item>
        <item>
            <title><![CDATA[Deploying a Node.js project to heroku]]></title>
            <link>https://shahpreetk.com/blog/deploying-a-nodejs-project-to-heroku</link>
            <guid>https://shahpreetk.com/blog/deploying-a-nodejs-project-to-heroku</guid>
            <pubDate>Sat, 23 Apr 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[Deploying a Node.js project to heroku]]></description>
            <content:encoded><![CDATA[<p>To deploy a Node.js app to Heroku, follow the instructions below:</p>
<p>In the terminal, navigate to the root of your project and follow the steps below:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">npm install </span><span class="token operator">-</span><span class="token plain">g heroku</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">heroku login</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">heroku apps</span><span class="token operator">:</span><span class="token plain">create </span><span class="token operator">&lt;</span><span class="token plain">project_name</span><span class="token operator">&gt;</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// Example, heroku apps:create vikhyaat</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">git push heroku main</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>You can now access your backend on <b>https://&lt;project_name&gt;.herokuapp.com</b></p>
<p>Example, <a href="https://vikhyaat.herokuapp.com/" target="_blank" rel="noopener noreferrer">https://vikhyaat.herokuapp.com/</a></p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="references">References<a href="https://shahpreetk.com/blog/deploying-a-nodejs-project-to-heroku#references" class="hash-link" aria-label="Direct link to References" title="Direct link to References">​</a></h4>
<ul>
<li><a href="https://devcenter.heroku.com/articles/deploying-nodejs" target="_blank" rel="noopener noreferrer">Deploying Node.js Apps on Heroku</a></li>
</ul>]]></content:encoded>
            <category>deployment</category>
            <category>backend</category>
            <category>heroku</category>
        </item>
        <item>
            <title><![CDATA[Creating a Black Overlay on image in CSS]]></title>
            <link>https://shahpreetk.com/blog/creating-black-overlay-on-image-in-css</link>
            <guid>https://shahpreetk.com/blog/creating-black-overlay-on-image-in-css</guid>
            <pubDate>Fri, 22 Apr 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[Creating a black overlay over an image in CSS]]></description>
            <content:encoded><![CDATA[<p>Code for creating a black overlay in CSS over an image:</p>
<div class="language-css codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-css codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">background</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token color">black</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">overflow</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> hidden</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">background</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">-webkit-linear-gradient</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token color function" style="color:rgb(80, 250, 123)">rgba</span><span class="token color punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token color number">0</span><span class="token color punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token color"> </span><span class="token color number">0</span><span class="token color punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token color"> </span><span class="token color number">0</span><span class="token color punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token color"> </span><span class="token color number">0.5</span><span class="token color punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token color function" style="color:rgb(80, 250, 123)">rgba</span><span class="token color punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token color number">0</span><span class="token color punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token color"> </span><span class="token color number">0</span><span class="token color punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token color"> </span><span class="token color number">0</span><span class="token color punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token color"> </span><span class="token color number">0.5</span><span class="token color punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token url function" style="color:rgb(80, 250, 123)">url</span><span class="token url punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token url string url" style="color:rgb(255, 121, 198)">"&lt;IMAGEURL_COMES_HERE&gt;"</span><span class="token url punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">object-fit</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> cover</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="references">References<a href="https://shahpreetk.com/blog/creating-black-overlay-on-image-in-css#references" class="hash-link" aria-label="Direct link to References" title="Direct link to References">​</a></h4>
<ul>
<li><a href="https://www.w3schools.com/howto/howto_css_overlay.asp" target="_blank" rel="noopener noreferrer">Overlay with JavaScript</a></li>
</ul>]]></content:encoded>
            <category>css</category>
            <category>overlay</category>
            <category>styles</category>
        </item>
        <item>
            <title><![CDATA[Starting a MongoDB local connection in macOS]]></title>
            <link>https://shahpreetk.com/blog/starting-a-mongodb-local-connection-macos</link>
            <guid>https://shahpreetk.com/blog/starting-a-mongodb-local-connection-macos</guid>
            <pubDate>Fri, 22 Apr 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[Starting a MongoDB local connection in macOS using the terminal]]></description>
            <content:encoded><![CDATA[<p>Following command starts the MongoDB server:</p>
<p><code>/Users/&lt;username&gt;/mongodb/bin/mongod --dbpath=/Users/&lt;username&gt;/mongodb-data</code></p>
<p>Example of terminal command to start MongoDB local connection with MongoDB Compass in macOS:</p>
<p><code>/Users/preetshah/mongodb/bin/mongod --dbpath=/Users/preetshah/mongodb-data</code></p>
<p>This command takes you to the MongoDB path and starts the MongoDB server.</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="references">References<a href="https://shahpreetk.com/blog/starting-a-mongodb-local-connection-macos#references" class="hash-link" aria-label="Direct link to References" title="Direct link to References">​</a></h4>
<ul>
<li><a href="https://www.mongodb.com/docs/manual/tutorial/install-mongodb-on-os-x/" target="_blank" rel="noopener noreferrer">Installing MongoDB on macOS</a></li>
</ul>]]></content:encoded>
            <category>databases</category>
            <category>mongodb</category>
            <category>nosql</category>
        </item>
        <item>
            <title><![CDATA[Shortcut to Open folder in VSCode from cmd]]></title>
            <link>https://shahpreetk.com/blog/shortcut-to-open-folder-in-vscode-from-cmd</link>
            <guid>https://shahpreetk.com/blog/shortcut-to-open-folder-in-vscode-from-cmd</guid>
            <pubDate>Fri, 22 Apr 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[Opening a folder in VSCode using the terminal]]></description>
            <content:encoded><![CDATA[<p>The following commands open the current folder in VSCode from the terminal:</p>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">cd &lt;folder_name&gt;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">code .</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Alternatively, you can use the following command to open the folder in an Open VSCode window:</p>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">code . -r</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="references">References<a href="https://shahpreetk.com/blog/shortcut-to-open-folder-in-vscode-from-cmd#references" class="hash-link" aria-label="Direct link to References" title="Direct link to References">​</a></h4>
<ul>
<li><a href="https://code.visualstudio.com/docs/editor/command-line#_core-cli-options" target="_blank" rel="noopener noreferrer">VSCode Core CLI options</a></li>
</ul>]]></content:encoded>
            <category>terminal</category>
            <category>vscode</category>
            <category>shortcuts</category>
        </item>
        <item>
            <title><![CDATA[Child Table Data in Strapi API]]></title>
            <link>https://shahpreetk.com/blog/child-table-data-in-strapi-api</link>
            <guid>https://shahpreetk.com/blog/child-table-data-in-strapi-api</guid>
            <pubDate>Fri, 22 Apr 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[How to display information of related child tables for the requested parent table in Strapi API?]]></description>
            <content:encoded><![CDATA[<h4 class="anchor anchorWithStickyNavbar_LWe7" id="how-to-display-information-of-related-child-tables-for-the-requested-parent-table-in-strapi-api">How to display information of related child tables for the requested parent table in Strapi API?<a href="https://shahpreetk.com/blog/child-table-data-in-strapi-api#how-to-display-information-of-related-child-tables-for-the-requested-parent-table-in-strapi-api" class="hash-link" aria-label="Direct link to How to display information of related child tables for the requested parent table in Strapi API?" title="Direct link to How to display information of related child tables for the requested parent table in Strapi API?">​</a></h4>
<p>Originally, when requesting a Strapi API endpoint, you can only get the information of the table you requested without the information of tables it is related to.</p>
<p>In order to get the details of tables joined to the requested table, you can try requesting the endpoint by using - <code>http://localhost:1337/api/tablename?populate=*</code></p>
<p>Example:
If you have a supplier to whom you owe many payments and wish to see the payments information in the supplier information, you can request this link --&gt;
<code>http://localhost:1337/api/suppliers?populate=*</code></p>
<p>So populate here, populates the API with relations, components or dynamic zones.</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="references">References<a href="https://shahpreetk.com/blog/child-table-data-in-strapi-api#references" class="hash-link" aria-label="Direct link to References" title="Direct link to References">​</a></h4>
<ul>
<li><a href="https://docs.strapi.io/developer-docs/latest/developer-resources/database-apis-reference/rest/populating-fields.html#population" target="_blank" rel="noopener noreferrer">Strapi Documentation</a></li>
</ul>]]></content:encoded>
            <category>databases</category>
            <category>strapi</category>
            <category>sql</category>
        </item>
        <item>
            <title><![CDATA[Reverting Commits & Local Changes in Git]]></title>
            <link>https://shahpreetk.com/blog/reverting-commits-and-local-changes-in-git</link>
            <guid>https://shahpreetk.com/blog/reverting-commits-and-local-changes-in-git</guid>
            <pubDate>Fri, 22 Apr 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[Reverting Commits & Local Changes in Git]]></description>
            <content:encoded><![CDATA[<p>The following steps can be used to remove a commit pushed to Github:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">git log </span><span class="token comment" style="color:rgb(98, 114, 164)">// copy the commit reference you like to go back to from the log</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">git reset </span><span class="token operator">&lt;</span><span class="token plain">commit_ref</span><span class="token operator">&gt;</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// reset git to the commit reference</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">git stash </span><span class="token comment" style="color:rgb(98, 114, 164)">// stash/store the local changes from the wrong commit if you want to keep the commit changes</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">git push </span><span class="token operator">-</span><span class="token plain">f </span><span class="token comment" style="color:rgb(98, 114, 164)">// push the changes to remote repository, (-f or --force)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">git stash apply </span><span class="token comment" style="color:rgb(98, 114, 164)">// get back the stored changes to local repository</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">git add </span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// if you have untracked/new files in the changes, you need to add them to git</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">git commit </span><span class="token operator">-</span><span class="token plain">m </span><span class="token string" style="color:rgb(255, 121, 198)">'&lt;your_commit_message&gt;'</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// commit the changes</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="references">References<a href="https://shahpreetk.com/blog/reverting-commits-and-local-changes-in-git#references" class="hash-link" aria-label="Direct link to References" title="Direct link to References">​</a></h4>
<ul>
<li><a href="https://stackoverflow.com/a/44415889" target="_blank" rel="noopener noreferrer">How can I remove a commit on GitHub?</a></li>
</ul>]]></content:encoded>
            <category>git</category>
            <category>github</category>
        </item>
        <item>
            <title><![CDATA[Adding Images in React.js]]></title>
            <link>https://shahpreetk.com/blog/adding-image-in-reactjs</link>
            <guid>https://shahpreetk.com/blog/adding-image-in-reactjs</guid>
            <pubDate>Fri, 22 Apr 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[Adding Images in React.js]]></description>
            <content:encoded><![CDATA[<p>Images are integral to web development, impacting performance significantly. Efficient management can streamline your React app's functionality and user experience. Let's explore a streamlined approach.</p>
<p><strong>Streamlining Image Handling in React:</strong></p>
<p>One common method involves creating an <code>assets/images</code> folder within your <code>src</code> directory and importing images throughout your project. However, optimizing this process can further enhance performance.</p>
<p><strong>Using the Public Folder for Images (or Files):</strong></p>
<ol>
<li>Create an assets or images folder in your project's <code>public</code> directory.</li>
<li>Store your images/files here for easy access.</li>
<li>Within React components, reference images directly using <code>/assets/&lt;image_name&gt;</code> in the <code>src</code> attribute.</li>
</ol>
<p><strong>Optimizing Image Size:</strong></p>
<p>Utilize tools like <a href="https://tinypng.com/" target="_blank" rel="noopener noreferrer">TinyPNG</a> to compress image files while maintaining quality. This reduces load times and enhances user experience, contributing to improved overall performance.</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="references">References<a href="https://shahpreetk.com/blog/adding-image-in-reactjs#references" class="hash-link" aria-label="Direct link to References" title="Direct link to References">​</a></h4>
<ul>
<li><a href="https://www.upbeatcode.com/react/where-to-store-images-in-react-app/" target="_blank" rel="noopener noreferrer">Storing images in react</a></li>
</ul>]]></content:encoded>
            <category>react</category>
            <category>rendering</category>
            <category>images</category>
        </item>
        <item>
            <title><![CDATA[Deploying a React app to GitHub Pages]]></title>
            <link>https://shahpreetk.com/blog/deploying-a-react-app-to-github-pages</link>
            <guid>https://shahpreetk.com/blog/deploying-a-react-app-to-github-pages</guid>
            <pubDate>Thu, 21 Apr 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[Deploying a React app to GitHub Pages(ghpages)]]></description>
            <content:encoded><![CDATA[<p>To deploy a React app to GitHub Pages, follow the instructions below:</p>
<ol>
<li>Install gh-pages as a dev depedency: <code>npm install -D gh-pages</code></li>
<li>In package.json add the following in scripts:</li>
</ol>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">"predeploy": "npm run build",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">"deploy": "gh-pages -d build",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">"build": "react-scripts build &amp;&amp; cp build/index.html build/404.html",</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<ol start="3">
<li>Run <code>npm run deploy</code> to deploy the site to GitHub Pages.</li>
</ol>
<p>NOTE: On Windows cmd, it will be <code>copy</code> instead of <code>cp</code>.</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="references">References<a href="https://shahpreetk.com/blog/deploying-a-react-app-to-github-pages#references" class="hash-link" aria-label="Direct link to References" title="Direct link to References">​</a></h4>
<ul>
<li><a href="https://docs.github.com/en/pages/getting-started-with-github-pages/creating-a-github-pages-site" target="_blank" rel="noopener noreferrer">Creating a GitHub Pages site</a></li>
</ul>]]></content:encoded>
            <category>deployment</category>
            <category>react</category>
            <category>gh-pages</category>
        </item>
    </channel>
</rss>