diff --git a/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/chaindofilter/ChainDoFilterApplication.java b/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/chaindofilter/ChainDoFilterApplication.java new file mode 100644 index 000000000000..32efcba64dd8 --- /dev/null +++ b/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/chaindofilter/ChainDoFilterApplication.java @@ -0,0 +1,11 @@ +package com.baeldung.chaindofilter; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication(scanBasePackages = "com.baeldung.chaindofilter") +public class ChainDoFilterApplication { + public static void main(String[] args) { + SpringApplication.run(ChainDoFilterApplication .class, args); + } +} diff --git a/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/chaindofilter/ChainDoFilterController.java b/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/chaindofilter/ChainDoFilterController.java new file mode 100644 index 000000000000..ece6b5f168e0 --- /dev/null +++ b/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/chaindofilter/ChainDoFilterController.java @@ -0,0 +1,19 @@ +package com.baeldung.chaindofilter; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/chain/do-filter") +public class ChainDoFilterController { + + public static final String RESPONSE_MESSAGE = "Chain doFilter test!"; + + @GetMapping + public ResponseEntity chainDoFilter() { + return ResponseEntity.ok(RESPONSE_MESSAGE); + } + +} diff --git a/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/chaindofilter/FirstFilter.java b/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/chaindofilter/FirstFilter.java new file mode 100644 index 000000000000..7e8389e8ef26 --- /dev/null +++ b/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/chaindofilter/FirstFilter.java @@ -0,0 +1,27 @@ +package com.baeldung.chaindofilter; + +import java.io.IOException; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; + +import jakarta.servlet.Filter; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; + +@Order(1) +@Component +public class FirstFilter implements Filter { + + private final Logger LOG = LoggerFactory.getLogger(FirstFilter.class); + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException { + LOG.info("Processing the First Filter"); + chain.doFilter(request, response); + } +} diff --git a/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/chaindofilter/SecondFilter.java b/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/chaindofilter/SecondFilter.java new file mode 100644 index 000000000000..5140672fa6db --- /dev/null +++ b/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/chaindofilter/SecondFilter.java @@ -0,0 +1,27 @@ +package com.baeldung.chaindofilter; + +import java.io.IOException; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; + +import jakarta.servlet.Filter; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; + +@Order(2) +@Component +public class SecondFilter implements Filter { + + private final Logger LOG = LoggerFactory.getLogger(SecondFilter.class); + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { + LOG.info("Processing the Second Filter"); + chain.doFilter(request, response); + } +} diff --git a/spring-boot-modules/spring-boot-basic-customization/src/test/java/com/baeldung/chaindofilter/ChainExampleFilterUnitTest.java b/spring-boot-modules/spring-boot-basic-customization/src/test/java/com/baeldung/chaindofilter/ChainExampleFilterUnitTest.java new file mode 100644 index 000000000000..789d740e8c52 --- /dev/null +++ b/spring-boot-modules/spring-boot-basic-customization/src/test/java/com/baeldung/chaindofilter/ChainExampleFilterUnitTest.java @@ -0,0 +1,28 @@ +package com.baeldung.chaindofilter; + +import static com.baeldung.chaindofilter.ChainDoFilterController.RESPONSE_MESSAGE; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; + +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.web.servlet.MockMvc; + +@SpringBootTest +@AutoConfigureMockMvc +public class ChainExampleFilterUnitTest { + + @Autowired + private MockMvc mockMvc; + + @Test + void givenHeaderInResponse_whenFilterDoChain_thenAssertHeaderPresent() throws Exception { + mockMvc.perform(get("/chain/do-filter")) + .andExpect(status().isOk()) + .andExpect(jsonPath("$").value(RESPONSE_MESSAGE)); + } + +} diff --git a/spring-boot-modules/spring-boot-basic-customization/src/test/resources/logback-test.xml b/spring-boot-modules/spring-boot-basic-customization/src/test/resources/logback-test.xml index 0293ba50509f..ce83d1e9f538 100644 --- a/spring-boot-modules/spring-boot-basic-customization/src/test/resources/logback-test.xml +++ b/spring-boot-modules/spring-boot-basic-customization/src/test/resources/logback-test.xml @@ -1,6 +1,13 @@ - + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + \ No newline at end of file