From d1792871d58a5280ff18efb655a8614b97e8dc50 Mon Sep 17 00:00:00 2001 From: thibaultfaure Date: Tue, 8 Feb 2022 19:11:06 -0300 Subject: [PATCH] =?UTF-8?q?Code=20for=20the=20Spring=20@Autowired=20Field?= =?UTF-8?q?=20Null=20=E2=80=93=20Common=20Causes=20and=20Solutions=20artic?= =?UTF-8?q?le=20(#11792)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- spring-5-autowiring-beans/pom.xml | 24 ++++++++++++++++ .../java/com/baeldung/autowiring/App.java | 14 ++++++++++ .../controller/CorrectController.java | 18 ++++++++++++ .../controller/FlawedController.java | 15 ++++++++++ .../autowiring/service/MyComponent.java | 10 +++++++ .../autowiring/service/MyService.java | 19 +++++++++++++ .../service/MyServiceConfiguration.java | 14 ++++++++++ .../CorrectControllerIntegrationTest.java | 23 +++++++++++++++ .../FlawedControllerIntegrationTest.java | 28 +++++++++++++++++++ 9 files changed, 165 insertions(+) create mode 100644 spring-5-autowiring-beans/pom.xml create mode 100644 spring-5-autowiring-beans/src/main/java/com/baeldung/autowiring/App.java create mode 100644 spring-5-autowiring-beans/src/main/java/com/baeldung/autowiring/controller/CorrectController.java create mode 100644 spring-5-autowiring-beans/src/main/java/com/baeldung/autowiring/controller/FlawedController.java create mode 100644 spring-5-autowiring-beans/src/main/java/com/baeldung/autowiring/service/MyComponent.java create mode 100644 spring-5-autowiring-beans/src/main/java/com/baeldung/autowiring/service/MyService.java create mode 100644 spring-5-autowiring-beans/src/main/java/com/baeldung/autowiring/service/MyServiceConfiguration.java create mode 100644 spring-5-autowiring-beans/src/test/java/com/baeldung/autowiring/controller/CorrectControllerIntegrationTest.java create mode 100644 spring-5-autowiring-beans/src/test/java/com/baeldung/autowiring/controller/FlawedControllerIntegrationTest.java diff --git a/spring-5-autowiring-beans/pom.xml b/spring-5-autowiring-beans/pom.xml new file mode 100644 index 0000000000..32b56cc9ad --- /dev/null +++ b/spring-5-autowiring-beans/pom.xml @@ -0,0 +1,24 @@ + + + 4.0.0 + spring-5-autowiring-beans + 0.0.1-SNAPSHOT + spring-5-autowiring-beans + + + com.baeldung + parent-boot-2 + 0.0.1-SNAPSHOT + ../parent-boot-2 + + + + + org.springframework.boot + spring-boot-starter-web + + + + diff --git a/spring-5-autowiring-beans/src/main/java/com/baeldung/autowiring/App.java b/spring-5-autowiring-beans/src/main/java/com/baeldung/autowiring/App.java new file mode 100644 index 0000000000..d2d0db7a60 --- /dev/null +++ b/spring-5-autowiring-beans/src/main/java/com/baeldung/autowiring/App.java @@ -0,0 +1,14 @@ +package com.baeldung.autowiring; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.ComponentScan; + +@SpringBootApplication +public class App { + + public static void main(String[] args) { + SpringApplication.run(App.class, args); + } + +} diff --git a/spring-5-autowiring-beans/src/main/java/com/baeldung/autowiring/controller/CorrectController.java b/spring-5-autowiring-beans/src/main/java/com/baeldung/autowiring/controller/CorrectController.java new file mode 100644 index 0000000000..e0c0d7eeac --- /dev/null +++ b/spring-5-autowiring-beans/src/main/java/com/baeldung/autowiring/controller/CorrectController.java @@ -0,0 +1,18 @@ +package com.baeldung.autowiring.controller; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; + +import com.baeldung.autowiring.service.MyService; + +@Controller +public class CorrectController { + + @Autowired + MyService myService; + + public String control() { + return myService.serve(); + } + +} diff --git a/spring-5-autowiring-beans/src/main/java/com/baeldung/autowiring/controller/FlawedController.java b/spring-5-autowiring-beans/src/main/java/com/baeldung/autowiring/controller/FlawedController.java new file mode 100644 index 0000000000..673e686f79 --- /dev/null +++ b/spring-5-autowiring-beans/src/main/java/com/baeldung/autowiring/controller/FlawedController.java @@ -0,0 +1,15 @@ +package com.baeldung.autowiring.controller; + +import org.springframework.stereotype.Controller; + +import com.baeldung.autowiring.service.MyService; + +@Controller +public class FlawedController { + + public String control() { + MyService userService = new MyService(); + return userService.serve(); + } + +} diff --git a/spring-5-autowiring-beans/src/main/java/com/baeldung/autowiring/service/MyComponent.java b/spring-5-autowiring-beans/src/main/java/com/baeldung/autowiring/service/MyComponent.java new file mode 100644 index 0000000000..c04ca3f4ba --- /dev/null +++ b/spring-5-autowiring-beans/src/main/java/com/baeldung/autowiring/service/MyComponent.java @@ -0,0 +1,10 @@ +package com.baeldung.autowiring.service; + +import org.springframework.stereotype.Component; + +@Component +public class MyComponent { + + public void doWork() {} + +} diff --git a/spring-5-autowiring-beans/src/main/java/com/baeldung/autowiring/service/MyService.java b/spring-5-autowiring-beans/src/main/java/com/baeldung/autowiring/service/MyService.java new file mode 100644 index 0000000000..3443dc05de --- /dev/null +++ b/spring-5-autowiring-beans/src/main/java/com/baeldung/autowiring/service/MyService.java @@ -0,0 +1,19 @@ +package com.baeldung.autowiring.service; + +import org.springframework.beans.factory.annotation.Autowired; + +/** + * The bean corresponding to this class is defined in MyServiceConfiguration + * Alternatively, you could choose to decorate this class with @Component or @Service + */ +public class MyService { + + @Autowired + MyComponent myComponent; + + public String serve() { + myComponent.doWork(); + return "success"; + } + +} diff --git a/spring-5-autowiring-beans/src/main/java/com/baeldung/autowiring/service/MyServiceConfiguration.java b/spring-5-autowiring-beans/src/main/java/com/baeldung/autowiring/service/MyServiceConfiguration.java new file mode 100644 index 0000000000..e30e4f770e --- /dev/null +++ b/spring-5-autowiring-beans/src/main/java/com/baeldung/autowiring/service/MyServiceConfiguration.java @@ -0,0 +1,14 @@ +package com.baeldung.autowiring.service; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class MyServiceConfiguration { + + @Bean + MyService myService() { + return new MyService(); + } + +} diff --git a/spring-5-autowiring-beans/src/test/java/com/baeldung/autowiring/controller/CorrectControllerIntegrationTest.java b/spring-5-autowiring-beans/src/test/java/com/baeldung/autowiring/controller/CorrectControllerIntegrationTest.java new file mode 100644 index 0000000000..3807641edd --- /dev/null +++ b/spring-5-autowiring-beans/src/test/java/com/baeldung/autowiring/controller/CorrectControllerIntegrationTest.java @@ -0,0 +1,23 @@ +package com.baeldung.autowiring.controller; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit.jupiter.SpringExtension; + +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; + +@ExtendWith(SpringExtension.class) +@SpringBootTest +public class CorrectControllerIntegrationTest { + + @Autowired + CorrectController controller; + + @Test + void whenControl_ThenRunSuccessfully() { + assertDoesNotThrow(() -> controller.control()); + } + +} diff --git a/spring-5-autowiring-beans/src/test/java/com/baeldung/autowiring/controller/FlawedControllerIntegrationTest.java b/spring-5-autowiring-beans/src/test/java/com/baeldung/autowiring/controller/FlawedControllerIntegrationTest.java new file mode 100644 index 0000000000..79d446604f --- /dev/null +++ b/spring-5-autowiring-beans/src/test/java/com/baeldung/autowiring/controller/FlawedControllerIntegrationTest.java @@ -0,0 +1,28 @@ +package com.baeldung.autowiring.controller; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit.jupiter.SpringExtension; + +import static org.junit.jupiter.api.Assertions.assertThrows; + +@ExtendWith(SpringExtension.class) +@SpringBootTest +public class FlawedControllerIntegrationTest { + + private static final Logger LOGGER = LoggerFactory.getLogger(FlawedControllerIntegrationTest.class); + + @Autowired + FlawedController myController; + + @Test + void whenControl_ThenThrowNullPointerException() { + NullPointerException npe = assertThrows(NullPointerException.class, () -> myController.control()); + LOGGER.error("Got a NullPointerException", npe); + } + +}