<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Ali Zaidi</title>
    <description>The latest articles on DEV Community by Ali Zaidi (@azaidi93).</description>
    <link>https://dev.to/azaidi93</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F391925%2F9b1a84ea-e878-43ef-87fa-9b58d8bd32c5.jpg</url>
      <title>DEV Community: Ali Zaidi</title>
      <link>https://dev.to/azaidi93</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/azaidi93"/>
    <language>en</language>
    <item>
      <title>Go-ing Go-ing Gone! CRUD with Go</title>
      <dc:creator>Ali Zaidi</dc:creator>
      <pubDate>Thu, 24 Feb 2022 00:09:22 +0000</pubDate>
      <link>https://dev.to/azaidi93/go-ing-go-ing-gone-ll-aic</link>
      <guid>https://dev.to/azaidi93/go-ing-go-ing-gone-ll-aic</guid>
      <description>&lt;p&gt;&lt;strong&gt;Alright, let's Go. Last tortured pun, I promise.. kind of.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Although I would classify myself as a polyglot developer, the vast majority of my backend development has been in Java 8/11. After being recommended Go by several colleagues, I gave it a go (sorry) and was pleasantly surprised by the simplicity.&lt;/p&gt;

&lt;p&gt;Coming from the land of annotations, JVMs, JDKs &amp;amp; CDI, it was a breath of fresh air to strip back to the basics. There's no magic in Go like there is with Java. No secret filters, no ambiguous qualifiers and no Spring minefields. Go is far more verbose and makes you jump through all the hoops. More effort typing but far less effort understanding. &lt;/p&gt;

&lt;p&gt;Don't get me wrong, I think modern Java services are still fantastic but it's becoming increasingly difficult in an enterprise environment to utilise the newer features.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqyjundp92akxavfeyb55.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqyjundp92akxavfeyb55.jpeg" alt="Over here"&gt;&lt;/a&gt;&lt;/p&gt;
When you type in go run main.go



&lt;p&gt;After dabbling in Go for a while, I decided to write a simple CRUD project and post it to Github.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/alizaidi93/task-list-service" rel="noopener noreferrer"&gt;https://github.com/alizaidi93/task-list-service&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The main goals of the project were to demonstrate the following : &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hexagonal Architecture&lt;/li&gt;
&lt;li&gt;Running a ReSTful web service&lt;/li&gt;
&lt;li&gt;Utilising a global logger&lt;/li&gt;
&lt;li&gt;Writing unit tests&lt;/li&gt;
&lt;li&gt;Connecting into a Postgres DB running through Docker&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Has anyone else learnt Go from a Java background? &lt;/p&gt;

</description>
      <category>go</category>
      <category>beginners</category>
      <category>opensource</category>
      <category>programming</category>
    </item>
    <item>
      <title>Let’s touch base.. with Firebase 🔥</title>
      <dc:creator>Ali Zaidi</dc:creator>
      <pubDate>Sat, 29 Aug 2020 11:18:04 +0000</pubDate>
      <link>https://dev.to/azaidi93/let-s-touch-base-with-firebase-1i96</link>
      <guid>https://dev.to/azaidi93/let-s-touch-base-with-firebase-1i96</guid>
      <description>&lt;p&gt;To put it mildly, Firebase is a &lt;b&gt;beast&lt;/b&gt;. &lt;/p&gt;

&lt;p&gt;There are so many facets of Firebase which make it a dream platform for many start ups, side projects and quick hack ups. That’s not to say you can’t scale up massively with Firebase, just ask Google Play Music which has a cool 5 Billion installs. &lt;/p&gt;

&lt;p&gt;Just to name a few features without scratching the technical depth that Firebase has to offer :&lt;/p&gt;


&lt;li&gt;Cloud Firestore&lt;/li&gt;
&lt;br&gt;
&lt;li&gt;Cloud Functions&lt;/li&gt;
&lt;br&gt;
&lt;li&gt;CDN Hosting&lt;/li&gt;
&lt;br&gt;
&lt;li&gt;Authentication&lt;/li&gt;
&lt;br&gt;
&lt;li&gt;Firebase Cloud Messaging&lt;/li&gt;

&lt;p&gt;The point being is that Firebase is a fantastic resource to power start your development 🚀 &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--n4mcp5os--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/m3yyos5lohoumv5pjuuj.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--n4mcp5os--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/m3yyos5lohoumv5pjuuj.jpg" alt="fry" width="500" height="375"&gt;&lt;/a&gt;&lt;/p&gt;
Too real.. or way too real



&lt;p&gt;I first stumbled across Firebase when a few university friends were speaking to me about an app idea they were developing. My first question to them was, how are you going to handle the &lt;a href="https://en.wikipedia.org/wiki/Identity_management"&gt;IAM&lt;/a&gt;? From previous experience, I know a full IAM system can be burdening to a new developing venture. In the age of sophisticated crypto attacks, salted hashes and privacy concerns &lt;em&gt;cough&lt;/em&gt; GDPR &lt;em&gt;cough&lt;/em&gt; - it's a headache to say the least. I googled ways in which other apps were solving this problem, especially with easy social sign-ins and Firebase Authentication was the answer. &lt;/p&gt;

&lt;p&gt;Slightly on a tangent, this is where as Cloud technologies are becoming so powerful, it empowers developers to do what they actually enjoy doing - which is burning out code 🔥. Gone are the days where you would have to worry about maintaining a database or UNIX box with security patches, or architecting an entire development environment before you even get to experiment with different technologies. &lt;/p&gt;

&lt;p&gt;&lt;b&gt;Innovation occurs most often when those that can ask the right questions, have the best opportunity to answer.&lt;b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;Back to Firebase and IAM, Firebase provides a simple entry point to Authenticating users with a wide variety of options, including Facebook, Twitter, Apple etc. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--eMI2UKOg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/442r4inhcmgsxay6pfxa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--eMI2UKOg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/442r4inhcmgsxay6pfxa.png" alt="Over here " width="880" height="601"&gt;&lt;/a&gt;&lt;/p&gt;
A full list of Authentication providers at time of writing



&lt;p&gt;So, how does it all piece together? &lt;/p&gt;

&lt;p&gt;Firebase has a client side library which allows a user to enter their credentials, with one of the enabled providers above, and if successful, return a Firebase token. This Firebase token is a &lt;a href="https://jwt.io/"&gt;JWT&lt;/a&gt;. We can use this token to identify the user to calls made to the back end. &lt;/p&gt;

&lt;p&gt;Note : Pre-requisite for using Firebase, is signing up for an account. &lt;/p&gt;

&lt;p&gt;We now need to install the Firebase SDK in a preferred server-side language. We can choose from Node.JS, Java, Python, Go &amp;amp; C#. If your favourite language isn't here, you can always use the implementation described &lt;a href="https://firebase.google.com/docs/auth/admin/verify-id-tokens"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In Java, initialising the application would like somewhat like this :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;    &lt;span class="cm"&gt;/**
     * Initialises Firebase connection.
     * 
     * @throws IllegalStateException if application can't be initialised.
     */&lt;/span&gt;
    &lt;span class="nd"&gt;@PostConstruct&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;initialiseFirebase&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="nc"&gt;FileInputStream&lt;/span&gt; &lt;span class="n"&gt;serviceAccount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;FileInputStream&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;firebaseCredentials&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
            &lt;span class="nc"&gt;FirebaseOptions&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;FirebaseOptions&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Builder&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
                    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setCredentials&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;GoogleCredentials&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;fromStream&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;serviceAccount&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;
                    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setDatabaseUrl&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"https://****.firebaseio.com"&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

            &lt;span class="nc"&gt;FirebaseApp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;initializeApp&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;IOException&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;IllegalStateException&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Unable to initalise Firebase Application"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Maven dependency :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;dependency&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;groupId&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;google&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;firebase&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;groupId&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;artifactId&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;firebase&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;admin&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;artifactId&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="mf"&gt;6.12&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;dependency&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With the use of &lt;a href="https://firebase.google.com/docs/reference/admin/java/reference/com/google/firebase/auth/FirebaseAuth"&gt;provided methods&lt;/a&gt;, we can pass in the token, which will then be verified of structure and expiration etc. We can decode the token, retrieve the UUID of our user and call more information if needed. For example, a user's email address as below - all of this through the SDK!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;    &lt;span class="cm"&gt;/**
     * If the provided ID token has the correct format, is not expired, and is
     * properly signed, the method returns the decoded UUID.
     * 
     * @param idToken
     * @return {@code String} Firebase UUID
     */&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;getFirebaseDecodedUid&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;idToken&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="nc"&gt;FirebaseToken&lt;/span&gt; &lt;span class="n"&gt;decodedToken&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;getFirebaseToken&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;idToken&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;decodedToken&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getUid&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;IllegalArgumentException&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;NotAuthorizedException&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Unable to read authentication client side token."&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="cm"&gt;/**
     * Returns email of a user by their Firebase UUID.
     * 
     * @param firebaseId
     * @return {@code String}
     */&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;getUser&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;firebaseId&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;FirebaseAuth&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getInstance&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;getUser&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;firebaseId&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;getEmail&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;FirebaseAuthException&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;InternalServerErrorException&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Unable to return user"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We have successfully found a way to authenticate users with little hassle, so we can focus on writing application logic. &lt;/p&gt;

&lt;p&gt;Firebase has a whole arsenal of functionality to explore, this is a small look into what a powerful platform it can be.&lt;/p&gt;

&lt;p&gt;The next logical phase once users are authenticated is how can you differentiate and authorise them to the right back-end calls. That's for another day and another blog post.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>productivity</category>
      <category>tutorial</category>
      <category>java</category>
    </item>
    <item>
      <title>Log Log Log .. how to deforest with Java CDI </title>
      <dc:creator>Ali Zaidi</dc:creator>
      <pubDate>Sun, 31 May 2020 12:52:26 +0000</pubDate>
      <link>https://dev.to/azaidi93/log-log-log-how-to-deforest-with-java-cdi-3361</link>
      <guid>https://dev.to/azaidi93/log-log-log-how-to-deforest-with-java-cdi-3361</guid>
      <description>&lt;h1&gt;Hello World!&lt;/h1&gt;

&lt;p&gt;..sorry had to do it. Welcome to my first dev.to post, hopefully the first of many! &lt;/p&gt;

&lt;p&gt;I wanted to start off with a really simple utility that Java developers can &lt;em&gt;easily integrate&lt;/em&gt; in their code and improve the codebase. &lt;/p&gt;

&lt;p&gt;Something I see very often, usually in legacy projects, is a logger being declared for every class.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="mi"&gt;1&lt;/span&gt;   &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MyClass&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="mi"&gt;2&lt;/span&gt; 
&lt;span class="mi"&gt;3&lt;/span&gt;       &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="nc"&gt;Logger&lt;/span&gt; &lt;span class="n"&gt;logger&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;LoggerFactory&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getLogger&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;MyClass&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="mi"&gt;4&lt;/span&gt;
&lt;span class="mi"&gt;5&lt;/span&gt;   &lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="mi"&gt;6&lt;/span&gt;   &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Realistically this won't be very resource intensive but we can definitely make improvements to simplify. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fvyckl5ids9d0gcpvyrq0.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fvyckl5ids9d0gcpvyrq0.jpg" alt="matrix"&gt;&lt;/a&gt;&lt;/p&gt;
You don't know what it is, but it's there, like a splinter in your mind, driving you mad



&lt;p&gt;Introducing.. logging with CDI! &lt;/p&gt;

&lt;p&gt;With CDI, we can inject a SL4J (or your favourite implementation) logger.&lt;/p&gt;

&lt;p&gt;First thing we need to do is implement a logging producer using the &lt;a href="https://docs.oracle.com/javaee/7/api/javax/enterprise/inject/spi/InjectionPoint.html" rel="noopener noreferrer"&gt;Injection Point API&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="mi"&gt;1&lt;/span&gt;   &lt;span class="nd"&gt;@ApplicationScoped&lt;/span&gt;
&lt;span class="mi"&gt;2&lt;/span&gt;   &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;LoggerProducer&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="mi"&gt;3&lt;/span&gt;
&lt;span class="mi"&gt;4&lt;/span&gt;      &lt;span class="nd"&gt;@Produces&lt;/span&gt;
&lt;span class="mi"&gt;5&lt;/span&gt;      &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;Logger&lt;/span&gt; &lt;span class="nf"&gt;getLogger&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;InjectionPoint&lt;/span&gt; &lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="mi"&gt;6&lt;/span&gt;          &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;LoggerFactory&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getLogger&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getMember&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;getDeclaringClass&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
&lt;span class="mi"&gt;6&lt;/span&gt;      &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="mi"&gt;7&lt;/span&gt;   &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We specify the scope of the class as &lt;em&gt;@ApplicationScoped&lt;/em&gt;. The injection point API allows us to know the declaring class of the injected logger. &lt;/p&gt;

&lt;p&gt;Imports :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;javax.enterprise.context.ApplicationScoped&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;javax.enterprise.inject.Produces&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;javax.enterprise.inject.spi.InjectionPoint&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.slf4j.Logger&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.slf4j.LoggerFactory&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Note : Ensure that the correct &lt;em&gt;@Produces&lt;/em&gt; annotation is imported, not the JAX-RS producer&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Next step is to simply &lt;em&gt;@Inject&lt;/em&gt; our logger into our class and begin to log.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="mi"&gt;1&lt;/span&gt;   &lt;span class="nd"&gt;@ApplicationScoped&lt;/span&gt;
&lt;span class="mi"&gt;2&lt;/span&gt;   &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MyClass&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="mi"&gt;3&lt;/span&gt; 
&lt;span class="mi"&gt;4&lt;/span&gt;       &lt;span class="nd"&gt;@Inject&lt;/span&gt;
&lt;span class="mi"&gt;5&lt;/span&gt;       &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;Logger&lt;/span&gt; &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="mi"&gt;6&lt;/span&gt;       
&lt;span class="mi"&gt;7&lt;/span&gt;       &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;myMethod&lt;/span&gt;&lt;span class="o"&gt;(){&lt;/span&gt;
&lt;span class="mi"&gt;8&lt;/span&gt;          &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;info&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"My log!"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="mi"&gt;9&lt;/span&gt;       &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="mi"&gt;10&lt;/span&gt;   &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There we have it, an easy CDI logger. &lt;/p&gt;

&lt;p&gt;There are other implementations such as a &lt;a href="https://projectlombok.org/api/lombok/extern/slf4j/Slf4j.html" rel="noopener noreferrer"&gt;Lombok logger&lt;/a&gt;. However, there are some steps to make Lombok compatible with your IDE and I believe a CDI logger is easier to integrate with an existing codebase.&lt;/p&gt;

</description>
      <category>java</category>
      <category>beginners</category>
      <category>tutorial</category>
      <category>codequality</category>
    </item>
  </channel>
</rss>
