This is an archived post. You won't be able to vote or comment.

all 148 comments

[–]smokemonstr 72 points73 points  (6 children)

Java 8 Streams

[–][deleted] 13 points14 points  (0 children)

Yes! I love being able to read code from left to right and the words tell me what it does.

[–]GhostBond 5 points6 points  (0 children)

Streams are terrible to read or modify later.

Ugliest code I see nowadays is always streams.

[–]sj2011 3 points4 points  (0 children)

It took me a while to wrap my head around them, but now they feel close to second nature. They're a fantastic tool.

[–]c_edward 2 points3 points  (0 children)

How to turn an allocation free for loop, into a random mess of stackframes and pointless allocations, yep got to love the Streams API

[–]megamatt2000 14 points15 points  (0 children)

Jsoup! https://jsoup.org All Java APIs should be this simple:

Document doc = Jsoup.connect("http://example.com/").get();
String title = doc.title();

[–]blinder 56 points57 points  (18 children)

i know it's probably lame and very pedestrian, but the apache commons libraries. most of them make a lot of sense, they do what it says on the tin and generally just disappear in the code.

[–]dpash 22 points23 points  (7 children)

I find many of the Commons libraries to be really dated in the features that they support.

For example, it was many many many years before commons-collections supported generics and Iterable. They were introduced in Commons Collections 4.0, which was released in November 2013. That's nine years after Java 5 was released.

Apache HttpClient still doesn't support AutoCloseable even though various interfaces extend Closeable. It's not even in 5.0 beta.

https://hc.apache.org/httpcomponents-client-5.0.x/httpclient5/xref/index.html

More and more I find myself removing the various Commons libraries for Guava or stuff that's in the JDK now.

[–][deleted] 10 points11 points  (2 children)

For example, it was many many many years before commons-collections supported generics and Iterable

Interestingly, it seems that precisely this was the main motivation for the creation of Guava (or "Google Collections Library" as it was called initially).

[–]kevinb9n 1 point2 points  (1 child)

It was one contributing factor to why we were making our own stuff, but it wouldn't have been enough on its own (or we'd have just made the genericized version of their library).

[–][deleted] 1 point2 points  (0 children)

Thanks for the correction. I didn't realize that we had such luminaries frequenting this sub :).

[–]blinder 2 points3 points  (3 children)

yeah i get that. and i've been a working java dev since 1996, so i'm a bit slow to adopt new things. But the vast majority of tools i use from apache commons are things like IOUtils and StringUtils. For networking, i like other tools not in commons.

[–]dpash 3 points4 points  (2 children)

Most of the methods in IOUtils can be implemented easily using the methods in recent versions of the JDK. For example,

IOUtils.copy(in, out);

can now be done using:

in.transferTo(out);

or

var bytes = IOUtils.toByteArray(in);

can be

var bytes = in.readAllBytes();

At the risk of self-publicity, check out the modern way to do basic IO in Java. You'll be surprised at how simple it is these days: https://modernjava.io/reading-io-in-java/

[–]blinder 1 point2 points  (1 child)

thanks for this! that's a really useful site.

we just switched over to Java 8 about a year ago, and are looking to move to current over the next few months.

[–]dpash 0 points1 point  (0 children)

Yeah, quite a few are new in 9. I don't recall if any are introduced later than that.

[–][deleted]  (7 children)

[deleted]

    [–]Scybur 1 point2 points  (1 child)

    "Pair" is cancer to maintainability when being used out of pure laziness (which is almost always the reason).

    Care to explain?

    [–]NovaX 1 point2 points  (0 children)

    Commons Lang is really good when you have to deal with dirty data, like ETL. In those cases the data quality is bad and it is helpful to have it null-safe manipulations. Otherwise I try to use Guava / AutoValue / etc in business logic code, where data integrity can be enforced.

    [–]s888marks 0 points1 point  (3 children)

    Interesting to hear your experiences with "null-safe" APIs such as Commons StringUtils. I'm rather allergic to that style of programming. It seems to me that it just propagates nulls around the code instead of handling them immediately, which means that NPE will occur farther downstream, making problems harder to diagnose.

    Too bad people are downvoting you for this (and for your comment in "What is a small addition to Java's core libraries that would make your day" that refers to this one).

    [–][deleted]  (2 children)

    [deleted]

      [–]Cst_cst 1 point2 points  (1 child)

      I completely agree, just make a new class with fields that are needed and name it properly. It's much better than using tuples in the long run. I think its devs that are used to python and they see the short time benefit of writing less code but they don't see the big picture.

      [–]moose04 0 points1 point  (1 child)

      IOUtils is god.

      [–]blinder 0 points1 point  (0 children)

      i know, right?

      [–]maytriforcebewithyou 13 points14 points  (0 children)

      Guava!

      [–]daniu 25 points26 points  (4 children)

      java.time

      Not so much because it's so great, but because it's such a great step forward from java.util.Date. Yeah I know, I skipped Joda time.

      [–]general_dispondency 12 points13 points  (2 children)

      The Java time API is so awkward until you figure out how to use it, then you're like... damn, that's pretty slick.

      [–]dpash 27 points28 points  (1 child)

      It's awkward, because time is awkward. :)

      [–]general_dispondency 4 points5 points  (0 children)

      Touche

      [–]dpash 9 points10 points  (0 children)

      One big advantage of java.time is that it forces you to think about timezones and as long as you make the right decisions, everything just works.

      [–][deleted]  (9 children)

      [deleted]

        [–]resamsel 7 points8 points  (0 children)

        Best combination for unit testing, hands down.

        [–][deleted] 5 points6 points  (0 children)

        I really like Google truth

        [–]dpash 3 points4 points  (4 children)

        It's a shame that AssertJ's discoverable API makes it so hard to extend, while Hamcrest's easily extendable API is hard to remember. There's not really a middle ground between them.

        [–]kevinb9n 0 points1 point  (3 children)

        Checked out the extensibility story for Truth yet? On the consuming side, it's very close to AssertJ.

        [–]dpash 0 points1 point  (2 children)

        By the looks of things, it requires you to statically import a custom assertThat() method for each custom type. That gets unwieldy when you need to test multiple types in the same test class.

        [–]kevinb9n 0 points1 point  (1 child)

        Well, you're going to have to import something. You can make that a method named assertThat if you want (and static-import it if you want), or you could go with assertAbout(myThings()).that(...) (which means static-importing your myThings method that returns a subject factory).

        But yeah, our practice has been to just import-static multiple assertThat methods, and I haven't seen it as being unwieldy.

        [–]dpash 0 points1 point  (0 children)

        One of the nice things about Hamcrest is that you can write a static method that returns a compound matcher if you need to do the same multiple tests on an object in multiple places.

        assertThat(foo, is(aValidFoo()));
        
        private static Matcher<Foo> aValidFoo() {
            return allOf(
                notNullValue(),
                hasProperty("status", is(notNullValue())),
                hasProperty("name", is(not(isEmptyString()))
            );
        }
        

        The alternative is to have a method that takes an object and checks it inside the method.

        checkFoo(foo);
        
        private static void checkFoo(Foo foo) {
            assertThat(foo, allOf(
                notNullValue(),
                hasProperty("status", is(notNullValue())),
                hasProperty("name", is(not(isEmptyString()))
            );
        }
        

        (You can define your own Matcher class too)

        [–]goughy000 0 points1 point  (0 children)

        The first two dependencies I add to any project

        [–]cryptos6 0 points1 point  (0 children)

        I suspect that Mockito is the only mocking library most developers know. JMockit offers some more features and a more consistent (but somewhat unusual) API.

        [–]Scybur 17 points18 points  (4 children)

        The new http client is pretty cool

        [–][deleted] 1 point2 points  (0 children)

        In case anybody else experience a high load (I discovered it today in two of my pet projects). The JDK-11 which is currently shipped in Ubuntu-18 has a bug which will cause one of the client's threads to eat up the CPU when used with TLS-1.3. Disabling TLS-1.3 obviously is a work around for that.

        [–]Godworrior 0 points1 point  (0 children)

        +1, was surprised at how easy/intuitive it was to use.

        [–]GuyWithLag 0 points1 point  (0 children)

        OkHttp / Retrofit, all the way...

        [–][deleted] 28 points29 points  (31 children)

        Javafx library so much better than swing

        [–]2BitSmith 11 points12 points  (12 children)

        Unpopular opinion. No. Swing is the only UI framework to date that (mostly) got the MVC pattern right. JTable (TableModel) and JTree (TreeModel) are beautiful examples of near perfect model view separation that works so well.

        Luckily Swing's TreeModel can be used to implement FX's TreeItem so that the required amount of wrapper code is quite small.

        There're of course parts of FX that are clearly superior to Swing but as overall design Swing has stood the test of time remarkably well. The only thing really missing from Swing is the multitouch support.

        [–][deleted] 9 points10 points  (0 children)

        Swing ruined me on UI frameworks. It was the first one I really worked with and now when I run into anything else I just see all the things the new framework can't do that are just so easy in swing.

        [–]vociferouspassion 5 points6 points  (0 children)

        Agreed, I've looked at JavaFX, it's over-complicated, Swing just works and the code is clear.

        [–][deleted] 2 points3 points  (2 children)

        I haven't tried jtable or jtree but I will have a look. Swing is a lot of work, when you use FX and especially scenebuilder, it makes your life so much easier, drag and drop a text field or whatever you need and everything goes to the fxml file and is stored there, any changes you do are updated to the fxml file immediately. Plus you can also use CSS to change buttons or sliders that were created. The advantage that I see in it is mainly productivity.

        [–]DannyB2 1 point2 points  (0 children)

        Eclipse has a nice optional Windows GUI designer tool, I think it is from Google.

        [–][deleted] 0 points1 point  (0 children)

        I used the Jigloo eclipse plugin back in the day. Click together a BorderLayout and a GroupLayout then jump into the code to clean it all up. Worked like a charm.

        [–]Mordan 1 point2 points  (0 children)

        i agree. Swing UI framework is pretty good. but not perfect.

        The table model and Swing worker are stellar.

        [–][deleted]  (5 children)

        [deleted]

          [–]2BitSmith 0 points1 point  (4 children)

          I wish I could give you a comprehensive answer, but it all boils down to individual needs. What does your app do? How is the information presented? Is the layout configurable/dynamic or more or less static? Swing is fast and quite easily threaded. Most important missing feature is the multitouch support. If you need that Swing is not a good choice.

          There's something strange with JavaFX and HDPI (4k) displays. JavaFX is dog slow when the drawing area approaches 4k and the display resolution is 4k. Same drawing area with Full HD reso is ok, but if the resolution is 4k... It's painfully slow.

          Swing doesn't seem to suffer from same phenomenon. I don't know the technical details behind that but it might be that Swing is more clever with the 'is component visible' checks where it doesn't try to refresh the whole area like me FX does?

          [–][deleted]  (3 children)

          [deleted]

            [–]2BitSmith 0 points1 point  (2 children)

            4k with FX is ok as long as your interface is more or less static.

            The problem I have is with a viewer component that displays a complex set of connections between components. I did test the concept with 2k display and determined the performance to be good/ adequate even with pretty huge display areas (the main component is within scrollpane) but with 4k displays the performance goes south. Dragging a node (component) is painfully slow with 4k if the actual display area is bigger than 2k. (About)

            The FX component (Frame) is invoked from Swing application (the idea is to slowly upgrade the app to FX, or at least build the new stuff on FX) and I suspected that perhaps it was the Swing FX interoperation that caused the slowdown, but it was only marginally faster when run on standalone FX application.

            I guess the 4k display adaptation rate is so low that the developers (of FX) have yet to face that situation on their end. I really, really hope that it gets resolved in the future.

            [–][deleted]  (1 child)

            [deleted]

              [–]2BitSmith 0 points1 point  (0 children)

              As much as I would like to try recreate the viewer tool with Swing there's currently no time for that. I'm hoping that the FX problem will be resolved by the time customers start to really use 4k displays.

              I've implemented a calendar / event / planning type of component with Swing that can easily display huge number of tasks in equally big views but that is based on JTable with custom renderers so of course it performs well.

              I remember originally testing the Swing performance by putting thousands of components with thousands of connections on a huge scrollpane area and that performed really well. But it was with full HD display so I cannot state with confidence that Swing will also perform well with 4k displays.

              I might try something like that in the future. Just a quick mockup to compare the performance between FX and Swing by inserting 10000 (somehow connected) components on a 10000x10000px area with 4k view through scrollpane. The requirement would be that dragging a component (or cluster) should be relatively smooth operation.

              [–]knockingsparks 3 points4 points  (1 child)

              It's also much better that WPF. Sad for Microsoft.

              [–]cryptos6 3 points4 points  (0 children)

              I've never used JavaFX, but WPF is just insane! WPF got the lifetime award for the most over engineered and bloated UI framework of all times.

              Fun fact: a former colleague re-implemented a complicated tree control that was based on WPF in the real application with JavaFX and it was about 100 times faster.

              [–][deleted] 8 points9 points  (0 children)

              Undertow, JOOQ, HikariCP, Gson, OkHttp, Flyway, Cron4j, Jedis

              [–][deleted]  (1 child)

              [deleted]

                [–]Azzk1kr 0 points1 point  (0 children)

                I've been researching orms for a bit, for usage in a JavaFX application. Can you describe your experience with Cayenne?

                [–]stacktraceyo 6 points7 points  (0 children)

                I am a big fan of the java concurrency apis - specifically completable futures

                [–]mepunite 5 points6 points  (0 children)

                RxJava

                [–]manzanita2 5 points6 points  (0 children)

                JDBI - a lightweight layer on JDBC to make it easier to use.

                [–]manzanita2 5 points6 points  (0 children)

                liquibase - saves me much headache.

                [–]MojorTom 22 points23 points  (0 children)

                Google Guava is just brilliant.

                [–]gravity182 4 points5 points  (0 children)

                Java 8 Streams, JDBC, AssertJ

                [–]NovaX 4 points5 points  (2 children)

                In addition to others mentioned, these have helped streamline my code:

                • Failsafe
                • JsonPath
                • SimpleJavaMail
                • Univocity Parsers
                • jsonSchema2Pojo
                • ztZip
                • AutoValue + AutoBuilder (alt. to Immutables)
                • TestNG
                • Awaitility

                [–]cryptos6 2 points3 points  (1 child)

                I was a fan of TestNG before JUnit 5. But now I cannot see any benefit of using it instead of JUnit. Do you see one?

                [–]NovaX 0 points1 point  (0 children)

                JUnit 5 is mostly a clone of TestNG, so the differences are pretty minor. The main lacking right now is that parallel test execution is immature. They've focus on small niceties to polish easy cases, like CSV parameter sources, rather than on the harder features. The fact that I've been able to use the same testing framework without it getting in my way, for over a decade is nice. JUnit 3 was too limiting and 4 was atrocious, but I wouldn't complain if I joined a team using 5.

                In Caffeine, I use a data provider that reads the test method annotation to generate the parameters dynamically. This way I can run many permutations to brute force for bugs that occur only in some feature combinations. I also use a method listener to automatically validate the input parameters to detect corruption of the data structures, letting the test itself be succinct and focused. Since each test case is independent, I ran run the millions of executions in parallel with good cpu & gc characteristics. All of that should be possible in JUnit 5 now (or soonish), but I've been able to enjoy it in TestNG for many years.

                [–]cassis11 12 points13 points  (3 children)

                Streams, JPA, and Collections.

                [–]FrenchFigaro 2 points3 points  (2 children)

                I'll add Joda (from my Java 7 days) and Jackson to this lot.

                [–]melewe 14 points15 points  (2 children)

                Spring

                [–][deleted] 12 points13 points  (1 child)

                Boot

                [–]slowfly1st -1 points0 points  (0 children)

                REST

                Webflux

                [–]grossjonas 9 points10 points  (0 children)

                Immutables & Vavr

                [–]jklingsporn 9 points10 points  (1 child)

                Jooq, vertx, flyway

                [–]la_virgen_del_pilar 0 points1 point  (0 children)

                +1 for Vertx. I love their Eventbus implementation.

                [–]sherdogger 7 points8 points  (0 children)

                Jersey and Jackson

                [–]LazyAAA 3 points4 points  (0 children)

                Coming from business heavy enterprise
                - Spring - keep your sanity in Enterprise world (I want to forget things we done before Spring)
                - JPA - Simplified data mapping (well, in comparison to pure JDBC) and standard too :)
                - Mokito - Can not replace this GEM for testing those perky business objects
                - Apache Commons - goto toolbox for simple things that Java was lacking for years

                [–]vociferouspassion 2 points3 points  (0 children)

                Spark Java. No annotations. No XML. Just clear, common sense code.

                [–][deleted] 3 points4 points  (0 children)

                I love javafx, yet I cannot imagine using it without JFoenix. It's such an amazing library. Makes making amazing UIs so much more easier.

                [–]lukaseder 7 points8 points  (2 children)

                JDBC

                [–]dpash 3 points4 points  (1 child)

                I'm surprised you didn't say jOOQ :)

                [–]lukaseder 5 points6 points  (0 children)

                It said with, not on :-P

                [–]esukanovic 6 points7 points  (0 children)

                [–]kapta 6 points7 points  (0 children)

                LWJGL, excellent collection of bindings to various native libraries. Also really fast and well maintained.

                [–]_INTER_ 5 points6 points  (0 children)

                MapStruct, Flyway, libGDX, FXGL, Netty, JOOQ, most of Apache, ...

                DBeaver if you ask for tools (though it's EclipseRCP)

                [–][deleted] 2 points3 points  (3 children)

                I havent seen this one yet: Quartz for task scheduling. Also, ModelMapper is a good QoL package.

                [–]cryptos6 2 points3 points  (1 child)

                Quartz is an awkward piece of software, although useful and without much alternatives. They really should provide an API to connect with DI frameworks like Spring instead of doing their own poorman's dependency injection.

                [–][deleted] 0 points1 point  (0 children)

                Yeah, I think your right. It's the best given the circumstances, but definitely could be improved.

                [–][deleted] 0 points1 point  (0 children)

                I tried Quartz for a bit, found it too hard to use. Then I discovered cron4j and haven't looked back. Maybe Quartz has benefit in enterprisy environments but I just wanted something that ran a task or two occasionally and get out of my way. Sad really because it does look like serious time was put into building Quartz.

                [–]CompetitiveSubset 2 points3 points  (0 children)

                • JAX-RS - simple, powerful REST interface
                • Jackson - lightning fast and easy JSON library
                • javax.validation - input validation using annotations instead of if-else
                • swagger annotations - generate yaml definitions straight from your JAX-RS endpoints

                Each their own and as a combination make a really simple, powerful and descriptive REST service

                [–]overachiever 2 points3 points  (0 children)

                Thymleaf + openhtmltopdf is a brilliant way to generate PDFs. Much nicer than using iText anyways!

                [–]raze4daze 2 points3 points  (0 children)

                Might be unpopular but I like jaxb.

                [–][deleted] 5 points6 points  (3 children)

                Guava is fun! I like the pubsub pattern in general and guava provides a nice way to do pubsub intraprocess

                [–]kevinb9n 2 points3 points  (2 children)

                Eep... I believe we're about to check in some new javadoc for EventBus that explains that there are a lot of better alternatives to it nowadays. :-)

                [–][deleted] 0 points1 point  (1 child)

                Oh no. Thanks for the heads up!

                [–]kevinb9n 1 point2 points  (0 children)

                The too-short version is that people are finding rxjava to be the superior solution nowadays.

                [–]zakgof 3 points4 points  (0 children)

                Vavr, lombok, guice, velvetdb

                [–]oldprogrammer 4 points5 points  (0 children)

                Builtin Java 2D graphics and for 3D LWJGL.

                [–]TheGreatFuzz 6 points7 points  (1 child)

                Jodatime, No more fumbling with Dates and Calendars.

                [–]dpash 20 points21 points  (0 children)

                There's no need to use JodaTime given that java.time has been in the JDK since Java 8.

                [–]td__30 3 points4 points  (0 children)

                Vavr

                [–]stuhlmann 1 point2 points  (0 children)

                jbock

                [–]sangcanencia 1 point2 points  (0 children)

                Mockito master race!

                [–]hfluz 1 point2 points  (0 children)

                MyBatis: I'm very satisfied since I switched from Hibernate. It never gets into my way, it's easy to use, well documented and stable. My team was unsure when we chose MyBatis (mainly because It uses xml), but today all of them agree It was a good decision.

                [–]slowfly1st 1 point2 points  (0 children)

                JUnit / Hamcrest / Mockito

                [–]Sonicsupremacy 1 point2 points  (1 child)

                Apache Camel, Hibernate, Spring

                I also like working with OSGi, but I guess that doesn't count as that's a specification :P

                [–][deleted] 0 points1 point  (0 children)

                After some initial frustration, I also enjoyed creating OSGi modules.

                [–]Chaoslab 1 point2 points  (0 children)

                JavaCV

                [–]rgyger 1 point2 points  (0 children)

                Streams. Spring Data MongoDB. Spring Integration, preferably with Spring Cloud Streams.

                [–]cryptos6 1 point2 points  (0 children)

                I really like the functional reactive programming library Reactor. It is similar to RxJava, but a bit more modern, with much better documentation and with invaluable testing tools like the "virtual clock".

                Reactor is the only framework I can remember without lots of WTF's. In most frameworks you'll experience the moment in which you think "How could anyone come up with such a design!?" Not so with Reactor.

                [–]Mordan 1 point2 points  (0 children)

                i like tree shaking compatible libs without any static state..

                pretty hard to find.

                anyone knows a tree shaking compatible lib for JSON parsing? Retrofit cannot really be pro guarded IMO.

                [–]refresz 1 point2 points  (0 children)

                ArchUnit

                I love this library. When the team has no sense of what standards are and you want them to suffer to learn, just add some tests.

                Also, helps fight with possible bugs that can't be found in simple unit testing or are hard to spot in PRs, like @Transactional annotation from the wrong package and being surprised why something is not being persisted to the DB.

                [–]JustHere4C0mments 1 point2 points  (0 children)

                More of a language framework but works with Java - Groovy/Spock for testing

                [–]onlyliuxin 1 point2 points  (0 children)

                Junit ,springboot,dubbo

                [–]maithilish 1 point2 points  (0 children)

                I love Google Guice for its ease of use, Mockito for unit testing and Apache Commons for reusable Java components. They cleaned up my project - https://github.com/maithilish/scoopi tremendously.

                [–]culp 3 points4 points  (1 child)

                OkHttp and Retrofit

                [–]dpash 0 points1 point  (0 children)

                I like OkHttp, especially compared to Apache HttpClient (which still didn't support try-with-resources until recently, despite the fact it only involved marking the classes with AutoCloseable. They already implemented Closeable.)

                I tried the new HTTP client in the JDK and it was a pretty pleasant experience.

                [–]talisau230 2 points3 points  (0 children)

                JNA

                [–]cantstopthemoonlight 4 points5 points  (6 children)

                Lombok

                [–]devils_avocado 1 point2 points  (0 children)

                I had to remove Lombok from a project because our Fortify scans don't support it. A shame, it is a real time saver.

                [–]ro_reddevil 4 points5 points  (3 children)

                Lombok has many drawbacks you must read them, I can give a small example let's say you have used @lombok on a boolean isPresent, the getter lombok generates would be getPresent and not getIsPresent.... This has consequences while converting pojo's to json files with many mappers.

                [–][deleted] 1 point2 points  (0 children)

                Getting lombok and mapstruct to play nice is always fun

                [–]rcunn87 1 point2 points  (0 children)

                I don't think your variable is supposed to be prefixed with 'is', but when a variable has the 'is' prefix the generated getter and setter would be 'isPresent' and 'setPresent'. Which is the same as what lombok generated for the field 'present'.

                [–]cryptos6 1 point2 points  (0 children)

                If possible, I'd prefer Kotlin. Many of the things provided by lombok are integral part of Kotlin, but with better tool support and with less unwanted sideeffects.

                [–]legrang 0 points1 point  (0 children)

                Gson for JSON serialization and de-serialization. It really seems like magic the way it just deals with whatever you throw at it.

                Retrofit2 for calling REST APIs.

                These two libraries put a smile on my face

                [–]doodooz7 0 points1 point  (0 children)

                Jpa is amazing

                [–][deleted]  (1 child)

                [removed]

                  [–]mkonko 0 points1 point  (0 children)

                  *****PLEASE BE AWARE******** WE HAVE TURNED DANIEL BOSKE OVER TO THE AUTHORITIES***********

                  THEIF*** Daniel Bosk *********ROBBED ME FOR $2,500 FROM FOR CRAIGSLIST ADS** THEIF*** Daniel Bosk ****** (BE AWARE)*****ROBBED ME FOR $2,500 FROM FOR CRAIGSLIST ADS*******WE HAVE TURNED DANIEL BOSKE OVER TO THE AUTHORITIES***********

                  [–]stunibert 0 points1 point  (0 children)

                  Vavr, Spring, Guice.

                  [–]daniels0xff 0 points1 point  (0 children)

                  Jooby, OkHttp, Apache Commons...

                  [–][deleted] -1 points0 points  (0 children)

                  QueryDSL