diff --git a/core-java-modules/core-java-exceptions-2/src/main/java/com/baeldung/suppressed/ExceptionalResource.java b/core-java-modules/core-java-exceptions-2/src/main/java/com/baeldung/suppressed/ExceptionalResource.java
new file mode 100644
index 0000000000..8892e097b1
--- /dev/null
+++ b/core-java-modules/core-java-exceptions-2/src/main/java/com/baeldung/suppressed/ExceptionalResource.java
@@ -0,0 +1,13 @@
+package com.baeldung.suppressed;
+
+public class ExceptionalResource implements AutoCloseable {
+
+ public void processSomething() {
+ throw new IllegalArgumentException("Thrown from processSomething()");
+ }
+
+ @Override
+ public void close() throws Exception {
+ throw new NullPointerException("Thrown from close()");
+ }
+}
diff --git a/core-java-modules/core-java-exceptions-2/src/main/java/com/baeldung/suppressed/SuppressedExceptionsDemo.java b/core-java-modules/core-java-exceptions-2/src/main/java/com/baeldung/suppressed/SuppressedExceptionsDemo.java
new file mode 100644
index 0000000000..6ff23fd041
--- /dev/null
+++ b/core-java-modules/core-java-exceptions-2/src/main/java/com/baeldung/suppressed/SuppressedExceptionsDemo.java
@@ -0,0 +1,44 @@
+package com.baeldung.suppressed;
+
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+
+public class SuppressedExceptionsDemo {
+
+ public static void demoSuppressedException(String filePath) throws IOException {
+ FileInputStream fileIn = null;
+ try {
+ fileIn = new FileInputStream(filePath);
+ } catch (FileNotFoundException e) {
+ throw new IOException(e);
+ } finally {
+ fileIn.close();
+ }
+ }
+
+ public static void demoAddSuppressedException(String filePath) throws IOException {
+ Throwable firstException = null;
+ FileInputStream fileIn = null;
+ try {
+ fileIn = new FileInputStream(filePath);
+ } catch (IOException e) {
+ firstException = e;
+ } finally {
+ try {
+ fileIn.close();
+ } catch (NullPointerException npe) {
+ if (firstException != null) {
+ npe.addSuppressed(firstException);
+ }
+ throw npe;
+ }
+ }
+ }
+
+ public static void demoExceptionalResource() throws Exception {
+ try (ExceptionalResource exceptionalResource = new ExceptionalResource()) {
+ exceptionalResource.processSomething();
+ }
+ }
+}
diff --git a/core-java-modules/core-java-exceptions-2/src/test/java/com/baeldung/suppressed/SuppressedExceptionsUnitTest.java b/core-java-modules/core-java-exceptions-2/src/test/java/com/baeldung/suppressed/SuppressedExceptionsUnitTest.java
new file mode 100644
index 0000000000..7664ee6847
--- /dev/null
+++ b/core-java-modules/core-java-exceptions-2/src/test/java/com/baeldung/suppressed/SuppressedExceptionsUnitTest.java
@@ -0,0 +1,42 @@
+package com.baeldung.suppressed;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertThat;
+
+import java.io.FileNotFoundException;
+import java.io.IOException;
+
+import org.junit.Test;
+import static org.hamcrest.CoreMatchers.instanceOf;
+
+public class SuppressedExceptionsUnitTest {
+
+ @Test(expected = NullPointerException.class)
+ public void givenNonExistentFileName_whenAttemptFileOpen_thenNullPointerException() throws IOException {
+ SuppressedExceptionsDemo.demoSuppressedException("/non-existent-path/non-existent-file.txt");
+ }
+
+ @Test
+ public void givenNonExistentFileName_whenAttemptFileOpenStoreSuppressed_thenSuppressedExceptionAvailable() {
+ try {
+ SuppressedExceptionsDemo.demoAddSuppressedException("/non-existent-path/non-existent-file.txt");
+ } catch (Exception e) {
+ assertThat(e, instanceOf(NullPointerException.class));
+ assertEquals(1, e.getSuppressed().length);
+ assertThat(e.getSuppressed()[0], instanceOf(FileNotFoundException.class));
+ }
+ }
+
+ @Test
+ public void whenUsingExceptionalResource_thenSuppressedExceptionAvailable() {
+ try {
+ SuppressedExceptionsDemo.demoExceptionalResource();
+ } catch (Exception e) {
+ assertThat(e, instanceOf(IllegalArgumentException.class));
+ assertEquals("Thrown from processSomething()", e.getMessage());
+ assertEquals(1, e.getSuppressed().length);
+ assertThat(e.getSuppressed()[0], instanceOf(NullPointerException.class));
+ assertEquals("Thrown from close()", e.getSuppressed()[0].getMessage());
+ }
+ }
+}
diff --git a/libraries-3/pom.xml b/libraries-3/pom.xml
index 4bb1a4fba1..a438d423e2 100644
--- a/libraries-3/pom.xml
+++ b/libraries-3/pom.xml
@@ -83,7 +83,6 @@
moshi-adapters
${moshi.version}
-
com.jcabi
jcabi-aspects
@@ -95,6 +94,16 @@
${aspectjrt.version}
runtime
+
+ org.takes
+ takes
+ ${takes.version}
+
+
+ org.apache.velocity
+ velocity-engine-core
+ ${velocity-engine-core.version}
+
@@ -132,8 +141,55 @@
+
+
+ src/main/webapp
+ true
+
+
-
+
+
+
+ reload
+
+
+
+ src/main/resources
+ true
+
+
+ src/main/webapp
+ true
+
+
+
+
+ org.codehaus.mojo
+ exec-maven-plugin
+ ${exec-maven-plugin.version}
+
+
+ start-server
+ pre-integration-test
+
+ java
+
+
+
+
+ com.baeldung.takes.TakesApp
+ false
+
+ --port=${port}
+
+
+
+
+
+
+
+
1.78
1.18.6
@@ -151,5 +207,9 @@
0.14.1
1.9.2
1.9.2
+
+ 1.19
+ 2.2
+ 1.6.0
diff --git a/libraries-3/src/main/java/com/baeldung/takes/TakesApp.java b/libraries-3/src/main/java/com/baeldung/takes/TakesApp.java
new file mode 100644
index 0000000000..3c1407c291
--- /dev/null
+++ b/libraries-3/src/main/java/com/baeldung/takes/TakesApp.java
@@ -0,0 +1,42 @@
+package com.baeldung.takes;
+
+import java.io.IOException;
+import java.sql.SQLException;
+
+import org.takes.Response;
+import org.takes.facets.fallback.Fallback;
+import org.takes.facets.fallback.FbChain;
+import org.takes.facets.fallback.FbStatus;
+import org.takes.facets.fallback.RqFallback;
+import org.takes.facets.fallback.TkFallback;
+import org.takes.facets.fork.FkRegex;
+import org.takes.facets.fork.TkFork;
+import org.takes.http.Exit;
+import org.takes.http.FtBasic;
+import org.takes.misc.Opt;
+import org.takes.rs.RsText;
+
+public final class TakesApp {
+
+ public static void main(final String... args) throws IOException, SQLException {
+ new FtBasic(
+ new TkFallback(
+ new TkFork(
+ new FkRegex("/", new TakesHelloWorld()),
+ new FkRegex("/index", new TakesIndex()),
+ new FkRegex("/contact", new TakesContact())
+ ),
+ new FbChain(
+ new FbStatus(404, new RsText("Page Not Found")),
+ new FbStatus(405, new RsText("Method Not Allowed")),
+ new Fallback() {
+ @Override
+ public Opt route(final RqFallback req) {
+ return new Opt.Single(new RsText(req.throwable().getMessage()));
+ }
+ })
+ ), 6060
+ ).start(Exit.NEVER);
+ }
+
+}
\ No newline at end of file
diff --git a/libraries-3/src/main/java/com/baeldung/takes/TakesContact.java b/libraries-3/src/main/java/com/baeldung/takes/TakesContact.java
new file mode 100644
index 0000000000..e083bc3dc6
--- /dev/null
+++ b/libraries-3/src/main/java/com/baeldung/takes/TakesContact.java
@@ -0,0 +1,22 @@
+package com.baeldung.takes;
+
+import java.io.IOException;
+
+import org.takes.Request;
+import org.takes.Response;
+import org.takes.Take;
+import org.takes.rs.RsWithBody;
+import org.takes.rs.RsWithStatus;
+import org.takes.rs.RsWithType;
+
+public final class TakesContact implements Take {
+
+ @Override
+ public Response act(Request req) throws IOException {
+ return new RsWithStatus(
+ new RsWithType(
+ new RsWithBody("Contact us at https://www.baeldung.com"),
+ "text/html"), 200);
+ }
+
+}
diff --git a/libraries-3/src/main/java/com/baeldung/takes/TakesHelloWorld.java b/libraries-3/src/main/java/com/baeldung/takes/TakesHelloWorld.java
new file mode 100644
index 0000000000..9d1346d3c1
--- /dev/null
+++ b/libraries-3/src/main/java/com/baeldung/takes/TakesHelloWorld.java
@@ -0,0 +1,15 @@
+package com.baeldung.takes;
+
+import org.takes.Request;
+import org.takes.Response;
+import org.takes.Take;
+import org.takes.rs.RsText;
+
+public class TakesHelloWorld implements Take {
+
+ @Override
+ public Response act(final Request request) {
+ return new RsText("Hello, world!");
+ }
+
+}
diff --git a/libraries-3/src/main/java/com/baeldung/takes/TakesIndex.java b/libraries-3/src/main/java/com/baeldung/takes/TakesIndex.java
new file mode 100644
index 0000000000..3f74ba9c67
--- /dev/null
+++ b/libraries-3/src/main/java/com/baeldung/takes/TakesIndex.java
@@ -0,0 +1,24 @@
+package com.baeldung.takes;
+
+import java.io.IOException;
+
+import org.takes.Request;
+import org.takes.Response;
+import org.takes.Take;
+import org.takes.rq.form.RqFormSmart;
+import org.takes.rs.RsHtml;
+import org.takes.rs.RsVelocity;
+
+public final class TakesIndex implements Take {
+
+ @Override
+ public Response act(final Request req) throws IOException {
+ RqFormSmart form = new RqFormSmart(req);
+ String username = form.single("username");
+ return new RsHtml(
+ new RsVelocity(this.getClass().getResource("/templates/index.vm"),
+ new RsVelocity.Pair("username", username))
+ );
+ }
+
+}
diff --git a/libraries-3/src/main/webapp/templates/index.vm b/libraries-3/src/main/webapp/templates/index.vm
new file mode 100644
index 0000000000..5a97f654ce
--- /dev/null
+++ b/libraries-3/src/main/webapp/templates/index.vm
@@ -0,0 +1,9 @@
+
+
+Index
+
+
+Takes Web Application
+Welcome, ${username}
+
+
diff --git a/libraries-3/src/test/java/com/baeldung/takes/TakesAppIntegrationTest.java b/libraries-3/src/test/java/com/baeldung/takes/TakesAppIntegrationTest.java
new file mode 100644
index 0000000000..8b869d0742
--- /dev/null
+++ b/libraries-3/src/test/java/com/baeldung/takes/TakesAppIntegrationTest.java
@@ -0,0 +1,36 @@
+package com.baeldung.takes;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.IOException;
+import java.net.URI;
+
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.impl.client.HttpClientBuilder;
+import org.apache.http.util.EntityUtils;
+import org.junit.Test;
+import org.takes.http.FtRemote;
+
+public class TakesAppIntegrationTest {
+
+ @Test
+ public void givenTake_whenRunRemoteServer_thenRespond() throws Exception {
+ new FtRemote(new TakesContact()).exec(
+ new FtRemote.Script() {
+ @Override
+ public void exec(final URI home) throws IOException {
+ HttpClient client = HttpClientBuilder.create().build();
+ HttpResponse response = client.execute(new HttpGet(home));
+ int statusCode = response.getStatusLine().getStatusCode();
+ HttpEntity entity = response.getEntity();
+ String result = EntityUtils.toString(entity);
+
+ assertEquals(200, statusCode);
+ assertEquals("Contact us at https://www.baeldung.com", result);
+ }
+ });
+ }
+}
diff --git a/libraries-3/src/test/java/com/baeldung/takes/TakesContactUnitTest.java b/libraries-3/src/test/java/com/baeldung/takes/TakesContactUnitTest.java
new file mode 100644
index 0000000000..5f8b7c57fc
--- /dev/null
+++ b/libraries-3/src/test/java/com/baeldung/takes/TakesContactUnitTest.java
@@ -0,0 +1,17 @@
+package com.baeldung.takes;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.takes.rq.RqFake;
+import org.takes.rs.RsPrint;
+
+public class TakesContactUnitTest {
+
+ @Test
+ public void givenTake_whenInvokeActMethod_thenRespond() throws Exception {
+ final String resp = new RsPrint(new TakesContact().act(new RqFake())).printBody();
+ assertEquals("Contact us at https://www.baeldung.com", resp);
+ }
+
+}
diff --git a/lombok-custom/pom.xml b/lombok-custom/pom.xml
index 75c3f9d407..220367bfe9 100644
--- a/lombok-custom/pom.xml
+++ b/lombok-custom/pom.xml
@@ -53,24 +53,6 @@
-
- mac-profile
-
- false
-
- ${java.home}/../Classes/classes.jar
-
-
-
-
- com.sun
- tools
- ${java.version}
- system
- ${java.home}/../Classes/classes.jar
-
-
-
diff --git a/spring-boot-rest/src/main/java/com/baeldung/web/controller/FooController.java b/spring-boot-rest/src/main/java/com/baeldung/web/controller/FooController.java
index 8174480078..a09878fb84 100644
--- a/spring-boot-rest/src/main/java/com/baeldung/web/controller/FooController.java
+++ b/spring-boot-rest/src/main/java/com/baeldung/web/controller/FooController.java
@@ -4,6 +4,8 @@ import java.util.List;
import javax.servlet.http.HttpServletResponse;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.data.domain.Page;
@@ -11,6 +13,7 @@ import org.springframework.data.domain.Pageable;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
@@ -25,6 +28,8 @@ import org.springframework.web.util.UriComponentsBuilder;
import com.baeldung.persistence.model.Foo;
import com.baeldung.persistence.service.IFooService;
+import com.baeldung.web.exception.CustomException1;
+import com.baeldung.web.exception.CustomException2;
import com.baeldung.web.exception.MyResourceNotFoundException;
import com.baeldung.web.hateoas.event.PaginatedResultsRetrievedEvent;
import com.baeldung.web.hateoas.event.ResourceCreatedEvent;
@@ -36,6 +41,8 @@ import com.google.common.base.Preconditions;
@RequestMapping(value = "/foos")
public class FooController {
+ private static final Logger logger = LoggerFactory.getLogger(FooController.class);
+
@Autowired
private ApplicationEventPublisher eventPublisher;
@@ -137,4 +144,10 @@ public class FooController {
public void delete(@PathVariable("id") final Long id) {
service.deleteById(id);
}
+
+ @ExceptionHandler({ CustomException1.class, CustomException2.class })
+ public void handleException(final Exception ex) {
+ final String error = "Application specific error handling";
+ logger.error(error, ex);
+ }
}
diff --git a/spring-boot-rest/src/main/java/com/baeldung/web/error/RestResponseStatusExceptionResolver.java b/spring-boot-rest/src/main/java/com/baeldung/web/error/RestResponseStatusExceptionResolver.java
new file mode 100644
index 0000000000..6753ab35cf
--- /dev/null
+++ b/spring-boot-rest/src/main/java/com/baeldung/web/error/RestResponseStatusExceptionResolver.java
@@ -0,0 +1,73 @@
+package com.baeldung.web.error;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.stereotype.Component;
+import org.springframework.web.servlet.ModelAndView;
+import org.springframework.web.servlet.handler.AbstractHandlerExceptionResolver;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.dataformat.xml.XmlMapper;
+
+@Component
+public class RestResponseStatusExceptionResolver extends AbstractHandlerExceptionResolver {
+
+ private static final Logger logger = LoggerFactory.getLogger(RestResponseStatusExceptionResolver.class);
+
+ @Override
+ protected ModelAndView doResolveException(HttpServletRequest request,
+ HttpServletResponse response, Object handler, Exception ex) {
+ try {
+ if (ex instanceof IllegalArgumentException) {
+ return handleIllegalArgument(
+ (IllegalArgumentException) ex, request, response, handler);
+ }
+ } catch (Exception handlerException) {
+ logger.warn("Handling of [{}] resulted in Exception", ex.getClass().getName(), handlerException);
+ }
+ return null;
+ }
+
+ private ModelAndView handleIllegalArgument(IllegalArgumentException ex,
+ final HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
+ final String accept = request.getHeader(HttpHeaders.ACCEPT);
+
+ response.sendError(HttpServletResponse.SC_CONFLICT);
+ response.setHeader("ContentType", accept);
+
+ final ModelAndView modelAndView = new ModelAndView("error");
+ modelAndView.addObject("error", prepareErrorResponse(accept));
+ return modelAndView;
+ }
+
+ /** Prepares error object based on the provided accept type.
+ * @param accept The Accept header present in the request.
+ * @return The response to return
+ * @throws JsonProcessingException
+ */
+ private String prepareErrorResponse(String accept) throws JsonProcessingException {
+ final Map error = new HashMap<>();
+ error.put("Error", "Application specific error message");
+
+ final String response;
+ if(MediaType.APPLICATION_JSON_VALUE.equals(accept)) {
+ response = new ObjectMapper().writeValueAsString(error);
+ } else {
+ response = new XmlMapper().writeValueAsString(error);
+ }
+
+ return response;
+ }
+
+
+
+}
diff --git a/spring-boot-rest/src/main/java/com/baeldung/web/exception/CustomException1.java b/spring-boot-rest/src/main/java/com/baeldung/web/exception/CustomException1.java
new file mode 100644
index 0000000000..ed8d34ae2b
--- /dev/null
+++ b/spring-boot-rest/src/main/java/com/baeldung/web/exception/CustomException1.java
@@ -0,0 +1,7 @@
+package com.baeldung.web.exception;
+
+public class CustomException1 extends RuntimeException {
+
+ private static final long serialVersionUID = 1L;
+
+}
diff --git a/spring-boot-rest/src/main/java/com/baeldung/web/exception/CustomException2.java b/spring-boot-rest/src/main/java/com/baeldung/web/exception/CustomException2.java
new file mode 100644
index 0000000000..39b6c98a82
--- /dev/null
+++ b/spring-boot-rest/src/main/java/com/baeldung/web/exception/CustomException2.java
@@ -0,0 +1,7 @@
+package com.baeldung.web.exception;
+
+public class CustomException2 extends RuntimeException {
+
+ private static final long serialVersionUID = 1L;
+
+}
diff --git a/spring-boot-rest/src/main/java/com/baeldung/web/exception/MyResourceNotFoundException.java b/spring-boot-rest/src/main/java/com/baeldung/web/exception/MyResourceNotFoundException.java
index fd002efc28..59bcfde57a 100644
--- a/spring-boot-rest/src/main/java/com/baeldung/web/exception/MyResourceNotFoundException.java
+++ b/spring-boot-rest/src/main/java/com/baeldung/web/exception/MyResourceNotFoundException.java
@@ -1,5 +1,9 @@
package com.baeldung.web.exception;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.ResponseStatus;
+
+@ResponseStatus(value = HttpStatus.NOT_FOUND)
public final class MyResourceNotFoundException extends RuntimeException {
public MyResourceNotFoundException() {
diff --git a/spring-boot-rest/src/test/java/com/baeldung/web/FooControllerWebLayerIntegrationTest.java b/spring-boot-rest/src/test/java/com/baeldung/web/FooControllerWebLayerIntegrationTest.java
index bd98523b0a..4d4a274b1a 100644
--- a/spring-boot-rest/src/test/java/com/baeldung/web/FooControllerWebLayerIntegrationTest.java
+++ b/spring-boot-rest/src/test/java/com/baeldung/web/FooControllerWebLayerIntegrationTest.java
@@ -10,8 +10,10 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.
import java.util.Collections;
import org.hamcrest.Matchers;
+import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.mockito.Mockito;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.boot.test.mock.mockito.MockBean;
@@ -24,6 +26,7 @@ import org.springframework.test.web.servlet.MockMvc;
import com.baeldung.persistence.model.Foo;
import com.baeldung.persistence.service.IFooService;
import com.baeldung.web.controller.FooController;
+import com.baeldung.web.exception.CustomException1;
import com.baeldung.web.hateoas.event.PaginatedResultsRetrievedEvent;
/**
@@ -56,5 +59,15 @@ public class FooControllerWebLayerIntegrationTest {
.andExpect(status().isOk())
.andExpect(jsonPath("$",Matchers.hasSize(1)));
}
-
+
+ @Test
+ public void delete_forException_fromService() throws Exception {
+ Mockito.when(service.findAll()).thenThrow(new CustomException1());
+ this.mockMvc.perform(get("/foos")).andDo(h -> {
+ final Exception expectedException = h.getResolvedException();
+ Assert.assertTrue(expectedException instanceof CustomException1);
+
+ });
+ }
+
}
diff --git a/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejb/spring/comparison/ejb/messagedriven/RecieverMDB.java b/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejbspringcomparison/ejb/messagedriven/RecieverMDB.java
similarity index 96%
rename from spring-ejb/ejb-beans/src/main/java/com/baeldung/ejb/spring/comparison/ejb/messagedriven/RecieverMDB.java
rename to spring-ejb/ejb-beans/src/main/java/com/baeldung/ejbspringcomparison/ejb/messagedriven/RecieverMDB.java
index 7a6b750ce5..f7f43244d5 100644
--- a/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejb/spring/comparison/ejb/messagedriven/RecieverMDB.java
+++ b/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejbspringcomparison/ejb/messagedriven/RecieverMDB.java
@@ -1,4 +1,4 @@
-package com.baeldung.ejb.spring.comparison.ejb.messagedriven;
+package com.baeldung.ejbspringcomparison.ejb.messagedriven;
import javax.annotation.Resource;
import javax.ejb.ActivationConfigProperty;
diff --git a/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejb/spring/comparison/ejb/singleton/CounterEJB.java b/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejbspringcomparison/ejb/singleton/CounterEJB.java
similarity index 85%
rename from spring-ejb/ejb-beans/src/main/java/com/baeldung/ejb/spring/comparison/ejb/singleton/CounterEJB.java
rename to spring-ejb/ejb-beans/src/main/java/com/baeldung/ejbspringcomparison/ejb/singleton/CounterEJB.java
index 8582d79662..6873a717a9 100644
--- a/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejb/spring/comparison/ejb/singleton/CounterEJB.java
+++ b/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejbspringcomparison/ejb/singleton/CounterEJB.java
@@ -1,4 +1,4 @@
-package com.baeldung.ejb.spring.comparison.ejb.singleton;
+package com.baeldung.ejbspringcomparison.ejb.singleton;
import javax.ejb.Singleton;
diff --git a/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejb/spring/comparison/ejb/singleton/CounterEJBRemote.java b/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejbspringcomparison/ejb/singleton/CounterEJBRemote.java
similarity index 71%
rename from spring-ejb/ejb-beans/src/main/java/com/baeldung/ejb/spring/comparison/ejb/singleton/CounterEJBRemote.java
rename to spring-ejb/ejb-beans/src/main/java/com/baeldung/ejbspringcomparison/ejb/singleton/CounterEJBRemote.java
index a66cda4f3e..ed02cfed4c 100644
--- a/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejb/spring/comparison/ejb/singleton/CounterEJBRemote.java
+++ b/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejbspringcomparison/ejb/singleton/CounterEJBRemote.java
@@ -1,4 +1,4 @@
-package com.baeldung.ejb.spring.comparison.ejb.singleton;
+package com.baeldung.ejbspringcomparison.ejb.singleton;
import javax.ejb.Remote;
diff --git a/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejb/spring/comparison/ejb/stateful/ShoppingCartEJB.java b/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejbspringcomparison/ejb/stateful/ShoppingCartEJB.java
similarity index 91%
rename from spring-ejb/ejb-beans/src/main/java/com/baeldung/ejb/spring/comparison/ejb/stateful/ShoppingCartEJB.java
rename to spring-ejb/ejb-beans/src/main/java/com/baeldung/ejbspringcomparison/ejb/stateful/ShoppingCartEJB.java
index 501af4059f..e01e53add1 100644
--- a/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejb/spring/comparison/ejb/stateful/ShoppingCartEJB.java
+++ b/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejbspringcomparison/ejb/stateful/ShoppingCartEJB.java
@@ -1,4 +1,4 @@
-package com.baeldung.ejb.spring.comparison.ejb.stateful;
+package com.baeldung.ejbspringcomparison.ejb.stateful;
import java.util.ArrayList;
import java.util.List;
diff --git a/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejb/spring/comparison/ejb/stateful/ShoppingCartEJBRemote.java b/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejbspringcomparison/ejb/stateful/ShoppingCartEJBRemote.java
similarity index 79%
rename from spring-ejb/ejb-beans/src/main/java/com/baeldung/ejb/spring/comparison/ejb/stateful/ShoppingCartEJBRemote.java
rename to spring-ejb/ejb-beans/src/main/java/com/baeldung/ejbspringcomparison/ejb/stateful/ShoppingCartEJBRemote.java
index 4e1e407520..cea9cc3ad9 100644
--- a/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejb/spring/comparison/ejb/stateful/ShoppingCartEJBRemote.java
+++ b/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejbspringcomparison/ejb/stateful/ShoppingCartEJBRemote.java
@@ -1,4 +1,4 @@
-package com.baeldung.ejb.spring.comparison.ejb.stateful;
+package com.baeldung.ejbspringcomparison.ejb.stateful;
import java.util.List;
diff --git a/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejb/spring/comparison/ejb/stateless/FinderEJB.java b/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejbspringcomparison/ejb/stateless/FinderEJB.java
similarity index 89%
rename from spring-ejb/ejb-beans/src/main/java/com/baeldung/ejb/spring/comparison/ejb/stateless/FinderEJB.java
rename to spring-ejb/ejb-beans/src/main/java/com/baeldung/ejbspringcomparison/ejb/stateless/FinderEJB.java
index fb45e4e7ce..7609b17675 100644
--- a/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejb/spring/comparison/ejb/stateless/FinderEJB.java
+++ b/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejbspringcomparison/ejb/stateless/FinderEJB.java
@@ -1,4 +1,4 @@
-package com.baeldung.ejb.spring.comparison.ejb.stateless;
+package com.baeldung.ejbspringcomparison.ejb.stateless;
import java.util.HashMap;
import java.util.Map;
diff --git a/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejb/spring/comparison/ejb/stateless/FinderEJBRemote.java b/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejbspringcomparison/ejb/stateless/FinderEJBRemote.java
similarity index 65%
rename from spring-ejb/ejb-beans/src/main/java/com/baeldung/ejb/spring/comparison/ejb/stateless/FinderEJBRemote.java
rename to spring-ejb/ejb-beans/src/main/java/com/baeldung/ejbspringcomparison/ejb/stateless/FinderEJBRemote.java
index 36b4c9ae04..0354eff2b8 100644
--- a/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejb/spring/comparison/ejb/stateless/FinderEJBRemote.java
+++ b/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejbspringcomparison/ejb/stateless/FinderEJBRemote.java
@@ -1,4 +1,4 @@
-package com.baeldung.ejb.spring.comparison.ejb.stateless;
+package com.baeldung.ejbspringcomparison.ejb.stateless;
import javax.ejb.Remote;
diff --git a/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejb/spring/comparison/spring/config/ApplicationConfig.java b/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejbspringcomparison/spring/config/ApplicationConfig.java
similarity index 89%
rename from spring-ejb/ejb-beans/src/main/java/com/baeldung/ejb/spring/comparison/spring/config/ApplicationConfig.java
rename to spring-ejb/ejb-beans/src/main/java/com/baeldung/ejbspringcomparison/spring/config/ApplicationConfig.java
index 6ec14dc098..8d6114d1c5 100644
--- a/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejb/spring/comparison/spring/config/ApplicationConfig.java
+++ b/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejbspringcomparison/spring/config/ApplicationConfig.java
@@ -1,4 +1,4 @@
-package com.baeldung.ejb.spring.comparison.spring.config;
+package com.baeldung.ejbspringcomparison.spring.config;
import javax.jms.ConnectionFactory;
@@ -11,7 +11,7 @@ import org.springframework.jms.config.DefaultJmsListenerContainerFactory;
import org.springframework.jms.core.JmsTemplate;
@Configuration
-@ComponentScan(basePackages = "com.baeldung.ejb.spring.comparison.spring")
+@ComponentScan(basePackages = "com.baeldung.ejbspringcomparison.spring")
@EnableJms
public class ApplicationConfig {
diff --git a/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejb/spring/comparison/spring/messagedriven/Producer.java b/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejbspringcomparison/spring/messagedriven/Producer.java
similarity index 88%
rename from spring-ejb/ejb-beans/src/main/java/com/baeldung/ejb/spring/comparison/spring/messagedriven/Producer.java
rename to spring-ejb/ejb-beans/src/main/java/com/baeldung/ejbspringcomparison/spring/messagedriven/Producer.java
index a60dc4db8e..683ae7f51b 100644
--- a/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejb/spring/comparison/spring/messagedriven/Producer.java
+++ b/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejbspringcomparison/spring/messagedriven/Producer.java
@@ -1,4 +1,4 @@
-package com.baeldung.ejb.spring.comparison.spring.messagedriven;
+package com.baeldung.ejbspringcomparison.spring.messagedriven;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsTemplate;
diff --git a/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejb/spring/comparison/spring/messagedriven/Receiver.java b/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejbspringcomparison/spring/messagedriven/Receiver.java
similarity index 88%
rename from spring-ejb/ejb-beans/src/main/java/com/baeldung/ejb/spring/comparison/spring/messagedriven/Receiver.java
rename to spring-ejb/ejb-beans/src/main/java/com/baeldung/ejbspringcomparison/spring/messagedriven/Receiver.java
index a3b36dd587..9a483e23c9 100644
--- a/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejb/spring/comparison/spring/messagedriven/Receiver.java
+++ b/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejbspringcomparison/spring/messagedriven/Receiver.java
@@ -1,4 +1,4 @@
-package com.baeldung.ejb.spring.comparison.spring.messagedriven;
+package com.baeldung.ejbspringcomparison.spring.messagedriven;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.annotation.JmsListener;
diff --git a/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejb/spring/comparison/spring/singleton/CounterBean.java b/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejbspringcomparison/spring/singleton/CounterBean.java
similarity index 84%
rename from spring-ejb/ejb-beans/src/main/java/com/baeldung/ejb/spring/comparison/spring/singleton/CounterBean.java
rename to spring-ejb/ejb-beans/src/main/java/com/baeldung/ejbspringcomparison/spring/singleton/CounterBean.java
index c28e7bf74c..6b2b57582d 100644
--- a/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejb/spring/comparison/spring/singleton/CounterBean.java
+++ b/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejbspringcomparison/spring/singleton/CounterBean.java
@@ -1,4 +1,4 @@
-package com.baeldung.ejb.spring.comparison.spring.singleton;
+package com.baeldung.ejbspringcomparison.spring.singleton;
import org.springframework.stereotype.Component;
diff --git a/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejb/spring/comparison/spring/stateful/ShoppingCartBean.java b/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejbspringcomparison/spring/stateful/ShoppingCartBean.java
similarity index 92%
rename from spring-ejb/ejb-beans/src/main/java/com/baeldung/ejb/spring/comparison/spring/stateful/ShoppingCartBean.java
rename to spring-ejb/ejb-beans/src/main/java/com/baeldung/ejbspringcomparison/spring/stateful/ShoppingCartBean.java
index 4d372baa84..e6e026f52a 100644
--- a/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejb/spring/comparison/spring/stateful/ShoppingCartBean.java
+++ b/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejbspringcomparison/spring/stateful/ShoppingCartBean.java
@@ -1,4 +1,4 @@
-package com.baeldung.ejb.spring.comparison.spring.stateful;
+package com.baeldung.ejbspringcomparison.spring.stateful;
import java.util.ArrayList;
import java.util.List;
diff --git a/spring-ejb/ejb-beans/src/test/java/com/baeldung/ejb/spring/comparison/ejb/EJBUnitTest.java b/spring-ejb/ejb-beans/src/test/java/com/baeldung/ejbspringcomparison/ejb/EJBUnitTest.java
similarity index 93%
rename from spring-ejb/ejb-beans/src/test/java/com/baeldung/ejb/spring/comparison/ejb/EJBUnitTest.java
rename to spring-ejb/ejb-beans/src/test/java/com/baeldung/ejbspringcomparison/ejb/EJBUnitTest.java
index 3e9e5e7933..069028253e 100644
--- a/spring-ejb/ejb-beans/src/test/java/com/baeldung/ejb/spring/comparison/ejb/EJBUnitTest.java
+++ b/spring-ejb/ejb-beans/src/test/java/com/baeldung/ejbspringcomparison/ejb/EJBUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.ejb.spring.comparison.ejb;
+package com.baeldung.ejbspringcomparison.ejb;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNull;
@@ -23,9 +23,9 @@ import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
-import com.baeldung.ejb.spring.comparison.ejb.singleton.CounterEJBRemote;
-import com.baeldung.ejb.spring.comparison.ejb.stateful.ShoppingCartEJBRemote;
-import com.baeldung.ejb.spring.comparison.ejb.stateless.FinderEJBRemote;
+import com.baeldung.ejbspringcomparison.ejb.singleton.CounterEJBRemote;
+import com.baeldung.ejbspringcomparison.ejb.stateful.ShoppingCartEJBRemote;
+import com.baeldung.ejbspringcomparison.ejb.stateless.FinderEJBRemote;
public class EJBUnitTest {
diff --git a/spring-ejb/ejb-beans/src/test/java/com/baeldung/ejb/spring/comparison/spring/SpringUnitTest.java b/spring-ejb/ejb-beans/src/test/java/com/baeldung/ejbspringcomparison/spring/SpringUnitTest.java
similarity index 89%
rename from spring-ejb/ejb-beans/src/test/java/com/baeldung/ejb/spring/comparison/spring/SpringUnitTest.java
rename to spring-ejb/ejb-beans/src/test/java/com/baeldung/ejbspringcomparison/spring/SpringUnitTest.java
index 7a9ddc15a4..e0b397befe 100644
--- a/spring-ejb/ejb-beans/src/test/java/com/baeldung/ejb/spring/comparison/spring/SpringUnitTest.java
+++ b/spring-ejb/ejb-beans/src/test/java/com/baeldung/ejbspringcomparison/spring/SpringUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.ejb.spring.comparison.spring;
+package com.baeldung.ejbspringcomparison.spring;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNull;
@@ -13,10 +13,10 @@ import org.junit.ClassRule;
import org.junit.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
-import com.baeldung.ejb.spring.comparison.spring.config.ApplicationConfig;
-import com.baeldung.ejb.spring.comparison.spring.messagedriven.Producer;
-import com.baeldung.ejb.spring.comparison.spring.singleton.CounterBean;
-import com.baeldung.ejb.spring.comparison.spring.stateful.ShoppingCartBean;
+import com.baeldung.ejbspringcomparison.spring.config.ApplicationConfig;
+import com.baeldung.ejbspringcomparison.spring.messagedriven.Producer;
+import com.baeldung.ejbspringcomparison.spring.singleton.CounterBean;
+import com.baeldung.ejbspringcomparison.spring.stateful.ShoppingCartBean;
public class SpringUnitTest {