diff --git a/cloud-foundry-uaa/README.md b/cloud-foundry-uaa/README.md
new file mode 100644
index 0000000000..b2f382cad1
--- /dev/null
+++ b/cloud-foundry-uaa/README.md
@@ -0,0 +1,3 @@
+### Revelant Articles
+
+- [A Quick Guide To Using Cloud Foundry UAA](https://www.baeldung.com/cloud-foundry-uaa)
diff --git a/core-java-8/src/test/java/com/baeldung/reduceIfelse/CalculatorUnitTest.java b/core-java-8/src/test/java/com/baeldung/reduceIfelse/CalculatorUnitTest.java
index fa351930d8..1ff34bee89 100644
--- a/core-java-8/src/test/java/com/baeldung/reduceIfelse/CalculatorUnitTest.java
+++ b/core-java-8/src/test/java/com/baeldung/reduceIfelse/CalculatorUnitTest.java
@@ -29,4 +29,11 @@ public class CalculatorUnitTest {
int result = calculator.calculate(new AddCommand(3, 7));
assertEquals(10, result);
}
+
+ @Test
+ public void whenCalculateUsingFactory_thenReturnCorrectResult() {
+ Calculator calculator = new Calculator();
+ int result = calculator.calculateUsingFactory(3, 4, "add");
+ assertEquals(7, result);
+ }
}
diff --git a/core-java-collections-set/README.md b/core-java-collections-set/README.md
new file mode 100644
index 0000000000..710484a2e1
--- /dev/null
+++ b/core-java-collections-set/README.md
@@ -0,0 +1,6 @@
+=========
+
+## Core Java Sets Cookbooks and Examples
+
+### Relevant Articles:
+- [Set Operations in Java](http://www.baeldung.com/set-operations-in-java)
diff --git a/core-java-collections-set/pom.xml b/core-java-collections-set/pom.xml
new file mode 100644
index 0000000000..d5f7937645
--- /dev/null
+++ b/core-java-collections-set/pom.xml
@@ -0,0 +1,33 @@
+
+ 4.0.0
+ core-java-collections-set
+ 0.1.0-SNAPSHOT
+ core-java-collections-set
+ jar
+
+
+ com.baeldung
+ parent-java
+ 0.0.1-SNAPSHOT
+ ../parent-java
+
+
+
+
+ com.google.guava
+ guava
+ ${guava.version}
+
+
+ org.apache.commons
+ commons-collections4
+ ${commons-collections4.version}
+
+
+
+
+ 4.3
+ 27.1-jre
+
+
diff --git a/core-java-collections-set/src/test/java/com/baeldung/set/SetOperationsUnitTest.java b/core-java-collections-set/src/test/java/com/baeldung/set/SetOperationsUnitTest.java
new file mode 100644
index 0000000000..7c25585e49
--- /dev/null
+++ b/core-java-collections-set/src/test/java/com/baeldung/set/SetOperationsUnitTest.java
@@ -0,0 +1,93 @@
+package com.baeldung.set;
+
+import static org.junit.Assert.*;
+
+import org.apache.commons.collections4.SetUtils;
+import org.junit.Test;
+
+import com.google.common.collect.Sets;
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+public class SetOperationsUnitTest {
+
+ private Set setA = setOf(1,2,3,4);
+ private Set setB = setOf(2,4,6,8);
+
+ private static Set setOf(Integer... values) {
+ return new HashSet(Arrays.asList(values));
+ }
+
+ @Test
+ public void givenTwoSets_WhenWeRetainAll_ThenWeIntersectThem() {
+ Set intersectSet = new HashSet<>(setA);
+ intersectSet.retainAll(setB);
+ assertEquals(setOf(2,4), intersectSet);
+ }
+
+ @Test
+ public void givenTwoSets_WhenWeAddAll_ThenWeUnionThem() {
+ Set unionSet = new HashSet<>(setA);
+ unionSet.addAll(setB);
+ assertEquals(setOf(1,2,3,4,6,8), unionSet);
+ }
+
+ @Test
+ public void givenTwoSets_WhenRemoveAll_ThenWeGetTheDifference() {
+ Set differenceSet = new HashSet<>(setA);
+ differenceSet.removeAll(setB);
+ assertEquals(setOf(1,3), differenceSet);
+ }
+
+ @Test
+ public void givenTwoStreams_WhenWeFilterThem_ThenWeCanGetTheIntersect() {
+ Set intersectSet = setA.stream()
+ .filter(setB::contains)
+ .collect(Collectors.toSet());
+ assertEquals(setOf(2,4), intersectSet);
+ }
+
+ @Test
+ public void givenTwoStreams_WhenWeConcatThem_ThenWeGetTheUnion() {
+ Set unionSet = Stream.concat(setA.stream(), setB.stream())
+ .collect(Collectors.toSet());
+ assertEquals(setOf(1,2,3,4,6,8), unionSet);
+ }
+
+ @Test
+ public void givenTwoStreams_WhenWeFilterThem_ThenWeCanGetTheDifference() {
+ Set differenceSet = setA.stream()
+ .filter(val -> !setB.contains(val))
+ .collect(Collectors.toSet());
+ assertEquals(setOf(1,3), differenceSet);
+ }
+
+ @Test
+ public void givenTwoSets_WhenWeUseApacheCommonsIntersect_ThenWeGetTheIntersect() {
+ Set intersectSet = SetUtils.intersection(setA, setB);
+ assertEquals(setOf(2,4), intersectSet);
+ }
+
+ @Test
+ public void givenTwoSets_WhenWeUseApacheCommonsUnion_ThenWeGetTheUnion() {
+ Set unionSet = SetUtils.union(setA, setB);
+ assertEquals(setOf(1,2,3,4,6,8), unionSet);
+ }
+
+
+ @Test
+ public void givenTwoSets_WhenWeUseGuavaIntersect_ThenWeGetTheIntersect() {
+ Set intersectSet = Sets.intersection(setA, setB);
+ assertEquals(setOf(2,4), intersectSet);
+ }
+
+ @Test
+ public void givenTwoSets_WhenWeUseGuavaUnion_ThenWeGetTheUnion() {
+ Set unionSet = Sets.union(setA, setB);
+ assertEquals(setOf(1,2,3,4,6,8), unionSet);
+ }
+}
diff --git a/core-java-lang-oop-2/README.md b/core-java-lang-oop-2/README.md
index e309810ba2..af0aed5af3 100644
--- a/core-java-lang-oop-2/README.md
+++ b/core-java-lang-oop-2/README.md
@@ -3,3 +3,4 @@
## Core Java Lang OOP 2 Cookbooks and Examples
### Relevant Articles:
+- [Generic Constructors in Java](https://www.baeldung.com/java-generic-constructors)
diff --git a/core-java-networking/src/main/java/com/baeldung/networking/cookies/ProxyAcceptCookiePolicy.java b/core-java-networking/src/main/java/com/baeldung/networking/cookies/ProxyAcceptCookiePolicy.java
index 0b5f6d7714..9fbbee8501 100644
--- a/core-java-networking/src/main/java/com/baeldung/networking/cookies/ProxyAcceptCookiePolicy.java
+++ b/core-java-networking/src/main/java/com/baeldung/networking/cookies/ProxyAcceptCookiePolicy.java
@@ -17,8 +17,8 @@ public class ProxyAcceptCookiePolicy implements CookiePolicy {
host = uri.getHost();
}
- if (!HttpCookie.domainMatches(acceptedProxy, host)) {
- return false;
+ if (HttpCookie.domainMatches(acceptedProxy, host)) {
+ return true;
}
return CookiePolicy.ACCEPT_ORIGINAL_SERVER.shouldAccept(uri, cookie);
diff --git a/core-kotlin-io/pom.xml b/core-kotlin-io/pom.xml
index 2e21079d7f..a0b688a223 100644
--- a/core-kotlin-io/pom.xml
+++ b/core-kotlin-io/pom.xml
@@ -20,9 +20,21 @@
${kotlin.version}
- org.junit.platform
- junit-platform-runner
- ${junit.platform.version}
+ org.junit.jupiter
+ junit-jupiter
+ ${junit.jupiter.version}
+ test
+
+
+ org.mockito
+ mockito-core
+ ${mockito.version}
+ test
+
+
+ net.bytebuddy
+ byte-buddy
+ ${byte-buddy.version}
test
@@ -37,6 +49,12 @@
${kotlin.version}
test
+
+ org.jetbrains.kotlin
+ kotlin-test-junit5
+ ${kotlin.version}
+ test
+
@@ -69,10 +87,11 @@
- 1.2.71
- 1.1.1
- 5.2.0
+ 1.3.30
+ 5.4.2
+ 2.27.0
+ 1.9.12
3.10.0
-
\ No newline at end of file
+
diff --git a/core-kotlin-2/src/test/kotlin/com/baeldung/console/ConsoleIOUnitTest.kt b/core-kotlin-io/src/test/kotlin/com/baeldung/console/ConsoleIOUnitTest.kt
similarity index 100%
rename from core-kotlin-2/src/test/kotlin/com/baeldung/console/ConsoleIOUnitTest.kt
rename to core-kotlin-io/src/test/kotlin/com/baeldung/console/ConsoleIOUnitTest.kt
diff --git a/core-kotlin-2/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker b/core-kotlin-io/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker
similarity index 100%
rename from core-kotlin-2/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker
rename to core-kotlin-io/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker
diff --git a/fastUtil/pom.xml b/fastUtil/pom.xml
new file mode 100644
index 0000000000..fcd9020747
--- /dev/null
+++ b/fastUtil/pom.xml
@@ -0,0 +1,44 @@
+
+
+ 4.0.0
+
+ com.baeldung
+ fastUtil
+ 1.0-SNAPSHOT
+
+
+
+
+ it.unimi.dsi
+ fastutil
+ 8.2.2
+
+
+
+ junit
+ junit
+ 4.12
+ test
+
+
+
+ org.openjdk.jmh
+ jmh-core
+ 1.19
+ test
+
+
+ org.openjdk.jmh
+ jmh-generator-annprocess
+ 1.19
+ test
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/fastUtil/src/test/java/com/baeldung/BigArraysUnitTest.java b/fastUtil/src/test/java/com/baeldung/BigArraysUnitTest.java
new file mode 100644
index 0000000000..a794d1a2f6
--- /dev/null
+++ b/fastUtil/src/test/java/com/baeldung/BigArraysUnitTest.java
@@ -0,0 +1,23 @@
+package com.baeldung;
+
+import it.unimi.dsi.fastutil.ints.IntBigArrays;
+import org.junit.Test;
+
+import static junit.framework.Assert.assertEquals;
+
+public class BigArraysUnitTest {
+
+ @Test
+ public void givenValidAray_whenWrapped_checkAccessFromIntBigArraysMethodsCorrect() {
+ int[] oneDArray = new int[] { 2, 1, 5, 2, 1, 7 };
+ int[][] twoDArray = IntBigArrays.wrap(oneDArray.clone());
+
+ int firstIndex = IntBigArrays.get(twoDArray, 0);
+ int lastIndex = IntBigArrays.get(twoDArray, IntBigArrays.length(twoDArray)-1);
+
+ assertEquals(2, firstIndex);
+ assertEquals(7, lastIndex);
+
+ }
+
+}
diff --git a/fastUtil/src/test/java/com/baeldung/FastUtilTypeSpecificBenchmarkUnitTest.java b/fastUtil/src/test/java/com/baeldung/FastUtilTypeSpecificBenchmarkUnitTest.java
new file mode 100644
index 0000000000..2c77989fe5
--- /dev/null
+++ b/fastUtil/src/test/java/com/baeldung/FastUtilTypeSpecificBenchmarkUnitTest.java
@@ -0,0 +1,58 @@
+package com.baeldung;
+
+import it.unimi.dsi.fastutil.ints.IntOpenHashSet;
+import it.unimi.dsi.fastutil.ints.IntSet;
+import org.openjdk.jmh.annotations.*;
+import org.openjdk.jmh.infra.Blackhole;
+import org.openjdk.jmh.runner.Runner;
+import org.openjdk.jmh.runner.RunnerException;
+import org.openjdk.jmh.runner.options.Options;
+import org.openjdk.jmh.runner.options.OptionsBuilder;
+
+import java.util.*;
+import java.util.concurrent.TimeUnit;
+
+@BenchmarkMode(Mode.AverageTime)
+@OutputTimeUnit(TimeUnit.MICROSECONDS)
+@State(Scope.Benchmark)
+public class FastUtilTypeSpecificBenchmarkUnitTest {
+
+ @Param({"100", "1000", "10000", "100000"})
+ public int setSize;
+
+ @Benchmark
+ public IntSet givenFastUtilsIntSetWithInitialSizeSet_whenPopulated_checkTimeTaken() {
+ IntSet intSet = new IntOpenHashSet(setSize);
+ for(int i = 0; i < setSize; i++){
+ intSet.add(i);
+ }
+ return intSet;
+ }
+
+
+ @Benchmark
+ public Set givenCollectionsHashSetWithInitialSizeSet_whenPopulated_checkTimeTaken() {
+ Set intSet = new HashSet(setSize);
+ for(int i = 0; i < setSize; i++){
+ intSet.add(i);
+ }
+ return intSet;
+ }
+
+ public static void main(String... args) throws RunnerException {
+ Options opts = new OptionsBuilder()
+ .include(".*")
+ .warmupIterations(1)
+ .measurementIterations(2)
+ .jvmArgs("-Xms2g", "-Xmx2g")
+ .shouldDoGC(true)
+ .forks(1)
+ .build();
+
+ new Runner(opts).run();
+ }
+
+
+
+
+}
diff --git a/fastUtil/src/test/java/com/baeldung/FastUtilTypeSpecificUnitTest.java b/fastUtil/src/test/java/com/baeldung/FastUtilTypeSpecificUnitTest.java
new file mode 100644
index 0000000000..61295cc6f1
--- /dev/null
+++ b/fastUtil/src/test/java/com/baeldung/FastUtilTypeSpecificUnitTest.java
@@ -0,0 +1,20 @@
+package com.baeldung;
+
+import it.unimi.dsi.fastutil.doubles.Double2DoubleMap;
+import it.unimi.dsi.fastutil.doubles.Double2DoubleOpenHashMap;
+import org.junit.Test;
+
+import static junit.framework.Assert.assertEquals;
+
+
+public class FastUtilTypeSpecificUnitTest {
+
+ @Test
+ public void givenValidDouble2DoubleMap_whenContentsQueried_checkCorrect(){
+ Double2DoubleMap d2dMap = new Double2DoubleOpenHashMap();
+ d2dMap.put(2.0, 5.5);
+ d2dMap.put(3.0, 6.6);
+ assertEquals(5.5, d2dMap.get(2.0));
+ }
+
+}
diff --git a/httpclient-simple/README.md b/httpclient-simple/README.md
index aa66c11b1e..96d9e9ec0e 100644
--- a/httpclient-simple/README.md
+++ b/httpclient-simple/README.md
@@ -7,4 +7,6 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring
### Relevant Articles:
-- [HttpClient 4 – Get the Status Code](http://www.baeldung.com/httpclient-status-code)
\ No newline at end of file
+- [HttpClient 4 – Get the Status Code](http://www.baeldung.com/httpclient-status-code)
+- [HttpClient with SSL](http://www.baeldung.com/httpclient-ssl)
+- [HttpClient Basic Authentication](http://www.baeldung.com/httpclient-4-basic-authentication)
diff --git a/httpclient-simple/pom.xml b/httpclient-simple/pom.xml
index 1ad68d2804..f3d00251d7 100644
--- a/httpclient-simple/pom.xml
+++ b/httpclient-simple/pom.xml
@@ -5,15 +5,111 @@
httpclient-simple
0.1-SNAPSHOT
httpclient-simple
+ war
com.baeldung
- parent-java
+ parent-spring-5
0.0.1-SNAPSHOT
- ../parent-java
+ ../parent-spring-5
+
+
+
+
+ org.springframework.security
+ spring-security-web
+ ${spring.version}
+
+
+ org.springframework.security
+ spring-security-config
+ ${spring.version}
+
+
+
+
+
+ org.springframework
+ spring-core
+ ${spring.version}
+
+
+ commons-logging
+ commons-logging
+
+
+
+
+ org.springframework
+ spring-context
+ ${spring.version}
+
+
+ org.springframework
+ spring-jdbc
+ ${spring.version}
+
+
+ org.springframework
+ spring-beans
+ ${spring.version}
+
+
+ org.springframework
+ spring-aop
+ ${spring.version}
+
+
+ org.springframework
+ spring-tx
+ ${spring.version}
+
+
+ org.springframework
+ spring-expression
+ ${spring.version}
+
+
+
+ org.springframework
+ spring-web
+ ${spring.version}
+
+
+ org.springframework
+ spring-webmvc
+ ${spring.version}
+
+
+
+ org.springframework
+ spring-oxm
+ ${spring.version}
+
+
+
+
+
+ com.fasterxml.jackson.core
+ jackson-databind
+ ${jackson.version}
+
+
+
+ org.apache.httpcomponents
+ httpcore
+ ${httpcore.version}
+
+
+ commons-logging
+ commons-logging
+
+
+
+
org.apache.commons
@@ -70,16 +166,77 @@
${wiremock.version}
test
+
+
+
+
+ javax.servlet
+ javax.servlet-api
+ ${javax.servlet.version}
+ provided
+
+
+
+ javax.servlet
+ jstl
+ ${jstl.version}
+ runtime
+
+
+
+
+
+ com.google.guava
+ guava
+ ${guava.version}
+
+
+
+
+
+ org.springframework
+ spring-test
+ ${spring.version}
+ test
+
- httpclient
+ httpclient-simple
src/main/resources
true
+
+
+
+ org.apache.maven.plugins
+ maven-war-plugin
+ ${maven-war-plugin.version}
+
+
+ org.codehaus.cargo
+ cargo-maven2-plugin
+ ${cargo-maven2-plugin.version}
+
+ true
+
+ jetty8x
+ embedded
+
+
+
+
+
+
+ 8082
+
+
+
+
+
@@ -87,6 +244,27 @@
live
+
+ org.codehaus.cargo
+ cargo-maven2-plugin
+
+
+ start-server
+ pre-integration-test
+
+ start
+
+
+
+ stop-server
+ post-integration-test
+
+ stop
+
+
+
+
+
org.apache.maven.plugins
maven-surefire-plugin
@@ -98,26 +276,28 @@
- **/*ManualTest.java
+ none
**/*LiveTest.java
+
+ cargo
+
-
-
- json
-
-
+
+
+ 1.2
+ 3.1.0
19.0
3.5
@@ -125,8 +305,10 @@
4.1.4
2.5.1
+ 4.4.11
4.5.8
+ 2.6
1.6.1
diff --git a/httpclient-simple/src/main/java/org/baeldung/basic/MyBasicAuthenticationEntryPoint.java b/httpclient-simple/src/main/java/org/baeldung/basic/MyBasicAuthenticationEntryPoint.java
new file mode 100644
index 0000000000..6e580e7a22
--- /dev/null
+++ b/httpclient-simple/src/main/java/org/baeldung/basic/MyBasicAuthenticationEntryPoint.java
@@ -0,0 +1,30 @@
+package org.baeldung.basic;
+
+import org.springframework.security.core.AuthenticationException;
+import org.springframework.security.web.authentication.www.BasicAuthenticationEntryPoint;
+import org.springframework.stereotype.Component;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.PrintWriter;
+
+@Component
+public class MyBasicAuthenticationEntryPoint extends BasicAuthenticationEntryPoint {
+
+ @Override
+ public void commence(final HttpServletRequest request, final HttpServletResponse response, final AuthenticationException authException) throws IOException, ServletException {
+ response.addHeader("WWW-Authenticate", "Basic realm=\"" + getRealmName() + "\"");
+ response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
+ final PrintWriter writer = response.getWriter();
+ writer.println("HTTP Status " + HttpServletResponse.SC_UNAUTHORIZED + " - " + authException.getMessage());
+ }
+
+ @Override
+ public void afterPropertiesSet() throws Exception {
+ setRealmName("Baeldung");
+ super.afterPropertiesSet();
+ }
+
+}
diff --git a/httpclient-simple/src/main/java/org/baeldung/client/HttpComponentsClientHttpRequestFactoryBasicAuth.java b/httpclient-simple/src/main/java/org/baeldung/client/HttpComponentsClientHttpRequestFactoryBasicAuth.java
new file mode 100644
index 0000000000..a2f51d343b
--- /dev/null
+++ b/httpclient-simple/src/main/java/org/baeldung/client/HttpComponentsClientHttpRequestFactoryBasicAuth.java
@@ -0,0 +1,39 @@
+package org.baeldung.client;
+
+import java.net.URI;
+
+import org.apache.http.HttpHost;
+import org.apache.http.client.AuthCache;
+import org.apache.http.client.protocol.HttpClientContext;
+import org.apache.http.impl.auth.BasicScheme;
+import org.apache.http.impl.client.BasicAuthCache;
+import org.apache.http.protocol.BasicHttpContext;
+import org.apache.http.protocol.HttpContext;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
+
+public class HttpComponentsClientHttpRequestFactoryBasicAuth extends HttpComponentsClientHttpRequestFactory {
+
+ HttpHost host;
+
+ public HttpComponentsClientHttpRequestFactoryBasicAuth(HttpHost host) {
+ super();
+ this.host = host;
+ }
+
+ protected HttpContext createHttpContext(HttpMethod httpMethod, URI uri) {
+ return createHttpContext();
+ }
+
+ private HttpContext createHttpContext() {
+
+ AuthCache authCache = new BasicAuthCache();
+
+ BasicScheme basicAuth = new BasicScheme();
+ authCache.put(host, basicAuth);
+
+ BasicHttpContext localcontext = new BasicHttpContext();
+ localcontext.setAttribute(HttpClientContext.AUTH_CACHE, authCache);
+ return localcontext;
+ }
+}
\ No newline at end of file
diff --git a/httpclient-simple/src/main/java/org/baeldung/client/RestTemplateFactory.java b/httpclient-simple/src/main/java/org/baeldung/client/RestTemplateFactory.java
new file mode 100644
index 0000000000..3ed0bc82b7
--- /dev/null
+++ b/httpclient-simple/src/main/java/org/baeldung/client/RestTemplateFactory.java
@@ -0,0 +1,44 @@
+package org.baeldung.client;
+
+import org.apache.http.HttpHost;
+import org.springframework.beans.factory.FactoryBean;
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.http.client.ClientHttpRequestFactory;
+import org.springframework.http.client.support.BasicAuthenticationInterceptor;
+import org.springframework.stereotype.Component;
+import org.springframework.web.client.RestTemplate;
+
+@Component
+public class RestTemplateFactory implements FactoryBean, InitializingBean {
+ private RestTemplate restTemplate;
+
+ public RestTemplateFactory() {
+ super();
+ }
+
+ // API
+
+ @Override
+ public RestTemplate getObject() {
+ return restTemplate;
+ }
+
+ @Override
+ public Class getObjectType() {
+ return RestTemplate.class;
+ }
+
+ @Override
+ public boolean isSingleton() {
+ return true;
+ }
+
+ @Override
+ public void afterPropertiesSet() {
+ HttpHost host = new HttpHost("localhost", 8082, "http");
+ final ClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactoryBasicAuth(host);
+ restTemplate = new RestTemplate(requestFactory);
+ restTemplate.getInterceptors().add(new BasicAuthenticationInterceptor("user1", "user1Pass"));
+ }
+
+}
\ No newline at end of file
diff --git a/httpclient-simple/src/main/java/org/baeldung/client/spring/ClientConfig.java b/httpclient-simple/src/main/java/org/baeldung/client/spring/ClientConfig.java
new file mode 100644
index 0000000000..73e602855c
--- /dev/null
+++ b/httpclient-simple/src/main/java/org/baeldung/client/spring/ClientConfig.java
@@ -0,0 +1,16 @@
+package org.baeldung.client.spring;
+
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+@ComponentScan("org.baeldung.client")
+public class ClientConfig {
+
+ public ClientConfig() {
+ super();
+ }
+
+ // beans
+
+}
\ No newline at end of file
diff --git a/httpclient-simple/src/main/java/org/baeldung/filter/CustomFilter.java b/httpclient-simple/src/main/java/org/baeldung/filter/CustomFilter.java
new file mode 100644
index 0000000000..01e5b0b59d
--- /dev/null
+++ b/httpclient-simple/src/main/java/org/baeldung/filter/CustomFilter.java
@@ -0,0 +1,18 @@
+package org.baeldung.filter;
+
+import org.springframework.web.filter.GenericFilterBean;
+
+import javax.servlet.FilterChain;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import java.io.IOException;
+
+public class CustomFilter extends GenericFilterBean {
+
+ @Override
+ public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
+ chain.doFilter(request, response);
+ }
+
+}
diff --git a/httpclient-simple/src/main/java/org/baeldung/filter/CustomWebSecurityConfigurerAdapter.java b/httpclient-simple/src/main/java/org/baeldung/filter/CustomWebSecurityConfigurerAdapter.java
new file mode 100644
index 0000000000..7ca2a80c52
--- /dev/null
+++ b/httpclient-simple/src/main/java/org/baeldung/filter/CustomWebSecurityConfigurerAdapter.java
@@ -0,0 +1,49 @@
+package org.baeldung.filter;
+
+import org.baeldung.security.RestAuthenticationEntryPoint;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
+import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
+import org.springframework.security.crypto.password.PasswordEncoder;
+import org.springframework.security.web.authentication.www.BasicAuthenticationFilter;
+
+@Configuration
+@EnableWebSecurity
+public class CustomWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter {
+
+ @Autowired private RestAuthenticationEntryPoint authenticationEntryPoint;
+
+ @Autowired
+ public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
+ auth
+ .inMemoryAuthentication()
+ .withUser("user1")
+ .password(passwordEncoder().encode("user1Pass"))
+ .authorities("ROLE_USER");
+ }
+
+ @Override
+ protected void configure(HttpSecurity http) throws Exception {
+ http
+ .authorizeRequests()
+ .antMatchers("/securityNone")
+ .permitAll()
+ .anyRequest()
+ .authenticated()
+ .and()
+ .httpBasic()
+ .authenticationEntryPoint(authenticationEntryPoint);
+
+ http.addFilterAfter(new CustomFilter(), BasicAuthenticationFilter.class);
+ }
+
+ @Bean
+ public PasswordEncoder passwordEncoder() {
+ return new BCryptPasswordEncoder();
+ }
+}
diff --git a/httpclient-simple/src/main/java/org/baeldung/security/MySavedRequestAwareAuthenticationSuccessHandler.java b/httpclient-simple/src/main/java/org/baeldung/security/MySavedRequestAwareAuthenticationSuccessHandler.java
new file mode 100644
index 0000000000..698052fa2b
--- /dev/null
+++ b/httpclient-simple/src/main/java/org/baeldung/security/MySavedRequestAwareAuthenticationSuccessHandler.java
@@ -0,0 +1,48 @@
+package org.baeldung.security;
+
+import java.io.IOException;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.springframework.security.core.Authentication;
+import org.springframework.security.web.authentication.SimpleUrlAuthenticationSuccessHandler;
+import org.springframework.security.web.savedrequest.HttpSessionRequestCache;
+import org.springframework.security.web.savedrequest.RequestCache;
+import org.springframework.security.web.savedrequest.SavedRequest;
+import org.springframework.util.StringUtils;
+
+public class MySavedRequestAwareAuthenticationSuccessHandler extends SimpleUrlAuthenticationSuccessHandler {
+
+ private RequestCache requestCache = new HttpSessionRequestCache();
+
+ @Override
+ public void onAuthenticationSuccess(final HttpServletRequest request, final HttpServletResponse response, final Authentication authentication) throws ServletException, IOException {
+ final SavedRequest savedRequest = requestCache.getRequest(request, response);
+
+ if (savedRequest == null) {
+ super.onAuthenticationSuccess(request, response, authentication);
+
+ return;
+ }
+ final String targetUrlParameter = getTargetUrlParameter();
+ if (isAlwaysUseDefaultTargetUrl() || (targetUrlParameter != null && StringUtils.hasText(request.getParameter(targetUrlParameter)))) {
+ requestCache.removeRequest(request, response);
+ super.onAuthenticationSuccess(request, response, authentication);
+
+ return;
+ }
+
+ clearAuthenticationAttributes(request);
+
+ // Use the DefaultSavedRequest URL
+ // final String targetUrl = savedRequest.getRedirectUrl();
+ // logger.debug("Redirecting to DefaultSavedRequest Url: " + targetUrl);
+ // getRedirectStrategy().sendRedirect(request, response, targetUrl);
+ }
+
+ public void setRequestCache(final RequestCache requestCache) {
+ this.requestCache = requestCache;
+ }
+}
diff --git a/httpclient-simple/src/main/java/org/baeldung/security/RestAuthenticationEntryPoint.java b/httpclient-simple/src/main/java/org/baeldung/security/RestAuthenticationEntryPoint.java
new file mode 100644
index 0000000000..77aa32ff97
--- /dev/null
+++ b/httpclient-simple/src/main/java/org/baeldung/security/RestAuthenticationEntryPoint.java
@@ -0,0 +1,23 @@
+package org.baeldung.security;
+
+import java.io.IOException;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.springframework.security.core.AuthenticationException;
+import org.springframework.security.web.AuthenticationEntryPoint;
+import org.springframework.stereotype.Component;
+
+/**
+ * The Entry Point will not redirect to any sort of Login - it will return the 401
+ */
+@Component
+public final class RestAuthenticationEntryPoint implements AuthenticationEntryPoint {
+
+ @Override
+ public void commence(final HttpServletRequest request, final HttpServletResponse response, final AuthenticationException authException) throws IOException {
+ response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized");
+ }
+
+}
\ No newline at end of file
diff --git a/httpclient-simple/src/main/java/org/baeldung/spring/SecSecurityConfig.java b/httpclient-simple/src/main/java/org/baeldung/spring/SecSecurityConfig.java
new file mode 100644
index 0000000000..4ce80dab9f
--- /dev/null
+++ b/httpclient-simple/src/main/java/org/baeldung/spring/SecSecurityConfig.java
@@ -0,0 +1,16 @@
+package org.baeldung.spring;
+
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.ImportResource;
+
+@Configuration
+@ImportResource({ "classpath:webSecurityConfig.xml" })
+@ComponentScan("org.baeldung.security")
+public class SecSecurityConfig {
+
+ public SecSecurityConfig() {
+ super();
+ }
+
+}
diff --git a/httpclient-simple/src/main/java/org/baeldung/spring/WebConfig.java b/httpclient-simple/src/main/java/org/baeldung/spring/WebConfig.java
new file mode 100644
index 0000000000..5876e1307b
--- /dev/null
+++ b/httpclient-simple/src/main/java/org/baeldung/spring/WebConfig.java
@@ -0,0 +1,30 @@
+package org.baeldung.spring;
+
+import java.util.List;
+
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.http.converter.HttpMessageConverter;
+import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
+import org.springframework.web.servlet.config.annotation.EnableWebMvc;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+@Configuration
+@EnableWebMvc
+@ComponentScan("org.baeldung.web")
+public class WebConfig implements WebMvcConfigurer {
+
+ public WebConfig() {
+ super();
+ }
+
+ // beans
+
+ @Override
+ public void configureMessageConverters(final List> converters) {
+ converters.add(new MappingJackson2HttpMessageConverter());
+ }
+
+ //
+
+}
\ No newline at end of file
diff --git a/httpclient-simple/src/main/java/org/baeldung/web/controller/BarController.java b/httpclient-simple/src/main/java/org/baeldung/web/controller/BarController.java
new file mode 100644
index 0000000000..2bc314baa2
--- /dev/null
+++ b/httpclient-simple/src/main/java/org/baeldung/web/controller/BarController.java
@@ -0,0 +1,31 @@
+package org.baeldung.web.controller;
+
+import org.baeldung.web.dto.Bar;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.ApplicationEventPublisher;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+@Controller
+@RequestMapping(value = "/bars")
+public class BarController {
+
+ @Autowired
+ private ApplicationEventPublisher eventPublisher;
+
+ public BarController() {
+ super();
+ }
+
+ // API
+
+ @RequestMapping(value = "/{id}", method = RequestMethod.GET)
+ @ResponseBody
+ public Bar findOne(@PathVariable("id") final Long id) {
+ return new Bar();
+ }
+
+}
diff --git a/httpclient-simple/src/main/java/org/baeldung/web/controller/FooController.java b/httpclient-simple/src/main/java/org/baeldung/web/controller/FooController.java
new file mode 100644
index 0000000000..b50edb2dcf
--- /dev/null
+++ b/httpclient-simple/src/main/java/org/baeldung/web/controller/FooController.java
@@ -0,0 +1,33 @@
+package org.baeldung.web.controller;
+
+import org.baeldung.web.dto.Foo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.ApplicationEventPublisher;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+@Controller
+@RequestMapping(value = "/foos")
+public class FooController {
+
+ @Autowired
+ private ApplicationEventPublisher eventPublisher;
+
+ public FooController() {
+ super();
+ }
+
+ // API
+
+ @RequestMapping(value = "/{id}", method = RequestMethod.GET)
+ @ResponseBody
+ @PreAuthorize("hasRole('ROLE_USER')")
+ public Foo findOne(@PathVariable("id") final Long id) {
+ return new Foo();
+ }
+
+}
diff --git a/httpclient-simple/src/main/java/org/baeldung/web/dto/Bar.java b/httpclient-simple/src/main/java/org/baeldung/web/dto/Bar.java
new file mode 100644
index 0000000000..d33e39a823
--- /dev/null
+++ b/httpclient-simple/src/main/java/org/baeldung/web/dto/Bar.java
@@ -0,0 +1,14 @@
+package org.baeldung.web.dto;
+
+import java.io.Serializable;
+
+import javax.xml.bind.annotation.XmlRootElement;
+
+@XmlRootElement
+public class Bar implements Serializable {
+
+ public Bar() {
+ super();
+ }
+
+}
diff --git a/httpclient-simple/src/main/java/org/baeldung/web/dto/Foo.java b/httpclient-simple/src/main/java/org/baeldung/web/dto/Foo.java
new file mode 100644
index 0000000000..09c1dac933
--- /dev/null
+++ b/httpclient-simple/src/main/java/org/baeldung/web/dto/Foo.java
@@ -0,0 +1,14 @@
+package org.baeldung.web.dto;
+
+import java.io.Serializable;
+
+import javax.xml.bind.annotation.XmlRootElement;
+
+@XmlRootElement
+public class Foo implements Serializable {
+
+ public Foo() {
+ super();
+ }
+
+}
diff --git a/httpclient-simple/src/main/resources/webSecurityConfig.xml b/httpclient-simple/src/main/resources/webSecurityConfig.xml
new file mode 100644
index 0000000000..a93dc841b6
--- /dev/null
+++ b/httpclient-simple/src/main/resources/webSecurityConfig.xml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/httpclient-simple/src/main/webapp/WEB-INF/api-servlet.xml b/httpclient-simple/src/main/webapp/WEB-INF/api-servlet.xml
new file mode 100644
index 0000000000..1dbff70b83
--- /dev/null
+++ b/httpclient-simple/src/main/webapp/WEB-INF/api-servlet.xml
@@ -0,0 +1,6 @@
+
+
+
+
\ No newline at end of file
diff --git a/httpclient-simple/src/main/webapp/WEB-INF/web.xml b/httpclient-simple/src/main/webapp/WEB-INF/web.xml
new file mode 100644
index 0000000000..83b4aeb0a7
--- /dev/null
+++ b/httpclient-simple/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,43 @@
+
+
+
+ Spring Security Custom Application
+
+
+
+ contextClass
+ org.springframework.web.context.support.AnnotationConfigWebApplicationContext
+
+
+ contextConfigLocation
+ org.baeldung.spring
+
+
+
+ org.springframework.web.context.ContextLoaderListener
+
+
+
+
+ api
+ org.springframework.web.servlet.DispatcherServlet
+ 1
+
+
+ api
+ /api/*
+
+
+
+
+ springSecurityFilterChain
+ org.springframework.web.filter.DelegatingFilterProxy
+
+
+ springSecurityFilterChain
+ /*
+
+
+
\ No newline at end of file
diff --git a/spring-security-rest-basic-auth/src/test/java/org/baeldung/client/ClientLiveTest.java b/httpclient-simple/src/test/java/org/baeldung/client/ClientLiveTest.java
similarity index 88%
rename from spring-security-rest-basic-auth/src/test/java/org/baeldung/client/ClientLiveTest.java
rename to httpclient-simple/src/test/java/org/baeldung/client/ClientLiveTest.java
index 2a668f827a..286ee3c900 100644
--- a/spring-security-rest-basic-auth/src/test/java/org/baeldung/client/ClientLiveTest.java
+++ b/httpclient-simple/src/test/java/org/baeldung/client/ClientLiveTest.java
@@ -33,13 +33,13 @@ public class ClientLiveTest {
@Test
public final void whenSecuredRestApiIsConsumed_then200OK() {
- final ResponseEntity responseEntity = secureRestTemplate.exchange("http://localhost:8082/spring-security-rest-basic-auth/api/foos/1", HttpMethod.GET, null, Foo.class);
+ final ResponseEntity responseEntity = secureRestTemplate.exchange("http://localhost:8082/httpclient-simple/api/foos/1", HttpMethod.GET, null, Foo.class);
assertThat(responseEntity.getStatusCode().value(), is(200));
}
@Test(expected = ResourceAccessException.class)
public final void whenHttpsUrlIsConsumed_thenException() {
- final String urlOverHttps = "https://localhost:8443/spring-security-rest-basic-auth/api/bars/1";
+ final String urlOverHttps = "https://localhost:8443/httpclient-simple/api/bars/1";
final ResponseEntity response = new RestTemplate().exchange(urlOverHttps, HttpMethod.GET, null, String.class);
assertThat(response.getStatusCode().value(), equalTo(200));
}
diff --git a/spring-security-rest-basic-auth/src/test/java/org/baeldung/client/RestClientLiveManualTest.java b/httpclient-simple/src/test/java/org/baeldung/client/RestClientLiveManualTest.java
similarity index 63%
rename from spring-security-rest-basic-auth/src/test/java/org/baeldung/client/RestClientLiveManualTest.java
rename to httpclient-simple/src/test/java/org/baeldung/client/RestClientLiveManualTest.java
index 104129b663..53f259c21d 100644
--- a/spring-security-rest-basic-auth/src/test/java/org/baeldung/client/RestClientLiveManualTest.java
+++ b/httpclient-simple/src/test/java/org/baeldung/client/RestClientLiveManualTest.java
@@ -8,19 +8,24 @@ import java.io.IOException;
import java.security.GeneralSecurityException;
import java.security.cert.X509Certificate;
-import javax.net.ssl.SSLException;
-import javax.net.ssl.SSLPeerUnverifiedException;
+import javax.net.ssl.SSLContext;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpGet;
+import org.apache.http.config.Registry;
+import org.apache.http.config.RegistryBuilder;
import org.apache.http.conn.scheme.Scheme;
+import org.apache.http.conn.socket.ConnectionSocketFactory;
+import org.apache.http.conn.socket.PlainConnectionSocketFactory;
import org.apache.http.conn.ssl.NoopHostnameVerifier;
+import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.conn.ssl.TrustStrategy;
import org.apache.http.impl.client.CloseableHttpClient;
-import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.client.HttpClients;
+import org.apache.http.impl.conn.BasicHttpClientConnectionManager;
+import org.apache.http.ssl.SSLContexts;
import org.junit.Ignore;
import org.junit.Test;
import org.springframework.http.HttpMethod;
@@ -34,14 +39,14 @@ import org.springframework.web.client.RestTemplate;
* */
public class RestClientLiveManualTest {
- final String urlOverHttps = "http://localhost:8082/spring-security-rest-basic-auth/api/bars/1";
+ final String urlOverHttps = "http://localhost:8082/httpclient-simple/api/bars/1";
// tests
// old httpClient will throw UnsupportedOperationException
@Ignore
@Test
- public final void givenAcceptingAllCertificates_whenHttpsUrlIsConsumed_thenException() throws GeneralSecurityException {
+ public final void givenAcceptingAllCertificates_whenHttpsUrlIsConsumed_thenException_1() throws GeneralSecurityException {
final HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();
final CloseableHttpClient httpClient = (CloseableHttpClient) requestFactory.getHttpClient();
@@ -57,6 +62,29 @@ public class RestClientLiveManualTest {
final ResponseEntity response = new RestTemplate(requestFactory).exchange(urlOverHttps, HttpMethod.GET, null, String.class);
assertThat(response.getStatusCode().value(), equalTo(200));
}
+
+ // new httpClient : 4.4 and above
+ @Test
+ public final void givenAcceptingAllCertificates_whenHttpsUrlIsConsumed_thenException_2() throws GeneralSecurityException {
+
+ final TrustStrategy acceptingTrustStrategy = (cert, authType) -> true;
+ final SSLContext sslContext = SSLContexts.custom().loadTrustMaterial(null, acceptingTrustStrategy).build();
+ final SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext, NoopHostnameVerifier.INSTANCE);
+ final Registry socketFactoryRegistry = RegistryBuilder. create()
+ .register("https", sslsf)
+ .register("http", new PlainConnectionSocketFactory())
+ .build();
+
+ final BasicHttpClientConnectionManager connectionManager = new BasicHttpClientConnectionManager(socketFactoryRegistry);
+ final CloseableHttpClient httpClient = HttpClients.custom()
+ .setSSLSocketFactory(sslsf)
+ .setConnectionManager(connectionManager)
+ .build();
+
+ final HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient);
+ final ResponseEntity response = new RestTemplate(requestFactory).exchange(urlOverHttps, HttpMethod.GET, null, String.class);
+ assertThat(response.getStatusCode().value(), equalTo(200));
+ }
@Test
public final void givenAcceptingAllCertificatesUsing4_4_whenHttpsUrlIsConsumed_thenCorrect() throws ClientProtocolException, IOException {
diff --git a/httpclient/src/test/java/org/baeldung/httpclient/HttpsClientSslLiveTest.java b/httpclient-simple/src/test/java/org/baeldung/httpclient/HttpsClientSslLiveTest.java
similarity index 100%
rename from httpclient/src/test/java/org/baeldung/httpclient/HttpsClientSslLiveTest.java
rename to httpclient-simple/src/test/java/org/baeldung/httpclient/HttpsClientSslLiveTest.java
diff --git a/httpclient/src/test/java/org/baeldung/httpclient/sec/HttpClientAuthLiveTest.java b/httpclient-simple/src/test/java/org/baeldung/httpclient/sec/HttpClientAuthLiveTest.java
similarity index 96%
rename from httpclient/src/test/java/org/baeldung/httpclient/sec/HttpClientAuthLiveTest.java
rename to httpclient-simple/src/test/java/org/baeldung/httpclient/sec/HttpClientAuthLiveTest.java
index c9956e5852..96278b481a 100644
--- a/httpclient/src/test/java/org/baeldung/httpclient/sec/HttpClientAuthLiveTest.java
+++ b/httpclient-simple/src/test/java/org/baeldung/httpclient/sec/HttpClientAuthLiveTest.java
@@ -23,19 +23,18 @@ import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
-import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import static org.hamcrest.Matchers.equalTo;
import static org.junit.Assert.assertThat;
/*
- * NOTE : Need module spring-security-rest-basic-auth to be running
+ * NOTE : Need module httpclient-simple to be running
*/
public class HttpClientAuthLiveTest {
- private static final String URL_SECURED_BY_BASIC_AUTHENTICATION = "http://localhost:8081/spring-security-rest-basic-auth/api/foos/1";
+ private static final String URL_SECURED_BY_BASIC_AUTHENTICATION = "http://localhost:8082/httpclient-simple/api/foos/1";
private static final String DEFAULT_USER = "user1";
private static final String DEFAULT_PASS = "user1Pass";
@@ -111,7 +110,7 @@ public class HttpClientAuthLiveTest {
}
private HttpContext context() {
- final HttpHost targetHost = new HttpHost("localhost", 8080, "http");
+ final HttpHost targetHost = new HttpHost("localhost", 8082, "http");
final CredentialsProvider credsProvider = new BasicCredentialsProvider();
credsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(DEFAULT_USER, DEFAULT_PASS));
diff --git a/spring-security-rest-basic-auth/src/test/java/org/baeldung/test/LiveTestSuite.java b/httpclient-simple/src/test/java/org/baeldung/test/LiveTestSuite.java
similarity index 100%
rename from spring-security-rest-basic-auth/src/test/java/org/baeldung/test/LiveTestSuite.java
rename to httpclient-simple/src/test/java/org/baeldung/test/LiveTestSuite.java
diff --git a/httpclient/README.md b/httpclient/README.md
index ce98d7e72e..cab538be85 100644
--- a/httpclient/README.md
+++ b/httpclient/README.md
@@ -13,7 +13,6 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring
- [Unshorten URLs with HttpClient](http://www.baeldung.com/unshorten-url-httpclient)
- [HttpClient 4 – Follow Redirects for POST](http://www.baeldung.com/httpclient-redirect-on-http-post)
- [Custom HTTP Header with the HttpClient](http://www.baeldung.com/httpclient-custom-http-header)
-- [HttpClient Basic Authentication](http://www.baeldung.com/httpclient-4-basic-authentication)
- [Multipart Upload with HttpClient 4](http://www.baeldung.com/httpclient-multipart-upload)
- [HttpAsyncClient Tutorial](http://www.baeldung.com/httpasyncclient-tutorial)
- [HttpClient 4 Tutorial](http://www.baeldung.com/httpclient-guide)
diff --git a/libraries-apache-commons/src/main/java/com/baeldung/commons/beanutils/CourseService.java b/libraries-apache-commons/src/main/java/com/baeldung/commons/beanutils/CourseService.java
index 538fa3accb..2c7644fd64 100644
--- a/libraries-apache-commons/src/main/java/com/baeldung/commons/beanutils/CourseService.java
+++ b/libraries-apache-commons/src/main/java/com/baeldung/commons/beanutils/CourseService.java
@@ -29,6 +29,6 @@ public class CourseService {
}
public static void copyProperties(Course course, CourseEntity courseEntity) throws IllegalAccessException, InvocationTargetException {
- BeanUtils.copyProperties(course, courseEntity);
+ BeanUtils.copyProperties(courseEntity, course);
}
}
diff --git a/libraries-apache-commons/src/test/java/com/baeldung/commons/beanutils/CourseServiceUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/commons/beanutils/CourseServiceUnitTest.java
index 833d91b2c4..224ee8404c 100644
--- a/libraries-apache-commons/src/test/java/com/baeldung/commons/beanutils/CourseServiceUnitTest.java
+++ b/libraries-apache-commons/src/test/java/com/baeldung/commons/beanutils/CourseServiceUnitTest.java
@@ -44,6 +44,8 @@ public class CourseServiceUnitTest {
CourseEntity courseEntity = new CourseEntity();
CourseService.copyProperties(course, courseEntity);
+ Assert.assertNotNull(course.getName());
+ Assert.assertNotNull(courseEntity.getName());
Assert.assertEquals(course.getName(), courseEntity.getName());
Assert.assertEquals(course.getCodes(), courseEntity.getCodes());
Assert.assertNull(courseEntity.getStudent("ST-1"));
diff --git a/maven-java-11/multimodule-maven-project/daomodule/pom.xml b/maven-java-11/multimodule-maven-project/daomodule/pom.xml
new file mode 100644
index 0000000000..de9be656d4
--- /dev/null
+++ b/maven-java-11/multimodule-maven-project/daomodule/pom.xml
@@ -0,0 +1,14 @@
+
+
+ 4.0.0
+
+ com.baeldung.multimodule-maven-project
+ multimodule-maven-project
+ 1.0
+
+ com.baeldung.daomodule
+ daomodule
+ jar
+ 1.0
+ daomodule
+
diff --git a/maven-java-11/multimodule-maven-project/daomodule/src/main/java/com/baeldung/dao/Dao.java b/maven-java-11/multimodule-maven-project/daomodule/src/main/java/com/baeldung/dao/Dao.java
new file mode 100644
index 0000000000..f86ae8abb3
--- /dev/null
+++ b/maven-java-11/multimodule-maven-project/daomodule/src/main/java/com/baeldung/dao/Dao.java
@@ -0,0 +1,12 @@
+package com.baeldung.dao;
+
+import java.util.List;
+import java.util.Optional;
+
+public interface Dao {
+
+ Optional findById(int id);
+
+ List findAll();
+
+}
diff --git a/maven-java-11/multimodule-maven-project/daomodule/src/main/java/module-info.java b/maven-java-11/multimodule-maven-project/daomodule/src/main/java/module-info.java
new file mode 100644
index 0000000000..072d7ad007
--- /dev/null
+++ b/maven-java-11/multimodule-maven-project/daomodule/src/main/java/module-info.java
@@ -0,0 +1,3 @@
+module com.baeldung.dao {
+ exports com.baeldung.dao;
+}
diff --git a/maven-java-11/multimodule-maven-project/entitiymodule/pom.xml b/maven-java-11/multimodule-maven-project/entitiymodule/pom.xml
new file mode 100644
index 0000000000..8e700e62b5
--- /dev/null
+++ b/maven-java-11/multimodule-maven-project/entitiymodule/pom.xml
@@ -0,0 +1,18 @@
+
+
+ 4.0.0
+
+ com.baeldung.multimodule-maven-project
+ multimodule-maven-project
+ 1.0
+
+ com.baeldung.entitymodule
+ entitymodule
+ jar
+ 1.0
+ entitymodule
+
+ 11
+ 11
+
+
diff --git a/maven-java-11/multimodule-maven-project/entitiymodule/src/main/java/com/baeldung/entity/User.java b/maven-java-11/multimodule-maven-project/entitiymodule/src/main/java/com/baeldung/entity/User.java
new file mode 100644
index 0000000000..22022a2e6d
--- /dev/null
+++ b/maven-java-11/multimodule-maven-project/entitiymodule/src/main/java/com/baeldung/entity/User.java
@@ -0,0 +1,19 @@
+package com.baeldung.entity;
+
+public class User {
+
+ private final String name;
+
+ public User(String name) {
+ this.name = name;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ @Override
+ public String toString() {
+ return "User{" + "name=" + name + '}';
+ }
+}
diff --git a/maven-java-11/multimodule-maven-project/entitiymodule/src/main/java/module-info.java b/maven-java-11/multimodule-maven-project/entitiymodule/src/main/java/module-info.java
new file mode 100644
index 0000000000..67a3097352
--- /dev/null
+++ b/maven-java-11/multimodule-maven-project/entitiymodule/src/main/java/module-info.java
@@ -0,0 +1,3 @@
+module com.baeldung.entity {
+ exports com.baeldung.entity;
+}
diff --git a/maven-java-11/multimodule-maven-project/mainppmodule/pom.xml b/maven-java-11/multimodule-maven-project/mainppmodule/pom.xml
new file mode 100644
index 0000000000..d2c94527f1
--- /dev/null
+++ b/maven-java-11/multimodule-maven-project/mainppmodule/pom.xml
@@ -0,0 +1,32 @@
+
+
+ 4.0.0
+
+ com.baeldung.multimodule-maven-project
+ multimodule-maven-project
+ 1.0
+
+ com.baeldung.mainappmodule
+ mainappmodule
+ 1.0
+ jar
+ mainappmodule
+
+
+
+ com.baeldung.entitymodule
+ entitymodule
+ 1.0
+
+
+ com.baeldung.daomodule
+ daomodule
+ 1.0
+
+
+ com.baeldung.userdaomodule
+ userdaomodule
+ 1.0
+
+
+
diff --git a/maven-java-11/multimodule-maven-project/mainppmodule/src/main/java/com/baeldung/mainapp/Application.java b/maven-java-11/multimodule-maven-project/mainppmodule/src/main/java/com/baeldung/mainapp/Application.java
new file mode 100644
index 0000000000..0c0df7461b
--- /dev/null
+++ b/maven-java-11/multimodule-maven-project/mainppmodule/src/main/java/com/baeldung/mainapp/Application.java
@@ -0,0 +1,19 @@
+package com.baeldung.mainapp;
+
+import com.baeldung.dao.Dao;
+import com.baeldung.entity.User;
+import com.baeldung.userdao.UserDao;
+import java.util.HashMap;
+import java.util.Map;
+
+public class Application {
+
+ public static void main(String[] args) {
+ Map users = new HashMap<>();
+ users.put(1, new User("Julie"));
+ users.put(2, new User("David"));
+ Dao userDao = new UserDao(users);
+ userDao.findAll().forEach(System.out::println);
+ }
+
+}
diff --git a/maven-java-11/multimodule-maven-project/mainppmodule/src/main/java/module-info.java b/maven-java-11/multimodule-maven-project/mainppmodule/src/main/java/module-info.java
new file mode 100644
index 0000000000..c688fcf7de
--- /dev/null
+++ b/maven-java-11/multimodule-maven-project/mainppmodule/src/main/java/module-info.java
@@ -0,0 +1,6 @@
+module com.baeldung.mainapp {
+ requires com.baeldung.entity;
+ requires com.baeldung.userdao;
+ requires com.baeldung.dao;
+ uses com.baeldung.dao.Dao;
+}
diff --git a/maven-java-11/multimodule-maven-project/pom.xml b/maven-java-11/multimodule-maven-project/pom.xml
new file mode 100644
index 0000000000..f22541738c
--- /dev/null
+++ b/maven-java-11/multimodule-maven-project/pom.xml
@@ -0,0 +1,58 @@
+
+
+ 4.0.0
+ com.baeldung.multimodule-maven-project
+ multimodule-maven-project
+ 1.0
+ pom
+ multimodule-maven-project
+
+ com.baeldung.maven-java-11
+ maven-java-11
+ 1.0
+
+
+
+
+
+ junit
+ junit
+ 4.12
+ test
+
+
+ org.assertj
+ assertj-core
+ 3.12.2
+ test
+
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.8.0
+
+
+ 11
+
+
+
+
+
+
+
+ entitymodule
+ daomodule
+ userdaomodule
+ mainappmodule
+
+
+
+ UTF-8
+
+
diff --git a/maven-java-11/multimodule-maven-project/userdaomodule/pom.xml b/maven-java-11/multimodule-maven-project/userdaomodule/pom.xml
new file mode 100644
index 0000000000..b4fe7f0398
--- /dev/null
+++ b/maven-java-11/multimodule-maven-project/userdaomodule/pom.xml
@@ -0,0 +1,31 @@
+
+
+ 4.0.0
+
+ com.baeldung.multimodule-maven-project
+ multimodule-maven-project
+ 1.0
+
+ com.baeldung.userdaomodule
+ userdaomodule
+ 1.0
+ jar
+ userdaomodule
+
+
+ com.baeldung.entitymodule
+ entitymodule
+ 1.0
+
+
+ com.baeldung.daomodule
+ daomodule
+ 1.0
+
+
+ junit
+ junit
+ test
+
+
+
diff --git a/maven-java-11/multimodule-maven-project/userdaomodule/src/main/java/com/baeldung/userdao/UserDao.java b/maven-java-11/multimodule-maven-project/userdaomodule/src/main/java/com/baeldung/userdao/UserDao.java
new file mode 100644
index 0000000000..1f1ea38a60
--- /dev/null
+++ b/maven-java-11/multimodule-maven-project/userdaomodule/src/main/java/com/baeldung/userdao/UserDao.java
@@ -0,0 +1,32 @@
+package com.baeldung.userdao;
+
+import com.baeldung.dao.Dao;
+import com.baeldung.entity.User;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+
+public class UserDao implements Dao {
+
+ private final Map users;
+
+ public UserDao() {
+ users = new HashMap<>();
+ }
+
+ public UserDao(Map users) {
+ this.users = users;
+ }
+
+ @Override
+ public List findAll() {
+ return new ArrayList<>(users.values());
+ }
+
+ @Override
+ public Optional findById(int id) {
+ return Optional.ofNullable(users.get(id));
+ }
+}
\ No newline at end of file
diff --git a/maven-java-11/multimodule-maven-project/userdaomodule/src/main/java/module-info.java b/maven-java-11/multimodule-maven-project/userdaomodule/src/main/java/module-info.java
new file mode 100644
index 0000000000..f1cb217e23
--- /dev/null
+++ b/maven-java-11/multimodule-maven-project/userdaomodule/src/main/java/module-info.java
@@ -0,0 +1,6 @@
+module com.baeldung.userdao {
+ requires com.baeldung.entity;
+ requires com.baeldung.dao;
+ provides com.baeldung.dao.Dao with com.baeldung.userdao.UserDao;
+ exports com.baeldung.userdao;
+}
diff --git a/maven-java-11/multimodule-maven-project/userdaomodule/src/test/java/com/baeldung/userdao/test/UserDaoUnitTest.java b/maven-java-11/multimodule-maven-project/userdaomodule/src/test/java/com/baeldung/userdao/test/UserDaoUnitTest.java
new file mode 100644
index 0000000000..191d17ff32
--- /dev/null
+++ b/maven-java-11/multimodule-maven-project/userdaomodule/src/test/java/com/baeldung/userdao/test/UserDaoUnitTest.java
@@ -0,0 +1,36 @@
+package com.baeldung.userdao.test;
+
+import com.baeldung.dao.Dao;
+import com.baeldung.entity.User;
+import com.baeldung.userdao.UserDao;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import static org.junit.Assert.*;
+import static org.hamcrest.CoreMatchers.*;
+import org.junit.Before;
+import org.junit.Test;
+
+public class UserDaoUnitTest {
+
+ private Dao userDao;
+
+ @Before
+ public void setUpUserDaoInstance() {
+ Map users = new HashMap<>();
+ users.put(1, new User("Julie"));
+ users.put(2, new User("David"));
+ userDao = new UserDao(users);
+ }
+
+ @Test
+ public void givenUserDaoIntance_whenCalledFindById_thenCorrect() {
+ assertThat(userDao.findById(1), isA(Optional.class));
+ }
+
+ @Test
+ public void givenUserDaoIntance_whenCalledFindAll_thenCorrect() {
+ assertThat(userDao.findAll(), isA(List.class));
+ }
+}
diff --git a/maven-java-11/pom.xml b/maven-java-11/pom.xml
new file mode 100644
index 0000000000..4342fa740f
--- /dev/null
+++ b/maven-java-11/pom.xml
@@ -0,0 +1,22 @@
+
+
+ 4.0.0
+ com.baeldung.maven-java-11
+ maven-java-11
+ 1.0
+ pom
+ maven-java-11
+
+ parent-modules
+ com.baeldung
+ 1.0.0-SNAPSHOT
+
+
+ multimodule-maven-project
+
+
+ UTF-8
+ 11
+ 11
+
+
diff --git a/patterns/design-patterns-2/README.md b/patterns/design-patterns-2/README.md
new file mode 100644
index 0000000000..c2a75d4680
--- /dev/null
+++ b/patterns/design-patterns-2/README.md
@@ -0,0 +1,3 @@
+### Relevant Articles
+
+- [The Mediator Pattern in Java](https://www.baeldung.com/java-mediator-pattern)
diff --git a/persistence-modules/java-mongodb/pom.xml b/persistence-modules/java-mongodb/pom.xml
index 9658ef567f..0f5efedb96 100644
--- a/persistence-modules/java-mongodb/pom.xml
+++ b/persistence-modules/java-mongodb/pom.xml
@@ -35,8 +35,8 @@
1.8
1.8
- 3.4.1
+ 3.10.1
1.11
-
\ No newline at end of file
+
diff --git a/persistence-modules/java-mongodb/src/main/java/com/baeldung/MongoBsonExample.java b/persistence-modules/java-mongodb/src/main/java/com/baeldung/MongoBsonExample.java
new file mode 100644
index 0000000000..0ad3dfae30
--- /dev/null
+++ b/persistence-modules/java-mongodb/src/main/java/com/baeldung/MongoBsonExample.java
@@ -0,0 +1,79 @@
+package com.baeldung;
+
+import com.mongodb.client.MongoClient;
+import com.mongodb.client.MongoClients;
+import com.mongodb.client.MongoCollection;
+import com.mongodb.client.MongoDatabase;
+import org.bson.Document;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+public class MongoBsonExample
+{
+ public static void main(String[] args)
+ {
+ //
+ // 4.1 Connect to cluster (default is localhost:27017)
+ //
+
+ MongoClient mongoClient = MongoClients.create();
+ MongoDatabase database = mongoClient.getDatabase("myDB");
+ MongoCollection collection = database.getCollection("employees");
+
+ //
+ // 4.2 Insert new document
+ //
+
+ Document employee = new Document()
+ .append("first_name", "Joe")
+ .append("last_name", "Smith")
+ .append("title", "Java Developer")
+ .append("years_of_service", 3)
+ .append("skills", Arrays.asList("java", "spring", "mongodb"))
+ .append("manager", new Document()
+ .append("first_name", "Sally")
+ .append("last_name", "Johanson"));
+ collection.insertOne(employee);
+
+ //
+ // 4.3 Find documents
+ //
+
+
+ Document query = new Document("last_name", "Smith");
+ List results = new ArrayList<>();
+ collection.find(query).into(results);
+
+ query =
+ new Document("$or", Arrays.asList(
+ new Document("last_name", "Smith"),
+ new Document("first_name", "Joe")));
+ results = new ArrayList<>();
+ collection.find(query).into(results);
+
+ //
+ // 4.4 Update document
+ //
+
+ query = new Document(
+ "skills",
+ new Document(
+ "$elemMatch",
+ new Document("$eq", "spring")));
+ Document update = new Document(
+ "$push",
+ new Document("skills", "security"));
+ collection.updateMany(query, update);
+
+ //
+ // 4.5 Delete documents
+ //
+
+ query = new Document(
+ "years_of_service",
+ new Document("$lt", 0));
+ collection.deleteMany(query);
+ }
+}
diff --git a/persistence-modules/pom.xml b/persistence-modules/pom.xml
index ee55325b20..67a5c36fed 100644
--- a/persistence-modules/pom.xml
+++ b/persistence-modules/pom.xml
@@ -35,7 +35,7 @@
querydsl
redis
solr
- spring-boot-h2/spring-boot-h2-database
+ spring-boot-persistence-h2
spring-boot-persistence
spring-boot-persistence-mongodb
spring-data-cassandra
diff --git a/persistence-modules/spring-boot-h2/spring-boot-h2-database/.gitignore b/persistence-modules/spring-boot-persistence-h2/.gitignore
similarity index 100%
rename from persistence-modules/spring-boot-h2/spring-boot-h2-database/.gitignore
rename to persistence-modules/spring-boot-persistence-h2/.gitignore
diff --git a/persistence-modules/spring-boot-h2/README.md b/persistence-modules/spring-boot-persistence-h2/README.md
similarity index 67%
rename from persistence-modules/spring-boot-h2/README.md
rename to persistence-modules/spring-boot-persistence-h2/README.md
index af5f395440..377b7c8939 100644
--- a/persistence-modules/spring-boot-h2/README.md
+++ b/persistence-modules/spring-boot-persistence-h2/README.md
@@ -1,2 +1,3 @@
### Relevant Articles:
- [Access the Same In-Memory H2 Database in Multiple Spring Boot Applications](https://www.baeldung.com/spring-boot-access-h2-database-multiple-apps)
+- [Spring Boot With H2 Database](https://www.baeldung.com/spring-boot-h2-database)
\ No newline at end of file
diff --git a/persistence-modules/spring-boot-h2/spring-boot-h2-database/pom.xml b/persistence-modules/spring-boot-persistence-h2/pom.xml
similarity index 97%
rename from persistence-modules/spring-boot-h2/spring-boot-h2-database/pom.xml
rename to persistence-modules/spring-boot-persistence-h2/pom.xml
index 882b88b535..4c8073ddb4 100644
--- a/persistence-modules/spring-boot-h2/spring-boot-h2-database/pom.xml
+++ b/persistence-modules/spring-boot-persistence-h2/pom.xml
@@ -14,7 +14,7 @@
parent-boot-2
com.baeldung
0.0.1-SNAPSHOT
- ../../../parent-boot-2
+ ../../parent-boot-2
diff --git a/persistence-modules/spring-boot-h2/spring-boot-h2-database/src/main/java/com/baeldung/h2db/auto/configuration/AutoConfigurationDemo.java b/persistence-modules/spring-boot-persistence-h2/src/main/java/com/baeldung/h2db/auto/configuration/AutoConfigurationDemo.java
similarity index 100%
rename from persistence-modules/spring-boot-h2/spring-boot-h2-database/src/main/java/com/baeldung/h2db/auto/configuration/AutoConfigurationDemo.java
rename to persistence-modules/spring-boot-persistence-h2/src/main/java/com/baeldung/h2db/auto/configuration/AutoConfigurationDemo.java
diff --git a/persistence-modules/spring-boot-h2/spring-boot-h2-database/src/main/java/com/baeldung/h2db/demo/client/ClientSpringBootApp.java b/persistence-modules/spring-boot-persistence-h2/src/main/java/com/baeldung/h2db/demo/client/ClientSpringBootApp.java
similarity index 100%
rename from persistence-modules/spring-boot-h2/spring-boot-h2-database/src/main/java/com/baeldung/h2db/demo/client/ClientSpringBootApp.java
rename to persistence-modules/spring-boot-persistence-h2/src/main/java/com/baeldung/h2db/demo/client/ClientSpringBootApp.java
diff --git a/persistence-modules/spring-boot-h2/spring-boot-h2-database/src/main/java/com/baeldung/h2db/demo/server/SpringBootApp.java b/persistence-modules/spring-boot-persistence-h2/src/main/java/com/baeldung/h2db/demo/server/SpringBootApp.java
similarity index 100%
rename from persistence-modules/spring-boot-h2/spring-boot-h2-database/src/main/java/com/baeldung/h2db/demo/server/SpringBootApp.java
rename to persistence-modules/spring-boot-persistence-h2/src/main/java/com/baeldung/h2db/demo/server/SpringBootApp.java
diff --git a/persistence-modules/spring-boot-h2/spring-boot-h2-database/src/main/java/com/baeldung/h2db/springboot/SpringBootH2Application.java b/persistence-modules/spring-boot-persistence-h2/src/main/java/com/baeldung/h2db/springboot/SpringBootH2Application.java
similarity index 100%
rename from persistence-modules/spring-boot-h2/spring-boot-h2-database/src/main/java/com/baeldung/h2db/springboot/SpringBootH2Application.java
rename to persistence-modules/spring-boot-persistence-h2/src/main/java/com/baeldung/h2db/springboot/SpringBootH2Application.java
diff --git a/persistence-modules/spring-boot-h2/spring-boot-h2-database/src/main/java/com/baeldung/h2db/springboot/daos/UserRepository.java b/persistence-modules/spring-boot-persistence-h2/src/main/java/com/baeldung/h2db/springboot/daos/UserRepository.java
similarity index 100%
rename from persistence-modules/spring-boot-h2/spring-boot-h2-database/src/main/java/com/baeldung/h2db/springboot/daos/UserRepository.java
rename to persistence-modules/spring-boot-persistence-h2/src/main/java/com/baeldung/h2db/springboot/daos/UserRepository.java
diff --git a/persistence-modules/spring-boot-h2/spring-boot-h2-database/src/main/java/com/baeldung/h2db/springboot/models/User.java b/persistence-modules/spring-boot-persistence-h2/src/main/java/com/baeldung/h2db/springboot/models/User.java
similarity index 100%
rename from persistence-modules/spring-boot-h2/spring-boot-h2-database/src/main/java/com/baeldung/h2db/springboot/models/User.java
rename to persistence-modules/spring-boot-persistence-h2/src/main/java/com/baeldung/h2db/springboot/models/User.java
diff --git a/persistence-modules/spring-boot-h2/spring-boot-h2-database/src/main/resources/application.properties b/persistence-modules/spring-boot-persistence-h2/src/main/resources/application.properties
similarity index 100%
rename from persistence-modules/spring-boot-h2/spring-boot-h2-database/src/main/resources/application.properties
rename to persistence-modules/spring-boot-persistence-h2/src/main/resources/application.properties
diff --git a/persistence-modules/spring-boot-h2/spring-boot-h2-database/src/main/resources/data.sql b/persistence-modules/spring-boot-persistence-h2/src/main/resources/data.sql
similarity index 100%
rename from persistence-modules/spring-boot-h2/spring-boot-h2-database/src/main/resources/data.sql
rename to persistence-modules/spring-boot-persistence-h2/src/main/resources/data.sql
diff --git a/persistence-modules/spring-boot-h2/spring-boot-h2-database/src/test/java/com/baeldung/SpringBootH2IntegrationTest.java b/persistence-modules/spring-boot-persistence-h2/src/test/java/com/baeldung/SpringBootH2IntegrationTest.java
similarity index 100%
rename from persistence-modules/spring-boot-h2/spring-boot-h2-database/src/test/java/com/baeldung/SpringBootH2IntegrationTest.java
rename to persistence-modules/spring-boot-persistence-h2/src/test/java/com/baeldung/SpringBootH2IntegrationTest.java
diff --git a/persistence-modules/spring-boot-h2/spring-boot-h2-database/src/test/java/com/baeldung/SpringContextIntegrationTest.java b/persistence-modules/spring-boot-persistence-h2/src/test/java/com/baeldung/SpringContextIntegrationTest.java
similarity index 100%
rename from persistence-modules/spring-boot-h2/spring-boot-h2-database/src/test/java/com/baeldung/SpringContextIntegrationTest.java
rename to persistence-modules/spring-boot-persistence-h2/src/test/java/com/baeldung/SpringContextIntegrationTest.java
diff --git a/pom.xml b/pom.xml
index 129e2a3e8e..64710a39a6 100644
--- a/pom.xml
+++ b/pom.xml
@@ -389,6 +389,7 @@
core-java-collections
core-java-collections-map
core-java-collections-list
+ core-java-collections-set
core-java-concurrency-basic
core-java-concurrency-collections
core-java-io
@@ -1060,6 +1061,7 @@
core-java-collections
core-java-collections-map
core-java-collections-list
+ core-java-collections-set
core-java-concurrency-basic
core-java-concurrency-collections
core-java-io
@@ -1170,6 +1172,7 @@
mapstruct
maven
+ maven-java-11
maven-archetype
maven-polyglot/maven-polyglot-json-extension
@@ -1497,8 +1500,9 @@
UTF-8
UTF-8
- refs/remotes/origin/master
- true
+ refs/remotes/origin/master
+ true
+ false
false
false
false
@@ -1539,7 +1543,7 @@
0.3.1
2.5.1
0.0.1
- 3.4
+ 3.8
2.3
3.8
diff --git a/spring-5-security-oauth/src/main/java/com/baeldung/cognito/CognitoWebConfiguration.java b/spring-5-security-oauth/src/main/java/com/baeldung/cognito/CognitoWebConfiguration.java
new file mode 100644
index 0000000000..ae03e0a802
--- /dev/null
+++ b/spring-5-security-oauth/src/main/java/com/baeldung/cognito/CognitoWebConfiguration.java
@@ -0,0 +1,16 @@
+package com.baeldung.cognito;
+
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.PropertySource;
+import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+@Configuration
+@PropertySource("cognito/application_cognito.yml")
+public class CognitoWebConfiguration implements WebMvcConfigurer {
+
+ @Override
+ public void addViewControllers(ViewControllerRegistry registry) {
+ registry.addViewController("/").setViewName("home");
+ }
+}
diff --git a/spring-5-security-oauth/src/main/java/com/baeldung/cognito/SpringCognitoApplication.java b/spring-5-security-oauth/src/main/java/com/baeldung/cognito/SpringCognitoApplication.java
new file mode 100644
index 0000000000..7f7b751cd9
--- /dev/null
+++ b/spring-5-security-oauth/src/main/java/com/baeldung/cognito/SpringCognitoApplication.java
@@ -0,0 +1,14 @@
+package com.baeldung.cognito;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.PropertySource;
+
+@SpringBootApplication
+@PropertySource("cognito/application_cognito.yml")
+public class SpringCognitoApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(SpringCognitoApplication.class, args);
+ }
+}
diff --git a/spring-5-security-oauth/src/main/resources/cognito/application_cognito.yml b/spring-5-security-oauth/src/main/resources/cognito/application_cognito.yml
new file mode 100644
index 0000000000..0a28dbccb4
--- /dev/null
+++ b/spring-5-security-oauth/src/main/resources/cognito/application_cognito.yml
@@ -0,0 +1,15 @@
+spring:
+ security:
+ oauth2:
+ client:
+ registration:
+ cognito:
+ client-id: clientId
+ client-secret: clientSecret
+ scope: openid
+ redirectUriTemplate: "http://localhost:8080/login/oauth2/code/cognito"
+ clientName: cognito-client-name
+ provider:
+ cognito:
+ issuerUri: https://cognito-idp.{region}.amazonaws.com/{poolId}
+ usernameAttribute: cognito:username
diff --git a/spring-5-security-oauth/src/main/resources/cognito/home.html b/spring-5-security-oauth/src/main/resources/cognito/home.html
new file mode 100644
index 0000000000..f0bd9e52a8
--- /dev/null
+++ b/spring-5-security-oauth/src/main/resources/cognito/home.html
@@ -0,0 +1,32 @@
+
+
+
+
+
+ OAuth2 Cognito Demo
+
+
+
+
+
+
+
+
+
OAuth2 Spring Security Cognito Demo
+
+
+
+
+
+
+
+
+
diff --git a/spring-5-security-oauth/src/main/resources/cognito/style.css b/spring-5-security-oauth/src/main/resources/cognito/style.css
new file mode 100644
index 0000000000..45190d6d70
--- /dev/null
+++ b/spring-5-security-oauth/src/main/resources/cognito/style.css
@@ -0,0 +1,9 @@
+.login {
+ background-color: #7289da;
+ color: #fff;
+}
+
+.login:hover {
+ background-color: #697ec4;
+ color: #fff;
+}
diff --git a/spring-boot-exceptions/pass-exception-to-client-json-spring-boot/.gitignore b/spring-boot-exceptions/pass-exception-to-client-json-spring-boot/.gitignore
new file mode 100644
index 0000000000..153c9335eb
--- /dev/null
+++ b/spring-boot-exceptions/pass-exception-to-client-json-spring-boot/.gitignore
@@ -0,0 +1,29 @@
+HELP.md
+/target/
+!.mvn/wrapper/maven-wrapper.jar
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+/build/
+
+### VS Code ###
+.vscode/
diff --git a/spring-boot-exceptions/pass-exception-to-client-json-spring-boot/pom.xml b/spring-boot-exceptions/pass-exception-to-client-json-spring-boot/pom.xml
new file mode 100644
index 0000000000..8237955aef
--- /dev/null
+++ b/spring-boot-exceptions/pass-exception-to-client-json-spring-boot/pom.xml
@@ -0,0 +1,43 @@
+
+
+ 4.0.0
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.1.4.RELEASE
+
+
+ com.baeldung
+ pass-exception-to-client-json-spring-boot
+ 0.0.4-SNAPSHOT
+ pass-exception-to-client-json-spring-boot
+ Baeldung article code on how to pass exceptions to client in JSON format using Spring Boot
+
+
+ 1.8
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
+
diff --git a/spring-boot-exceptions/pass-exception-to-client-json-spring-boot/src/main/java/com/baeldung/passexceptiontoclientjsonspringboot/CustomException.java b/spring-boot-exceptions/pass-exception-to-client-json-spring-boot/src/main/java/com/baeldung/passexceptiontoclientjsonspringboot/CustomException.java
new file mode 100644
index 0000000000..56fe80cd9a
--- /dev/null
+++ b/spring-boot-exceptions/pass-exception-to-client-json-spring-boot/src/main/java/com/baeldung/passexceptiontoclientjsonspringboot/CustomException.java
@@ -0,0 +1,11 @@
+package com.baeldung.passexceptiontoclientjsonspringboot;
+
+public class CustomException extends RuntimeException {
+
+ private static final long serialVersionUID = 1L;
+
+ public CustomException() {
+ super("Custom exception message.");
+ }
+
+}
\ No newline at end of file
diff --git a/spring-boot-exceptions/pass-exception-to-client-json-spring-boot/src/main/java/com/baeldung/passexceptiontoclientjsonspringboot/ErrorHandler.java b/spring-boot-exceptions/pass-exception-to-client-json-spring-boot/src/main/java/com/baeldung/passexceptiontoclientjsonspringboot/ErrorHandler.java
new file mode 100644
index 0000000000..b39d2811dd
--- /dev/null
+++ b/spring-boot-exceptions/pass-exception-to-client-json-spring-boot/src/main/java/com/baeldung/passexceptiontoclientjsonspringboot/ErrorHandler.java
@@ -0,0 +1,19 @@
+package com.baeldung.passexceptiontoclientjsonspringboot;
+
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.ControllerAdvice;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.ResponseStatus;
+
+@ControllerAdvice
+@ResponseBody
+public class ErrorHandler {
+
+ @ExceptionHandler(CustomException.class)
+ @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
+ public CustomException handleCustomException(CustomException ce) {
+ return ce;
+ }
+
+}
\ No newline at end of file
diff --git a/spring-boot-exceptions/pass-exception-to-client-json-spring-boot/src/main/java/com/baeldung/passexceptiontoclientjsonspringboot/MainController.java b/spring-boot-exceptions/pass-exception-to-client-json-spring-boot/src/main/java/com/baeldung/passexceptiontoclientjsonspringboot/MainController.java
new file mode 100644
index 0000000000..82c0c022a8
--- /dev/null
+++ b/spring-boot-exceptions/pass-exception-to-client-json-spring-boot/src/main/java/com/baeldung/passexceptiontoclientjsonspringboot/MainController.java
@@ -0,0 +1,14 @@
+package com.baeldung.passexceptiontoclientjsonspringboot;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+
+@Controller
+public class MainController {
+
+ @GetMapping("/")
+ public void index() throws CustomException {
+ throw new CustomException();
+ }
+
+}
\ No newline at end of file
diff --git a/spring-boot-exceptions/pass-exception-to-client-json-spring-boot/src/main/java/com/baeldung/passexceptiontoclientjsonspringboot/PassExceptionToClientJsonSpringBootApplication.java b/spring-boot-exceptions/pass-exception-to-client-json-spring-boot/src/main/java/com/baeldung/passexceptiontoclientjsonspringboot/PassExceptionToClientJsonSpringBootApplication.java
new file mode 100644
index 0000000000..77833c28fd
--- /dev/null
+++ b/spring-boot-exceptions/pass-exception-to-client-json-spring-boot/src/main/java/com/baeldung/passexceptiontoclientjsonspringboot/PassExceptionToClientJsonSpringBootApplication.java
@@ -0,0 +1,13 @@
+package com.baeldung.passexceptiontoclientjsonspringboot;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class PassExceptionToClientJsonSpringBootApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(PassExceptionToClientJsonSpringBootApplication.class, args);
+ }
+
+}
\ No newline at end of file
diff --git a/spring-boot-exceptions/pass-exception-to-client-json-spring-boot/src/main/resources/application.properties b/spring-boot-exceptions/pass-exception-to-client-json-spring-boot/src/main/resources/application.properties
new file mode 100644
index 0000000000..8b13789179
--- /dev/null
+++ b/spring-boot-exceptions/pass-exception-to-client-json-spring-boot/src/main/resources/application.properties
@@ -0,0 +1 @@
+
diff --git a/spring-boot-exceptions/pass-exception-to-client-json-spring-boot/src/main/resources/static/.gitignore b/spring-boot-exceptions/pass-exception-to-client-json-spring-boot/src/main/resources/static/.gitignore
new file mode 100644
index 0000000000..5e7d2734cf
--- /dev/null
+++ b/spring-boot-exceptions/pass-exception-to-client-json-spring-boot/src/main/resources/static/.gitignore
@@ -0,0 +1,4 @@
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/spring-boot-exceptions/pass-exception-to-client-json-spring-boot/src/main/resources/templates/.gitignore b/spring-boot-exceptions/pass-exception-to-client-json-spring-boot/src/main/resources/templates/.gitignore
new file mode 100644
index 0000000000..5e7d2734cf
--- /dev/null
+++ b/spring-boot-exceptions/pass-exception-to-client-json-spring-boot/src/main/resources/templates/.gitignore
@@ -0,0 +1,4 @@
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/spring-boot-exceptions/pass-exception-to-client-json-spring-boot/src/test/java/com/baeldung/passexceptiontoclientjsonspringboot/MainControllerIntegrationTest.java b/spring-boot-exceptions/pass-exception-to-client-json-spring-boot/src/test/java/com/baeldung/passexceptiontoclientjsonspringboot/MainControllerIntegrationTest.java
new file mode 100644
index 0000000000..a615dc5096
--- /dev/null
+++ b/spring-boot-exceptions/pass-exception-to-client-json-spring-boot/src/test/java/com/baeldung/passexceptiontoclientjsonspringboot/MainControllerIntegrationTest.java
@@ -0,0 +1,16 @@
+package com.baeldung.passexceptiontoclientjsonspringboot;
+
+import org.junit.Test;
+
+public class MainControllerIntegrationTest {
+
+ @Test(expected = CustomException.class)
+ public void givenIndex_thenCustomException() throws CustomException {
+
+ MainController mainController = new MainController();
+
+ mainController.index();
+
+ }
+
+}
\ No newline at end of file
diff --git a/spring-boot-exceptions/pass-exception-to-client-json-spring-boot/src/test/java/com/baeldung/passexceptiontoclientjsonspringboot/PassExceptionToClientJsonSpringBootApplicationTests.java b/spring-boot-exceptions/pass-exception-to-client-json-spring-boot/src/test/java/com/baeldung/passexceptiontoclientjsonspringboot/PassExceptionToClientJsonSpringBootApplicationTests.java
new file mode 100644
index 0000000000..5e35c21f4c
--- /dev/null
+++ b/spring-boot-exceptions/pass-exception-to-client-json-spring-boot/src/test/java/com/baeldung/passexceptiontoclientjsonspringboot/PassExceptionToClientJsonSpringBootApplicationTests.java
@@ -0,0 +1,16 @@
+package com.baeldung.passexceptiontoclientjsonspringboot;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest
+public class PassExceptionToClientJsonSpringBootApplicationTests {
+
+ @Test
+ public void contextLoads() {
+ }
+
+}
diff --git a/spring-boot-mvc-birt/README.md b/spring-boot-mvc-birt/README.md
new file mode 100644
index 0000000000..9fe3d94e2a
--- /dev/null
+++ b/spring-boot-mvc-birt/README.md
@@ -0,0 +1,3 @@
+### Relevant Articles
+
+- [BIRT Reporting with Spring Boot](https://www.baeldung.com/birt-reports-spring-boot)
diff --git a/spring-boot-rest/README.md b/spring-boot-rest/README.md
index 5abac75452..b28192cf62 100644
--- a/spring-boot-rest/README.md
+++ b/spring-boot-rest/README.md
@@ -7,10 +7,12 @@ Module for the articles that are part of the Spring REST E-book:
5. [Entity To DTO Conversion for a Spring REST API](https://www.baeldung.com/entity-to-and-from-dto-for-a-java-spring-application)
6. [Error Handling for REST with Spring](http://www.baeldung.com/exception-handling-for-rest-with-spring)
7. [REST API Discoverability and HATEOAS](http://www.baeldung.com/restful-web-service-discoverability)
-8. [REST Pagination in Spring](http://www.baeldung.com/rest-api-pagination-in-spring)
-9. [Test a REST API with Java](http://www.baeldung.com/integration-testing-a-rest-api)
-10. [HATEOAS for a Spring REST Service](http://www.baeldung.com/rest-api-discoverability-with-spring)
-11. [Versioning a REST API](http://www.baeldung.com/rest-versioning)
-12. [ETags for REST with Spring](http://www.baeldung.com/etags-for-rest-with-spring)
-13. [Testing REST with multiple MIME types](http://www.baeldung.com/testing-rest-api-with-multiple-media-types)
-14. [Testing Web APIs with Postman Collections](https://www.baeldung.com/postman-testing-collections)
+8. [An Intro to Spring HATEOAS](http://www.baeldung.com/spring-hateoas-tutorial)
+9. [REST Pagination in Spring](http://www.baeldung.com/rest-api-pagination-in-spring)
+10. [Test a REST API with Java](http://www.baeldung.com/integration-testing-a-rest-api)
+
+- [HATEOAS for a Spring REST Service](http://www.baeldung.com/rest-api-discoverability-with-spring)
+- [Versioning a REST API](http://www.baeldung.com/rest-versioning)
+- [ETags for REST with Spring](http://www.baeldung.com/etags-for-rest-with-spring)
+- [Testing REST with multiple MIME types](http://www.baeldung.com/testing-rest-api-with-multiple-media-types)
+- [Testing Web APIs with Postman Collections](https://www.baeldung.com/postman-testing-collections)
diff --git a/spring-boot-rest/pom.xml b/spring-boot-rest/pom.xml
index 2bf7c0181f..598b589ea0 100644
--- a/spring-boot-rest/pom.xml
+++ b/spring-boot-rest/pom.xml
@@ -44,6 +44,12 @@
org.springframework.boot
spring-boot-starter-data-jpa
+
+
+
+ org.springframework.boot
+ spring-boot-starter-hateoas
+
diff --git a/spring-boot-rest/src/main/java/com/baeldung/modelmapper/controller/PostRestController.java b/spring-boot-rest/src/main/java/com/baeldung/modelmapper/controller/PostRestController.java
index c0cbca5220..68c17975d4 100644
--- a/spring-boot-rest/src/main/java/com/baeldung/modelmapper/controller/PostRestController.java
+++ b/spring-boot-rest/src/main/java/com/baeldung/modelmapper/controller/PostRestController.java
@@ -21,6 +21,7 @@ import com.baeldung.modelmapper.service.IPostService;
import com.baeldung.modelmapper.service.IUserService;
@Controller
+@RequestMapping("/posts")
public class PostRestController {
@Autowired
diff --git a/spring-security-rest/src/main/java/org/baeldung/persistence/model/Customer.java b/spring-boot-rest/src/main/java/com/baeldung/persistence/model/Customer.java
similarity index 97%
rename from spring-security-rest/src/main/java/org/baeldung/persistence/model/Customer.java
rename to spring-boot-rest/src/main/java/com/baeldung/persistence/model/Customer.java
index b302ec057a..10da2e10f0 100644
--- a/spring-security-rest/src/main/java/org/baeldung/persistence/model/Customer.java
+++ b/spring-boot-rest/src/main/java/com/baeldung/persistence/model/Customer.java
@@ -1,4 +1,4 @@
-package org.baeldung.persistence.model;
+package com.baeldung.persistence.model;
import java.util.Map;
diff --git a/spring-security-rest/src/main/java/org/baeldung/persistence/model/Order.java b/spring-boot-rest/src/main/java/com/baeldung/persistence/model/Order.java
similarity index 96%
rename from spring-security-rest/src/main/java/org/baeldung/persistence/model/Order.java
rename to spring-boot-rest/src/main/java/com/baeldung/persistence/model/Order.java
index ca551423e8..7aea9bce5c 100644
--- a/spring-security-rest/src/main/java/org/baeldung/persistence/model/Order.java
+++ b/spring-boot-rest/src/main/java/com/baeldung/persistence/model/Order.java
@@ -1,4 +1,4 @@
-package org.baeldung.persistence.model;
+package com.baeldung.persistence.model;
import org.springframework.hateoas.ResourceSupport;
diff --git a/spring-security-rest/src/main/java/org/baeldung/web/service/CustomerService.java b/spring-boot-rest/src/main/java/com/baeldung/services/CustomerService.java
similarity index 64%
rename from spring-security-rest/src/main/java/org/baeldung/web/service/CustomerService.java
rename to spring-boot-rest/src/main/java/com/baeldung/services/CustomerService.java
index da016af2d5..a5e95e693b 100644
--- a/spring-security-rest/src/main/java/org/baeldung/web/service/CustomerService.java
+++ b/spring-boot-rest/src/main/java/com/baeldung/services/CustomerService.java
@@ -1,8 +1,8 @@
-package org.baeldung.web.service;
+package com.baeldung.services;
import java.util.List;
-import org.baeldung.persistence.model.Customer;
+import com.baeldung.persistence.model.Customer;
public interface CustomerService {
diff --git a/spring-security-rest/src/main/java/org/baeldung/web/service/CustomerServiceImpl.java b/spring-boot-rest/src/main/java/com/baeldung/services/CustomerServiceImpl.java
similarity index 92%
rename from spring-security-rest/src/main/java/org/baeldung/web/service/CustomerServiceImpl.java
rename to spring-boot-rest/src/main/java/com/baeldung/services/CustomerServiceImpl.java
index e179de2554..58030483ec 100644
--- a/spring-security-rest/src/main/java/org/baeldung/web/service/CustomerServiceImpl.java
+++ b/spring-boot-rest/src/main/java/com/baeldung/services/CustomerServiceImpl.java
@@ -1,12 +1,13 @@
-package org.baeldung.web.service;
+package com.baeldung.services;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
-import org.baeldung.persistence.model.Customer;
import org.springframework.stereotype.Service;
+import com.baeldung.persistence.model.Customer;
+
@Service
public class CustomerServiceImpl implements CustomerService {
diff --git a/spring-security-rest/src/main/java/org/baeldung/web/service/OrderService.java b/spring-boot-rest/src/main/java/com/baeldung/services/OrderService.java
similarity index 70%
rename from spring-security-rest/src/main/java/org/baeldung/web/service/OrderService.java
rename to spring-boot-rest/src/main/java/com/baeldung/services/OrderService.java
index 9a23488c50..775701e042 100644
--- a/spring-security-rest/src/main/java/org/baeldung/web/service/OrderService.java
+++ b/spring-boot-rest/src/main/java/com/baeldung/services/OrderService.java
@@ -1,8 +1,8 @@
-package org.baeldung.web.service;
+package com.baeldung.services;
import java.util.List;
-import org.baeldung.persistence.model.Order;
+import com.baeldung.persistence.model.Order;
public interface OrderService {
diff --git a/spring-security-rest/src/main/java/org/baeldung/web/service/OrderServiceImpl.java b/spring-boot-rest/src/main/java/com/baeldung/services/OrderServiceImpl.java
similarity index 93%
rename from spring-security-rest/src/main/java/org/baeldung/web/service/OrderServiceImpl.java
rename to spring-boot-rest/src/main/java/com/baeldung/services/OrderServiceImpl.java
index 0a6d4708a1..fffdf88969 100644
--- a/spring-security-rest/src/main/java/org/baeldung/web/service/OrderServiceImpl.java
+++ b/spring-boot-rest/src/main/java/com/baeldung/services/OrderServiceImpl.java
@@ -1,14 +1,15 @@
-package org.baeldung.web.service;
+package com.baeldung.services;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
-import org.baeldung.persistence.model.Customer;
-import org.baeldung.persistence.model.Order;
import org.springframework.stereotype.Service;
+import com.baeldung.persistence.model.Customer;
+import com.baeldung.persistence.model.Order;
+
@Service
public class OrderServiceImpl implements OrderService {
diff --git a/spring-security-rest/src/main/java/org/baeldung/web/controller/CustomerController.java b/spring-boot-rest/src/main/java/com/baeldung/web/controller/CustomerController.java
similarity index 64%
rename from spring-security-rest/src/main/java/org/baeldung/web/controller/CustomerController.java
rename to spring-boot-rest/src/main/java/com/baeldung/web/controller/CustomerController.java
index e1db105d18..91aa9f2144 100644
--- a/spring-security-rest/src/main/java/org/baeldung/web/controller/CustomerController.java
+++ b/spring-boot-rest/src/main/java/com/baeldung/web/controller/CustomerController.java
@@ -1,24 +1,25 @@
-package org.baeldung.web.controller;
+package com.baeldung.web.controller;
import static org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo;
import static org.springframework.hateoas.mvc.ControllerLinkBuilder.methodOn;
import java.util.List;
-import org.baeldung.persistence.model.Customer;
-import org.baeldung.persistence.model.Order;
-import org.baeldung.web.service.CustomerService;
-import org.baeldung.web.service.OrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.hateoas.Link;
import org.springframework.hateoas.Resources;
import org.springframework.hateoas.config.EnableHypermediaSupport;
import org.springframework.hateoas.config.EnableHypermediaSupport.HypermediaType;
+import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
+import com.baeldung.persistence.model.Customer;
+import com.baeldung.persistence.model.Order;
+import com.baeldung.services.CustomerService;
+import com.baeldung.services.OrderService;
+
@RestController
@RequestMapping(value = "/customers")
@EnableHypermediaSupport(type = HypermediaType.HAL)
@@ -29,45 +30,49 @@ public class CustomerController {
@Autowired
private OrderService orderService;
- @RequestMapping(value = "/{customerId}", method = RequestMethod.GET)
+ @GetMapping("/{customerId}")
public Customer getCustomerById(@PathVariable final String customerId) {
return customerService.getCustomerDetail(customerId);
}
- @RequestMapping(value = "/{customerId}/{orderId}", method = RequestMethod.GET)
+ @GetMapping("/{customerId}/{orderId}")
public Order getOrderById(@PathVariable final String customerId, @PathVariable final String orderId) {
return orderService.getOrderByIdForCustomer(customerId, orderId);
}
- @RequestMapping(value = "/{customerId}/orders", method = RequestMethod.GET , produces = {"application/hal+json"})
+ @GetMapping(value = "/{customerId}/orders", produces = { "application/hal+json" })
public Resources getOrdersForCustomer(@PathVariable final String customerId) {
final List orders = orderService.getAllOrdersForCustomer(customerId);
for (final Order order : orders) {
- final Link selfLink = linkTo(methodOn(CustomerController.class).getOrderById(customerId, order.getOrderId())).withSelfRel();
+ final Link selfLink = linkTo(
+ methodOn(CustomerController.class).getOrderById(customerId, order.getOrderId())).withSelfRel();
order.add(selfLink);
}
-
- Link link =linkTo(methodOn(CustomerController.class).getOrdersForCustomer(customerId)).withSelfRel();
- Resources result = new Resources<>(orders,link);
+
+ Link link = linkTo(methodOn(CustomerController.class).getOrdersForCustomer(customerId)).withSelfRel();
+ Resources result = new Resources<>(orders, link);
return result;
}
- @RequestMapping(method = RequestMethod.GET, produces = {"application/hal+json"})
+ @GetMapping(produces = { "application/hal+json" })
public Resources getAllCustomers() {
final List allCustomers = customerService.allCustomers();
-
+
for (final Customer customer : allCustomers) {
String customerId = customer.getCustomerId();
- Link selfLink = linkTo(CustomerController.class).slash(customerId).withSelfRel();
+ Link selfLink = linkTo(CustomerController.class).slash(customerId)
+ .withSelfRel();
customer.add(selfLink);
- if (orderService.getAllOrdersForCustomer(customerId).size() > 0) {
- final Link ordersLink = linkTo(methodOn(CustomerController.class).getOrdersForCustomer(customerId)).withRel("allOrders");
+ if (orderService.getAllOrdersForCustomer(customerId)
+ .size() > 0) {
+ final Link ordersLink = linkTo(methodOn(CustomerController.class).getOrdersForCustomer(customerId))
+ .withRel("allOrders");
customer.add(ordersLink);
}
}
-
- Link link =linkTo(CustomerController.class).withSelfRel();
- Resources result = new Resources<>(allCustomers,link);
+
+ Link link = linkTo(CustomerController.class).withSelfRel();
+ Resources result = new Resources<>(allCustomers, link);
return result;
}
diff --git a/spring-boot-rest/src/test/java/com/baeldung/springhateoas/CustomerControllerIntegrationTest.java b/spring-boot-rest/src/test/java/com/baeldung/springhateoas/CustomerControllerIntegrationTest.java
new file mode 100644
index 0000000000..b08da6d2cd
--- /dev/null
+++ b/spring-boot-rest/src/test/java/com/baeldung/springhateoas/CustomerControllerIntegrationTest.java
@@ -0,0 +1,98 @@
+package com.baeldung.springhateoas;
+
+import static org.hamcrest.Matchers.is;
+import static org.mockito.BDDMockito.given;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+
+import java.util.Collections;
+import java.util.List;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
+import org.springframework.boot.test.mock.mockito.MockBean;
+import org.springframework.hateoas.MediaTypes;
+import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.test.web.servlet.MockMvc;
+
+import com.baeldung.persistence.model.Customer;
+import com.baeldung.persistence.model.Order;
+import com.baeldung.services.CustomerService;
+import com.baeldung.services.OrderService;
+import com.baeldung.web.controller.CustomerController;
+
+@RunWith(SpringRunner.class)
+@WebMvcTest(CustomerController.class)
+public class CustomerControllerIntegrationTest {
+
+ @Autowired
+ private MockMvc mvc;
+
+ @MockBean
+ private CustomerService customerService;
+
+ @MockBean
+ private OrderService orderService;
+
+ private static final String DEFAULT_CUSTOMER_ID = "customer1";
+ private static final String DEFAULT_ORDER_ID = "order1";
+
+ @Test
+ public void givenExistingCustomer_whenCustomerRequested_thenResourceRetrieved() throws Exception {
+ given(this.customerService.getCustomerDetail(DEFAULT_CUSTOMER_ID))
+ .willReturn(new Customer(DEFAULT_CUSTOMER_ID, "customerJohn", "companyOne"));
+
+ this.mvc.perform(get("/customers/" + DEFAULT_CUSTOMER_ID))
+ .andExpect(status().isOk())
+ .andExpect(jsonPath("$._links").doesNotExist())
+ .andExpect(jsonPath("$.customerId", is(DEFAULT_CUSTOMER_ID)));
+ }
+
+ @Test
+ public void givenExistingOrder_whenOrderRequested_thenResourceRetrieved() throws Exception {
+ given(this.orderService.getOrderByIdForCustomer(DEFAULT_CUSTOMER_ID, DEFAULT_ORDER_ID))
+ .willReturn(new Order(DEFAULT_ORDER_ID, 1., 1));
+
+ this.mvc.perform(get("/customers/" + DEFAULT_CUSTOMER_ID + "/" + DEFAULT_ORDER_ID))
+ .andExpect(status().isOk())
+ .andExpect(jsonPath("$._links").doesNotExist())
+ .andExpect(jsonPath("$.orderId", is(DEFAULT_ORDER_ID)));
+ }
+
+ @Test
+ public void givenExistingCustomerWithOrders_whenOrdersRequested_thenHalResourceRetrieved() throws Exception {
+ Order order1 = new Order(DEFAULT_ORDER_ID, 1., 1);
+ List orders = Collections.singletonList(order1);
+ given(this.orderService.getAllOrdersForCustomer(DEFAULT_CUSTOMER_ID)).willReturn(orders);
+
+ this.mvc.perform(get("/customers/" + DEFAULT_CUSTOMER_ID + "/orders").accept(MediaTypes.HAL_JSON_VALUE))
+ .andExpect(status().isOk())
+ .andExpect(jsonPath("$._embedded.orderList[0]._links.self.href",
+ is("http://localhost/customers/customer1/order1")))
+ .andExpect(jsonPath("$._links.self.href", is("http://localhost/customers/customer1/orders")));
+ }
+
+ @Test
+ public void givenExistingCustomer_whenAllCustomersRequested_thenHalResourceRetrieved() throws Exception {
+ // customers
+ Customer retrievedCustomer = new Customer(DEFAULT_CUSTOMER_ID, "customerJohn", "companyOne");
+ List customers = Collections.singletonList(retrievedCustomer);
+ given(this.customerService.allCustomers()).willReturn(customers);
+ // orders
+ Order order1 = new Order(DEFAULT_ORDER_ID, 1., 1);
+ List orders = Collections.singletonList(order1);
+ given(this.orderService.getAllOrdersForCustomer(DEFAULT_CUSTOMER_ID)).willReturn(orders);
+
+ this.mvc.perform(get("/customers/").accept(MediaTypes.HAL_JSON_VALUE))
+ .andExpect(status().isOk())
+ .andExpect(
+ jsonPath("$._embedded.customerList[0]._links.self.href", is("http://localhost/customers/customer1")))
+ .andExpect(jsonPath("$._embedded.customerList[0]._links.allOrders.href",
+ is("http://localhost/customers/customer1/orders")))
+ .andExpect(jsonPath("$._links.self.href", is("http://localhost/customers")));
+ }
+
+}
diff --git a/spring-boot/src/main/java/org/baeldung/properties/ConfigProperties.java b/spring-boot/src/main/java/org/baeldung/properties/ConfigProperties.java
index 3698d8ef30..1a3c985fe4 100644
--- a/spring-boot/src/main/java/org/baeldung/properties/ConfigProperties.java
+++ b/spring-boot/src/main/java/org/baeldung/properties/ConfigProperties.java
@@ -9,6 +9,7 @@ import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Pattern;
import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.validation.annotation.Validated;
@@ -80,4 +81,10 @@ public class ConfigProperties {
public void setCredentials(Credentials credentials) {
this.credentials = credentials;
}
+
+ @Bean
+ @ConfigurationProperties(prefix = "item")
+ public Item item(){
+ return new Item();
+ }
}
diff --git a/spring-boot/src/main/java/org/baeldung/properties/Item.java b/spring-boot/src/main/java/org/baeldung/properties/Item.java
new file mode 100644
index 0000000000..0314654ada
--- /dev/null
+++ b/spring-boot/src/main/java/org/baeldung/properties/Item.java
@@ -0,0 +1,31 @@
+package org.baeldung.properties;
+
+public class Item {
+
+ private String name;
+ private int size;
+
+ public Item() {
+ }
+
+ public Item(String name, int size) {
+ this.name = name;
+ this.size = size;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public int getSize() {
+ return size;
+ }
+
+ public void setSize(int size) {
+ this.size = size;
+ }
+}
diff --git a/spring-boot/src/main/resources/configprops.properties b/spring-boot/src/main/resources/configprops.properties
index 2dad11f9cc..424b3632f9 100644
--- a/spring-boot/src/main/resources/configprops.properties
+++ b/spring-boot/src/main/resources/configprops.properties
@@ -17,4 +17,8 @@ mail.credentials.username=john
mail.credentials.password=password
mail.credentials.authMethod=SHA1
+#Bean method properties
+item.name=Item name
+item.size=42
+
diff --git a/spring-boot/src/test/java/org/baeldung/properties/ConfigPropertiesIntegrationTest.java b/spring-boot/src/test/java/org/baeldung/properties/ConfigPropertiesIntegrationTest.java
index 4ba6bf29d8..f864fd4f8c 100644
--- a/spring-boot/src/test/java/org/baeldung/properties/ConfigPropertiesIntegrationTest.java
+++ b/spring-boot/src/test/java/org/baeldung/properties/ConfigPropertiesIntegrationTest.java
@@ -53,4 +53,11 @@ public class ConfigPropertiesIntegrationTest {
Assert.assertEquals("Incorrectly bound object property, username", "john", credentials.getUsername());
Assert.assertEquals("Incorrectly bound object property, password", "password", credentials.getPassword());
}
+
+ @Test
+ public void whenBeanMethodAnnotatedThenPropertiesCorrectlyBound(){
+ Item item = properties.item();
+ Assert.assertEquals("Incorrectly bound object property, item.name","Test item name", item.getName());
+ Assert.assertEquals("Incorrectly bound object property, item.size", 21, item.getSize());
+ }
}
diff --git a/spring-boot/src/test/resources/configprops-test.properties b/spring-boot/src/test/resources/configprops-test.properties
index 697771ae6e..ea11f2159e 100644
--- a/spring-boot/src/test/resources/configprops-test.properties
+++ b/spring-boot/src/test/resources/configprops-test.properties
@@ -17,3 +17,6 @@ mail.credentials.username=john
mail.credentials.password=password
mail.credentials.authMethod=SHA1
+#Bean method properties
+item.name=Test item name
+item.size=21
diff --git a/spring-cloud/spring-cloud-archaius/basic-config/src/test/java/com/baeldung/spring/cloud/archaius/basic/ArchaiusBasicConfigurationIntegrationTest.java b/spring-cloud/spring-cloud-archaius/basic-config/src/test/java/com/baeldung/spring/cloud/archaius/basic/ArchaiusBasicConfigurationIntegrationTest.java
index 2948606c0b..d49a8dfa7e 100644
--- a/spring-cloud/spring-cloud-archaius/basic-config/src/test/java/com/baeldung/spring/cloud/archaius/basic/ArchaiusBasicConfigurationIntegrationTest.java
+++ b/spring-cloud/spring-cloud-archaius/basic-config/src/test/java/com/baeldung/spring/cloud/archaius/basic/ArchaiusBasicConfigurationIntegrationTest.java
@@ -5,21 +5,18 @@ import static org.assertj.core.api.Assertions.assertThat;
import java.util.Collections;
import org.junit.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
-import org.junit.platform.runner.JUnitPlatform;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.util.TestPropertyValues;
import org.springframework.cloud.context.environment.EnvironmentChangeEvent;
import org.springframework.context.ConfigurableApplicationContext;
-import org.springframework.test.context.junit.jupiter.SpringExtension;
+import org.springframework.test.context.junit4.SpringRunner;
import com.netflix.config.DynamicPropertyFactory;
import com.netflix.config.DynamicStringProperty;
-@RunWith(JUnitPlatform.class)
-@ExtendWith(SpringExtension.class)
+@RunWith(SpringRunner.class)
@SpringBootTest
public class ArchaiusBasicConfigurationIntegrationTest {
diff --git a/spring-cloud/spring-cloud-archaius/dynamodb-config/src/test/java/com/baeldung/spring/cloud/archaius/dynamosources/SpringContextLiveTest.java b/spring-cloud/spring-cloud-archaius/dynamodb-config/src/test/java/com/baeldung/spring/cloud/archaius/dynamosources/SpringContextLiveTest.java
new file mode 100644
index 0000000000..a1a6c46c60
--- /dev/null
+++ b/spring-cloud/spring-cloud-archaius/dynamodb-config/src/test/java/com/baeldung/spring/cloud/archaius/dynamosources/SpringContextLiveTest.java
@@ -0,0 +1,20 @@
+package com.baeldung.spring.cloud.archaius.dynamosources;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+/**
+ * To run this Live Test we need to:
+ * * start a dynamodb instance locally on port 8000(e.g. with the following command `docker run -p 8000:8000 --name bael-dynamodb amazon/dynamodb-local`)
+ *
+ */
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = DynamoSourcesApplication.class)
+public class SpringContextLiveTest {
+
+ @Test
+ public void whenSpringContextIsBootstrapped_thenNoExceptions() {
+ }
+}
\ No newline at end of file
diff --git a/spring-cloud/spring-cloud-bootstrap/discovery/java/org/baeldung/SpringContextIntegrationTest.java b/spring-cloud/spring-cloud-archaius/jdbc-config/src/test/java/com/baeldung/spring/cloud/archaius/jdbconfig/SpringContextIntegrationTest.java
similarity index 70%
rename from spring-cloud/spring-cloud-bootstrap/discovery/java/org/baeldung/SpringContextIntegrationTest.java
rename to spring-cloud/spring-cloud-archaius/jdbc-config/src/test/java/com/baeldung/spring/cloud/archaius/jdbconfig/SpringContextIntegrationTest.java
index 6016788eab..b3cd01e684 100644
--- a/spring-cloud/spring-cloud-bootstrap/discovery/java/org/baeldung/SpringContextIntegrationTest.java
+++ b/spring-cloud/spring-cloud-archaius/jdbc-config/src/test/java/com/baeldung/spring/cloud/archaius/jdbconfig/SpringContextIntegrationTest.java
@@ -1,17 +1,15 @@
-package org.baeldung;
+package com.baeldung.spring.cloud.archaius.jdbconfig;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
-import com.baeldung.spring.cloud.bootstrap.config.ConfigApplication;
-
@RunWith(SpringRunner.class)
-@SpringBootTest(classes = ConfigApplication.class)
+@SpringBootTest(classes = JdbcSourcesApplication.class)
public class SpringContextIntegrationTest {
@Test
public void whenSpringContextIsBootstrapped_thenNoExceptions() {
}
-}
+}
\ No newline at end of file
diff --git a/spring-cloud/spring-cloud-archaius/zookeeper-config/src/test/java/com/baeldung/spring/cloud/archaius/zookeeperconfig/SpringContextLiveTest.java b/spring-cloud/spring-cloud-archaius/zookeeper-config/src/test/java/com/baeldung/spring/cloud/archaius/zookeeperconfig/SpringContextLiveTest.java
new file mode 100644
index 0000000000..a827b8e27d
--- /dev/null
+++ b/spring-cloud/spring-cloud-archaius/zookeeper-config/src/test/java/com/baeldung/spring/cloud/archaius/zookeeperconfig/SpringContextLiveTest.java
@@ -0,0 +1,20 @@
+package com.baeldung.spring.cloud.archaius.zookeeperconfig;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+/**
+ * This Live tTest requires:
+ * * A Zookeeper instance running locally on port 2181 (e.g. using `docker run --name bael-zookeeper -p 2181:2181 --restart always zookeeper`)
+ *
+ */
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = ZookeeperConfigApplication.class)
+public class SpringContextLiveTest {
+
+ @Test
+ public void whenSpringContextIsBootstrapped_thenNoExceptions() {
+ }
+}
\ No newline at end of file
diff --git a/spring-cloud/spring-cloud-aws/README.md b/spring-cloud/spring-cloud-aws/README.md
index 36d0c7080e..3b7b4dbcd7 100644
--- a/spring-cloud/spring-cloud-aws/README.md
+++ b/spring-cloud/spring-cloud-aws/README.md
@@ -8,7 +8,7 @@
#### Running the Integration Tests
-To run the Integration Tests, we need to have an AWS account and have API keys generated for programmatic access. Edit
+To run the Live Tests, we need to have an AWS account and have API keys generated for programmatic access. Edit
the `application.properties` file to add the following properties:
```
diff --git a/spring-cloud/spring-cloud-aws/src/test/java/com/baeldung/spring/cloud/aws/SpringContextLiveTest.java b/spring-cloud/spring-cloud-aws/src/test/java/com/baeldung/spring/cloud/aws/SpringContextLiveTest.java
new file mode 100644
index 0000000000..90ad9c518c
--- /dev/null
+++ b/spring-cloud/spring-cloud-aws/src/test/java/com/baeldung/spring/cloud/aws/SpringContextLiveTest.java
@@ -0,0 +1,22 @@
+package com.baeldung.spring.cloud.aws;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+/**
+ *
+ * To run this Live Test, we need to have an AWS account and have API keys generated for programmatic access.
+ *
+ * Check the README file in this module for more information.
+ *
+ */
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = SpringCloudAwsApplication.class)
+public class SpringContextLiveTest {
+
+ @Test
+ public void whenSpringContextIsBootstrapped_thenNoExceptions() {
+ }
+}
diff --git a/spring-cloud/spring-cloud-aws/src/test/java/com/baeldung/spring/cloud/aws/ec2/EC2MetadataIntegrationTest.java b/spring-cloud/spring-cloud-aws/src/test/java/com/baeldung/spring/cloud/aws/ec2/EC2MetadataLiveTest.java
similarity index 86%
rename from spring-cloud/spring-cloud-aws/src/test/java/com/baeldung/spring/cloud/aws/ec2/EC2MetadataIntegrationTest.java
rename to spring-cloud/spring-cloud-aws/src/test/java/com/baeldung/spring/cloud/aws/ec2/EC2MetadataLiveTest.java
index 1e75134194..853777ed25 100644
--- a/spring-cloud/spring-cloud-aws/src/test/java/com/baeldung/spring/cloud/aws/ec2/EC2MetadataIntegrationTest.java
+++ b/spring-cloud/spring-cloud-aws/src/test/java/com/baeldung/spring/cloud/aws/ec2/EC2MetadataLiveTest.java
@@ -16,12 +16,19 @@ import org.springframework.test.context.junit4.SpringRunner;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.ec2.AmazonEC2;
+/**
+ *
+ * To run this Live Test, we need to have an AWS account and have API keys generated for programmatic access.
+ *
+ * Check the README file in this module for more information.
+ *
+ */
@SpringBootTest
@RunWith(SpringRunner.class)
@TestPropertySource("classpath:application-test.properties")
-public class EC2MetadataIntegrationTest {
+public class EC2MetadataLiveTest {
- private static final Logger logger = LoggerFactory.getLogger(EC2MetadataIntegrationTest.class);
+ private static final Logger logger = LoggerFactory.getLogger(EC2MetadataLiveTest.class);
private boolean serverEc2;
diff --git a/spring-cloud/spring-cloud-aws/src/test/java/com/baeldung/spring/cloud/aws/rds/SpringCloudRDSIntegrationTest.java b/spring-cloud/spring-cloud-aws/src/test/java/com/baeldung/spring/cloud/aws/rds/SpringCloudRDSLiveTest.java
similarity index 85%
rename from spring-cloud/spring-cloud-aws/src/test/java/com/baeldung/spring/cloud/aws/rds/SpringCloudRDSIntegrationTest.java
rename to spring-cloud/spring-cloud-aws/src/test/java/com/baeldung/spring/cloud/aws/rds/SpringCloudRDSLiveTest.java
index 9e163d6dc4..e7004c6b9f 100644
--- a/spring-cloud/spring-cloud-aws/src/test/java/com/baeldung/spring/cloud/aws/rds/SpringCloudRDSIntegrationTest.java
+++ b/spring-cloud/spring-cloud-aws/src/test/java/com/baeldung/spring/cloud/aws/rds/SpringCloudRDSLiveTest.java
@@ -14,9 +14,16 @@ import java.sql.Statement;
import static org.assertj.core.api.Assertions.assertThat;
+/**
+ *
+ * To run this Live Test, we need to have an AWS account and have API keys generated for programmatic access.
+ *
+ * Check the README file in this module for more information.
+ *
+ */
@SpringBootTest
@RunWith(SpringRunner.class)
-public class SpringCloudRDSIntegrationTest {
+public class SpringCloudRDSLiveTest {
@Autowired
DataSource dataSource;
diff --git a/spring-cloud/spring-cloud-aws/src/test/java/com/baeldung/spring/cloud/aws/s3/SpringCloudS3IntegrationTest.java b/spring-cloud/spring-cloud-aws/src/test/java/com/baeldung/spring/cloud/aws/s3/SpringCloudS3LiveTest.java
similarity index 94%
rename from spring-cloud/spring-cloud-aws/src/test/java/com/baeldung/spring/cloud/aws/s3/SpringCloudS3IntegrationTest.java
rename to spring-cloud/spring-cloud-aws/src/test/java/com/baeldung/spring/cloud/aws/s3/SpringCloudS3LiveTest.java
index a866287dec..dff3a06fe0 100644
--- a/spring-cloud/spring-cloud-aws/src/test/java/com/baeldung/spring/cloud/aws/s3/SpringCloudS3IntegrationTest.java
+++ b/spring-cloud/spring-cloud-aws/src/test/java/com/baeldung/spring/cloud/aws/s3/SpringCloudS3LiveTest.java
@@ -23,10 +23,17 @@ import java.util.UUID;
import static org.assertj.core.api.Assertions.assertThat;
+/**
+ *
+ * To run this Live Test, we need to have an AWS account and have API keys generated for programmatic access.
+ *
+ * Check the README file in this module for more information.
+ *
+ */
@SpringBootTest
@RunWith(SpringRunner.class)
@TestPropertySource("classpath:application-test.properties")
-public class SpringCloudS3IntegrationTest {
+public class SpringCloudS3LiveTest {
@Autowired
private SpringCloudS3 springCloudS3;
diff --git a/spring-cloud/spring-cloud-aws/src/test/java/com/baeldung/spring/cloud/aws/sns/SpringCloudSNSIntegrationTest.java b/spring-cloud/spring-cloud-aws/src/test/java/com/baeldung/spring/cloud/aws/sns/SpringCloudSNSLiveTest.java
similarity index 88%
rename from spring-cloud/spring-cloud-aws/src/test/java/com/baeldung/spring/cloud/aws/sns/SpringCloudSNSIntegrationTest.java
rename to spring-cloud/spring-cloud-aws/src/test/java/com/baeldung/spring/cloud/aws/sns/SpringCloudSNSLiveTest.java
index e1f23d5c76..b773520089 100644
--- a/spring-cloud/spring-cloud-aws/src/test/java/com/baeldung/spring/cloud/aws/sns/SpringCloudSNSIntegrationTest.java
+++ b/spring-cloud/spring-cloud-aws/src/test/java/com/baeldung/spring/cloud/aws/sns/SpringCloudSNSLiveTest.java
@@ -16,10 +16,17 @@ import com.amazonaws.services.sns.model.CreateTopicResult;
import com.baeldung.spring.cloud.aws.SpringCloudAwsTestUtil;
import com.baeldung.spring.cloud.aws.sqs.Greeting;
+/**
+ *
+ * To run this Live Test, we need to have an AWS account and have API keys generated for programmatic access.
+ *
+ * Check the README file in this module for more information.
+ *
+ */
@SpringBootTest
@RunWith(SpringRunner.class)
@TestPropertySource("classpath:application-test.properties")
-public class SpringCloudSNSIntegrationTest {
+public class SpringCloudSNSLiveTest {
@Autowired
private SNSMessageSender snsMessageSender;
diff --git a/spring-cloud/spring-cloud-aws/src/test/java/com/baeldung/spring/cloud/aws/sqs/SpringCloudSQSIntegrationTest.java b/spring-cloud/spring-cloud-aws/src/test/java/com/baeldung/spring/cloud/aws/sqs/SpringCloudSQSLiveTest.java
similarity index 95%
rename from spring-cloud/spring-cloud-aws/src/test/java/com/baeldung/spring/cloud/aws/sqs/SpringCloudSQSIntegrationTest.java
rename to spring-cloud/spring-cloud-aws/src/test/java/com/baeldung/spring/cloud/aws/sqs/SpringCloudSQSLiveTest.java
index 76d2fd7c0d..24917e52f1 100644
--- a/spring-cloud/spring-cloud-aws/src/test/java/com/baeldung/spring/cloud/aws/sqs/SpringCloudSQSIntegrationTest.java
+++ b/spring-cloud/spring-cloud-aws/src/test/java/com/baeldung/spring/cloud/aws/sqs/SpringCloudSQSLiveTest.java
@@ -26,12 +26,19 @@ import java.util.concurrent.CountDownLatch;
import static org.assertj.core.api.Assertions.assertThat;
+/**
+ *
+ * To run this Live Test, we need to have an AWS account and have API keys generated for programmatic access.
+ *
+ * Check the README file in this module for more information.
+ *
+ */
@SpringBootTest
@RunWith(SpringRunner.class)
@TestPropertySource("classpath:application-test.properties")
-public class SpringCloudSQSIntegrationTest {
+public class SpringCloudSQSLiveTest {
- private static final Logger logger = LoggerFactory.getLogger(SpringCloudSQSIntegrationTest.class);
+ private static final Logger logger = LoggerFactory.getLogger(SpringCloudSQSLiveTest.class);
@Autowired
@Lazy
diff --git a/spring-cloud/spring-cloud-bootstrap/README.MD b/spring-cloud/spring-cloud-bootstrap/README.MD
index 5185200469..7a3a94c8e3 100644
--- a/spring-cloud/spring-cloud-bootstrap/README.MD
+++ b/spring-cloud/spring-cloud-bootstrap/README.MD
@@ -6,7 +6,7 @@
- [Spring Cloud – Adding Angular 4](http://www.baeldung.com/spring-cloud-angular)
- To run the project:
- - copy the appliction-config folder to c:\Users\{username}\ on Windows or /Users/{username}/ on *nix. Then open a git bash terminal in application-config and run:
+ - copy the appliction-config folder to c:\Users\{username}\ on Windows or /home/{username}/ on *nix. Then open a git bash terminal in application-config and run:
- git init
- git add .
- git commit -m "First commit"
diff --git a/spring-cloud/spring-cloud-bootstrap/discovery/src/test/java/org/baeldung/SpringContextIntegrationTest.java b/spring-cloud/spring-cloud-bootstrap/discovery/src/test/java/org/baeldung/SpringContextLiveTest.java
similarity index 70%
rename from spring-cloud/spring-cloud-bootstrap/discovery/src/test/java/org/baeldung/SpringContextIntegrationTest.java
rename to spring-cloud/spring-cloud-bootstrap/discovery/src/test/java/org/baeldung/SpringContextLiveTest.java
index 1e2db33395..e4e2e95e04 100644
--- a/spring-cloud/spring-cloud-bootstrap/discovery/src/test/java/org/baeldung/SpringContextIntegrationTest.java
+++ b/spring-cloud/spring-cloud-bootstrap/discovery/src/test/java/org/baeldung/SpringContextLiveTest.java
@@ -7,9 +7,15 @@ import org.springframework.test.context.junit4.SpringRunner;
import com.baeldung.spring.cloud.bootstrap.discovery.DiscoveryApplication;
+/**
+ *
+ * This Live Test requires:
+ * * A Redis instance running in port 6379 (e.g. using `docker run --name some-redis -p 6379:6379 -d redis`)
+ *
+ */
@RunWith(SpringRunner.class)
@SpringBootTest(classes = DiscoveryApplication.class)
-public class SpringContextIntegrationTest {
+public class SpringContextLiveTest {
@Test
public void whenSpringContextIsBootstrapped_thenNoExceptions() {
diff --git a/spring-cloud/spring-cloud-bootstrap/gateway/pom.xml b/spring-cloud/spring-cloud-bootstrap/gateway/pom.xml
index 2efa926e3a..4f9c60a26a 100644
--- a/spring-cloud/spring-cloud-bootstrap/gateway/pom.xml
+++ b/spring-cloud/spring-cloud-bootstrap/gateway/pom.xml
@@ -98,6 +98,6 @@
- Brixton.SR7
+ Dalston.RELEASE
\ No newline at end of file
diff --git a/spring-cloud/spring-cloud-bootstrap/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/GatewayApplication.java b/spring-cloud/spring-cloud-bootstrap/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/GatewayApplication.java
index 10ed66bfd4..79785a3f20 100644
--- a/spring-cloud/spring-cloud-bootstrap/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/GatewayApplication.java
+++ b/spring-cloud/spring-cloud-bootstrap/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/GatewayApplication.java
@@ -71,7 +71,7 @@ public class GatewayApplication {
InstanceInfo instance = eurekaClient.getNextServerFromEureka("zipkin", false);
if (!(baseUrl != null && instance.getHomePageUrl().equals(baseUrl))) {
baseUrl = instance.getHomePageUrl();
- delegate = new HttpZipkinSpanReporter(baseUrl, zipkinProperties.getFlushInterval(), zipkinProperties.getCompression().isEnabled(), spanMetricReporter);
+ delegate = new HttpZipkinSpanReporter(new RestTemplate(), baseUrl, zipkinProperties.getFlushInterval(), spanMetricReporter);
if (!span.name.matches(skipPattern)) delegate.report(span);
}
if (!span.name.matches(skipPattern)) delegate.report(span);
diff --git a/spring-cloud/spring-cloud-bootstrap/gateway/src/test/java/org/baeldung/SpringContextIntegrationTest.java b/spring-cloud/spring-cloud-bootstrap/gateway/src/test/java/org/baeldung/SpringContextLiveTest.java
similarity index 70%
rename from spring-cloud/spring-cloud-bootstrap/gateway/src/test/java/org/baeldung/SpringContextIntegrationTest.java
rename to spring-cloud/spring-cloud-bootstrap/gateway/src/test/java/org/baeldung/SpringContextLiveTest.java
index ef3bb5ef95..e0342cf82c 100644
--- a/spring-cloud/spring-cloud-bootstrap/gateway/src/test/java/org/baeldung/SpringContextIntegrationTest.java
+++ b/spring-cloud/spring-cloud-bootstrap/gateway/src/test/java/org/baeldung/SpringContextLiveTest.java
@@ -7,9 +7,15 @@ import org.springframework.test.context.junit4.SpringRunner;
import com.baeldung.spring.cloud.bootstrap.gateway.GatewayApplication;
+/**
+ *
+ * This Live Test requires:
+ * * A Redis instance running in port 6379 (e.g. using `docker run --name some-redis -p 6379:6379 -d redis`)
+ *
+ */
@RunWith(SpringRunner.class)
@SpringBootTest(classes = GatewayApplication.class)
-public class SpringContextIntegrationTest {
+public class SpringContextLiveTest {
@Test
public void whenSpringContextIsBootstrapped_thenNoExceptions() {
diff --git a/spring-cloud/spring-cloud-bootstrap/gateway/src/test/resources/bootstrap.properties b/spring-cloud/spring-cloud-bootstrap/gateway/src/test/resources/bootstrap.properties
new file mode 100644
index 0000000000..c76df21ff1
--- /dev/null
+++ b/spring-cloud/spring-cloud-bootstrap/gateway/src/test/resources/bootstrap.properties
@@ -0,0 +1,2 @@
+# This property would be provided by the config service in a real-case scenario
+spring.sleuth.web.skipPattern=(^cleanup.|.+favicon.)
\ No newline at end of file
diff --git a/spring-cloud/spring-cloud-bootstrap/svc-book/pom.xml b/spring-cloud/spring-cloud-bootstrap/svc-book/pom.xml
index eb855a91e3..a88b77dda0 100644
--- a/spring-cloud/spring-cloud-bootstrap/svc-book/pom.xml
+++ b/spring-cloud/spring-cloud-bootstrap/svc-book/pom.xml
@@ -72,7 +72,7 @@
- Brixton.SR7
+ Dalston.RELEASE
\ No newline at end of file
diff --git a/spring-cloud/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/BookServiceApplication.java b/spring-cloud/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/BookServiceApplication.java
index 3d55a59dbc..91fd23e32d 100644
--- a/spring-cloud/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/BookServiceApplication.java
+++ b/spring-cloud/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/BookServiceApplication.java
@@ -12,6 +12,8 @@ import org.springframework.cloud.sleuth.zipkin.HttpZipkinSpanReporter;
import org.springframework.cloud.sleuth.zipkin.ZipkinProperties;
import org.springframework.cloud.sleuth.zipkin.ZipkinSpanReporter;
import org.springframework.context.annotation.Bean;
+import org.springframework.web.client.RestTemplate;
+
import zipkin.Span;
@SpringBootApplication
@@ -42,7 +44,7 @@ public class BookServiceApplication {
InstanceInfo instance = eurekaClient.getNextServerFromEureka("zipkin", false);
if (!(baseUrl != null && instance.getHomePageUrl().equals(baseUrl))) {
baseUrl = instance.getHomePageUrl();
- delegate = new HttpZipkinSpanReporter(baseUrl, zipkinProperties.getFlushInterval(), zipkinProperties.getCompression().isEnabled(), spanMetricReporter);
+ delegate = new HttpZipkinSpanReporter(new RestTemplate(), baseUrl, zipkinProperties.getFlushInterval(), spanMetricReporter);
if (!span.name.matches(skipPattern)) delegate.report(span);
}
}
diff --git a/spring-cloud/spring-cloud-bootstrap/svc-book/src/test/java/org/baeldung/SpringContextIntegrationTest.java b/spring-cloud/spring-cloud-bootstrap/svc-book/src/test/java/org/baeldung/SpringContextLiveTest.java
similarity index 70%
rename from spring-cloud/spring-cloud-bootstrap/svc-book/src/test/java/org/baeldung/SpringContextIntegrationTest.java
rename to spring-cloud/spring-cloud-bootstrap/svc-book/src/test/java/org/baeldung/SpringContextLiveTest.java
index 0ffc2410e3..2e437aa3f7 100644
--- a/spring-cloud/spring-cloud-bootstrap/svc-book/src/test/java/org/baeldung/SpringContextIntegrationTest.java
+++ b/spring-cloud/spring-cloud-bootstrap/svc-book/src/test/java/org/baeldung/SpringContextLiveTest.java
@@ -7,9 +7,15 @@ import org.springframework.test.context.junit4.SpringRunner;
import com.baeldung.spring.cloud.bootstrap.svcbook.BookServiceApplication;
+/**
+ *
+ * This Live Test requires:
+ * * A Redis instance running in port 6379 (e.g. using `docker run --name some-redis -p 6379:6379 -d redis`)
+ *
+ */
@RunWith(SpringRunner.class)
@SpringBootTest(classes = BookServiceApplication.class)
-public class SpringContextIntegrationTest {
+public class SpringContextLiveTest {
@Test
public void whenSpringContextIsBootstrapped_thenNoExceptions() {
diff --git a/spring-cloud/spring-cloud-bootstrap/svc-book/src/test/resources/bootstrap.properties b/spring-cloud/spring-cloud-bootstrap/svc-book/src/test/resources/bootstrap.properties
new file mode 100644
index 0000000000..c76df21ff1
--- /dev/null
+++ b/spring-cloud/spring-cloud-bootstrap/svc-book/src/test/resources/bootstrap.properties
@@ -0,0 +1,2 @@
+# This property would be provided by the config service in a real-case scenario
+spring.sleuth.web.skipPattern=(^cleanup.|.+favicon.)
\ No newline at end of file
diff --git a/spring-cloud/spring-cloud-bootstrap/svc-rating/pom.xml b/spring-cloud/spring-cloud-bootstrap/svc-rating/pom.xml
index 7c1e93bad1..f0b19922d8 100644
--- a/spring-cloud/spring-cloud-bootstrap/svc-rating/pom.xml
+++ b/spring-cloud/spring-cloud-bootstrap/svc-rating/pom.xml
@@ -81,7 +81,7 @@
- Brixton.SR7
+ Dalston.RELEASE
\ No newline at end of file
diff --git a/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/RatingServiceApplication.java b/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/RatingServiceApplication.java
index 31ca69c139..8dacbaa79d 100644
--- a/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/RatingServiceApplication.java
+++ b/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/RatingServiceApplication.java
@@ -16,6 +16,7 @@ import org.springframework.context.annotation.Primary;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.transaction.annotation.EnableTransactionManagement;
+import org.springframework.web.client.RestTemplate;
import com.netflix.appinfo.InstanceInfo;
import com.netflix.discovery.EurekaClient;
@@ -52,7 +53,7 @@ public class RatingServiceApplication {
InstanceInfo instance = eurekaClient.getNextServerFromEureka("zipkin", false);
if (!(baseUrl != null && instance.getHomePageUrl().equals(baseUrl))) {
baseUrl = instance.getHomePageUrl();
- delegate = new HttpZipkinSpanReporter(baseUrl, zipkinProperties.getFlushInterval(), zipkinProperties.getCompression().isEnabled(), spanMetricReporter);
+ delegate = new HttpZipkinSpanReporter(new RestTemplate(), baseUrl, zipkinProperties.getFlushInterval(), spanMetricReporter);
if (!span.name.matches(skipPattern)) delegate.report(span);
}
if (!span.name.matches(skipPattern)) delegate.report(span);
diff --git a/spring-cloud/spring-cloud-bootstrap/svc-rating/src/test/java/org/baeldung/SpringContextIntegrationTest.java b/spring-cloud/spring-cloud-bootstrap/svc-rating/src/test/java/org/baeldung/SpringContextLiveTest.java
similarity index 70%
rename from spring-cloud/spring-cloud-bootstrap/svc-rating/src/test/java/org/baeldung/SpringContextIntegrationTest.java
rename to spring-cloud/spring-cloud-bootstrap/svc-rating/src/test/java/org/baeldung/SpringContextLiveTest.java
index 3589666f17..e2921f0308 100644
--- a/spring-cloud/spring-cloud-bootstrap/svc-rating/src/test/java/org/baeldung/SpringContextIntegrationTest.java
+++ b/spring-cloud/spring-cloud-bootstrap/svc-rating/src/test/java/org/baeldung/SpringContextLiveTest.java
@@ -7,9 +7,16 @@ import org.springframework.test.context.junit4.SpringRunner;
import com.baeldung.spring.cloud.bootstrap.svcrating.RatingServiceApplication;
+
+/**
+ *
+ * This Live Test requires:
+ * * A Redis instance running in port 6379 (e.g. using `docker run --name some-redis -p 6379:6379 -d redis`)
+ *
+ */
@RunWith(SpringRunner.class)
@SpringBootTest(classes = RatingServiceApplication.class)
-public class SpringContextIntegrationTest {
+public class SpringContextLiveTest {
@Test
public void whenSpringContextIsBootstrapped_thenNoExceptions() {
diff --git a/spring-cloud/spring-cloud-bootstrap/svc-rating/src/test/resources/bootstrap.properties b/spring-cloud/spring-cloud-bootstrap/svc-rating/src/test/resources/bootstrap.properties
new file mode 100644
index 0000000000..c76df21ff1
--- /dev/null
+++ b/spring-cloud/spring-cloud-bootstrap/svc-rating/src/test/resources/bootstrap.properties
@@ -0,0 +1,2 @@
+# This property would be provided by the config service in a real-case scenario
+spring.sleuth.web.skipPattern=(^cleanup.|.+favicon.)
\ No newline at end of file
diff --git a/spring-cloud/spring-cloud-functions/src/test/java/com/baeldung/spring/cloudfunction/aws/SpringContextIntegrationTest.java b/spring-cloud/spring-cloud-functions/src/test/java/com/baeldung/spring/cloudfunction/aws/SpringContextIntegrationTest.java
new file mode 100644
index 0000000000..beee84246d
--- /dev/null
+++ b/spring-cloud/spring-cloud-functions/src/test/java/com/baeldung/spring/cloudfunction/aws/SpringContextIntegrationTest.java
@@ -0,0 +1,15 @@
+package com.baeldung.spring.cloudfunction.aws;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = CloudFunctionAwsApplication.class)
+public class SpringContextIntegrationTest {
+
+ @Test
+ public void whenSpringContextIsBootstrapped_thenNoExceptions() {
+ }
+}
\ No newline at end of file
diff --git a/spring-cloud/spring-cloud-kubernetes/travel-agency-service/src/test/java/com/baeldung/spring/cloud/kubernetes/travelagency/SpringContextIntegrationTest.java b/spring-cloud/spring-cloud-kubernetes/travel-agency-service/src/test/java/com/baeldung/spring/cloud/kubernetes/travelagency/SpringContextIntegrationTest.java
new file mode 100644
index 0000000000..2f901d39f6
--- /dev/null
+++ b/spring-cloud/spring-cloud-kubernetes/travel-agency-service/src/test/java/com/baeldung/spring/cloud/kubernetes/travelagency/SpringContextIntegrationTest.java
@@ -0,0 +1,16 @@
+package com.baeldung.spring.cloud.kubernetes.travelagency;
+
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = Application.class)
+public class SpringContextIntegrationTest {
+
+ @Test
+ public void whenSpringContextIsBootstrapped_thenNoExceptions() {
+ }
+}
\ No newline at end of file
diff --git a/spring-cloud/spring-cloud-aws/src/test/java/com/baeldung/spring/cloud/aws/SpringContextIntegrationTest.java b/spring-cloud/spring-cloud-openfeign/src/test/java/com/baeldung/cloud/openfeign/SpringContextIntegrationTest.java
similarity index 77%
rename from spring-cloud/spring-cloud-aws/src/test/java/com/baeldung/spring/cloud/aws/SpringContextIntegrationTest.java
rename to spring-cloud/spring-cloud-openfeign/src/test/java/com/baeldung/cloud/openfeign/SpringContextIntegrationTest.java
index e0026ce441..77d294093c 100644
--- a/spring-cloud/spring-cloud-aws/src/test/java/com/baeldung/spring/cloud/aws/SpringContextIntegrationTest.java
+++ b/spring-cloud/spring-cloud-openfeign/src/test/java/com/baeldung/cloud/openfeign/SpringContextIntegrationTest.java
@@ -1,4 +1,5 @@
-package com.baeldung.spring.cloud.aws;
+package com.baeldung.cloud.openfeign;
+
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -6,10 +7,10 @@ import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
-@SpringBootTest(classes = SpringCloudAwsApplication.class)
+@SpringBootTest(classes = ExampleApplication.class)
public class SpringContextIntegrationTest {
-
+
@Test
public void whenSpringContextIsBootstrapped_thenNoExceptions() {
}
-}
+}
\ No newline at end of file
diff --git a/spring-cloud/spring-cloud-task/springcloudtaskbatch/src/main/resources/application.yml b/spring-cloud/spring-cloud-task/springcloudtaskbatch/src/main/resources/application.yml
index 1187c12fe7..71275793ec 100644
--- a/spring-cloud/spring-cloud-task/springcloudtaskbatch/src/main/resources/application.yml
+++ b/spring-cloud/spring-cloud-task/springcloudtaskbatch/src/main/resources/application.yml
@@ -3,11 +3,11 @@ logging:
org:
springframework:
cloud:
- task=DEBUG
+ task: DEBUG
spring:
application:
- name=helloWorld
+ name: helloWorld
datasource:
url: jdbc:mysql://localhost:3306/springcloud?useSSL=false
username: root
diff --git a/spring-cloud/spring-cloud-task/springcloudtaskbatch/src/test/java/org/baeldung/SpringContextIntegrationTest.java b/spring-cloud/spring-cloud-task/springcloudtaskbatch/src/test/java/org/baeldung/SpringContextIntegrationTest.java
deleted file mode 100644
index 4b5aff2db8..0000000000
--- a/spring-cloud/spring-cloud-task/springcloudtaskbatch/src/test/java/org/baeldung/SpringContextIntegrationTest.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package org.baeldung;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.springframework.test.context.ContextConfiguration;
-import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
-
-import com.baeldung.task.JobConfiguration;
-
-@RunWith(SpringJUnit4ClassRunner.class)
-@ContextConfiguration(classes = JobConfiguration.class)
-public class SpringContextIntegrationTest {
-
- @Test
- public void whenSpringContextIsBootstrapped_thenNoExceptions() {
- }
-}
diff --git a/spring-cloud/spring-cloud-task/springcloudtaskbatch/src/test/java/org/baeldung/SpringContextLiveTest.java b/spring-cloud/spring-cloud-task/springcloudtaskbatch/src/test/java/org/baeldung/SpringContextLiveTest.java
new file mode 100644
index 0000000000..ddbcbf65ea
--- /dev/null
+++ b/spring-cloud/spring-cloud-task/springcloudtaskbatch/src/test/java/org/baeldung/SpringContextLiveTest.java
@@ -0,0 +1,29 @@
+package org.baeldung;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.test.context.ConfigFileApplicationContextInitializer;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+import com.baeldung.task.JobConfiguration;
+import com.baeldung.task.TaskDemo;
+
+/**
+ * This Live Test requires:
+ * * a MySql instance running, that allows a root user with no password, and with a database named
+ *
+ * (e.g. with the following command `docker run -p 3306:3306 --name bael-mysql -e MYSQL_ALLOW_EMPTY_PASSWORD=true -e MYSQL_DATABASE=springcloud mysql:latest`)
+ *
+ */
+@RunWith(SpringJUnit4ClassRunner.class)
+@SpringBootApplication
+@ContextConfiguration(classes = { JobConfiguration.class, TaskDemo.class }, initializers = {
+ ConfigFileApplicationContextInitializer.class })
+public class SpringContextLiveTest {
+
+ @Test
+ public void whenSpringContextIsBootstrapped_thenNoExceptions() {
+ }
+}
diff --git a/spring-cloud/spring-cloud-vault/src/test/java/org/baeldung/spring/cloud/vaultsample/SpringContextIntegrationTest.java b/spring-cloud/spring-cloud-vault/src/test/java/org/baeldung/spring/cloud/vaultsample/SpringContextIntegrationTest.java
new file mode 100644
index 0000000000..e1eb2f8e24
--- /dev/null
+++ b/spring-cloud/spring-cloud-vault/src/test/java/org/baeldung/spring/cloud/vaultsample/SpringContextIntegrationTest.java
@@ -0,0 +1,15 @@
+package org.baeldung.spring.cloud.vaultsample;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = VaultSampleApplication.class)
+public class SpringContextIntegrationTest {
+
+ @Test
+ public void whenSpringContextIsBootstrapped_thenNoExceptions() {
+ }
+}
\ No newline at end of file
diff --git a/spring-cloud/spring-cloud-zookeeper/HelloWorld/pom.xml b/spring-cloud/spring-cloud-zookeeper/HelloWorld/pom.xml
index 262b059544..0da0f7503e 100644
--- a/spring-cloud/spring-cloud-zookeeper/HelloWorld/pom.xml
+++ b/spring-cloud/spring-cloud-zookeeper/HelloWorld/pom.xml
@@ -34,6 +34,12 @@
+
+ org.springframework.boot
+ spring-boot-starter-test
+ ${spring-boot.version}
+ test
+
diff --git a/spring-cloud/spring-cloud-zookeeper/HelloWorld/src/test/java/com/baeldung/spring/cloud/helloworld/SpringContextIntegrationTest.java b/spring-cloud/spring-cloud-zookeeper/HelloWorld/src/test/java/com/baeldung/spring/cloud/helloworld/SpringContextIntegrationTest.java
new file mode 100644
index 0000000000..2770649aa3
--- /dev/null
+++ b/spring-cloud/spring-cloud-zookeeper/HelloWorld/src/test/java/com/baeldung/spring/cloud/helloworld/SpringContextIntegrationTest.java
@@ -0,0 +1,16 @@
+package com.baeldung.spring.cloud.helloworld;
+
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = HelloWorldApplication.class)
+public class SpringContextIntegrationTest {
+
+ @Test
+ public void whenSpringContextIsBootstrapped_thenNoExceptions() {
+ }
+}
\ No newline at end of file
diff --git a/spring-cloud/spring-cloud-zuul/src/test/java/com/baeldung/spring/cloud/zuulratelimitdemo/controller/SpringContextIntegrationTest.java b/spring-cloud/spring-cloud-zuul/src/test/java/com/baeldung/spring/cloud/zuulratelimitdemo/controller/SpringContextIntegrationTest.java
new file mode 100644
index 0000000000..dbcdbdd434
--- /dev/null
+++ b/spring-cloud/spring-cloud-zuul/src/test/java/com/baeldung/spring/cloud/zuulratelimitdemo/controller/SpringContextIntegrationTest.java
@@ -0,0 +1,17 @@
+package com.baeldung.spring.cloud.zuulratelimitdemo.controller;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import com.baeldung.spring.cloud.zuulratelimitdemo.ZuulRatelimitDemoApplication;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = ZuulRatelimitDemoApplication.class)
+public class SpringContextIntegrationTest {
+
+ @Test
+ public void whenSpringContextIsBootstrapped_thenNoExceptions() {
+ }
+}
\ No newline at end of file
diff --git a/spring-data-rest/README.md b/spring-data-rest/README.md
index 1624a3abfd..abbacb69cc 100644
--- a/spring-data-rest/README.md
+++ b/spring-data-rest/README.md
@@ -22,3 +22,4 @@ To view the running application, visit [http://localhost:8080](http://localhost:
- [Spring Data REST Events with @RepositoryEventHandler](http://www.baeldung.com/spring-data-rest-events)
- [Customizing HTTP Endpoints in Spring Data REST](https://www.baeldung.com/spring-data-rest-customize-http-endpoints)
- [Spring Boot with SQLite](https://www.baeldung.com/spring-boot-sqlite)
+- [Spring Data Web Support](https://www.baeldung.com/spring-data-web-support)
diff --git a/spring-resttemplate/src/main/java/org/baeldung/resttemplate/web/controller/PersonAPI.java b/spring-resttemplate/src/main/java/org/baeldung/resttemplate/web/controller/PersonAPI.java
new file mode 100644
index 0000000000..b1b56ec2f3
--- /dev/null
+++ b/spring-resttemplate/src/main/java/org/baeldung/resttemplate/web/controller/PersonAPI.java
@@ -0,0 +1,38 @@
+package org.baeldung.resttemplate.web.controller;
+
+import javax.servlet.http.HttpServletResponse;
+
+import org.baeldung.resttemplate.web.dto.Person;
+import org.baeldung.resttemplate.web.service.PersonService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.servlet.support.ServletUriComponentsBuilder;
+
+@RestController
+public class PersonAPI {
+
+ @Autowired
+ private PersonService personService;
+
+ @GetMapping("/")
+ public String home() {
+ return "Spring boot is working!";
+ }
+
+ @PostMapping(value = "/createPerson", consumes = "application/json", produces = "application/json")
+ public Person createPerson(@RequestBody Person person) {
+ return personService.saveUpdatePerson(person);
+ }
+
+ @PostMapping(value = "/updatePerson", consumes = "application/json", produces = "application/json")
+ public Person updatePerson(@RequestBody Person person, HttpServletResponse response) {
+ response.setHeader("Location", ServletUriComponentsBuilder.fromCurrentContextPath()
+ .path("/findPerson/" + person.getId())
+ .toUriString());
+ return personService.saveUpdatePerson(person);
+ }
+
+}
\ No newline at end of file
diff --git a/spring-resttemplate/src/main/java/org/baeldung/resttemplate/web/dto/Person.java b/spring-resttemplate/src/main/java/org/baeldung/resttemplate/web/dto/Person.java
new file mode 100644
index 0000000000..4b7679638f
--- /dev/null
+++ b/spring-resttemplate/src/main/java/org/baeldung/resttemplate/web/dto/Person.java
@@ -0,0 +1,32 @@
+package org.baeldung.resttemplate.web.dto;
+
+public class Person {
+ private Integer id;
+ private String name;
+
+ public Person() {
+
+ }
+
+ public Person(Integer id, String name) {
+ this.id = id;
+ this.name = name;
+ }
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+}
diff --git a/spring-resttemplate/src/main/java/org/baeldung/resttemplate/web/service/PersonService.java b/spring-resttemplate/src/main/java/org/baeldung/resttemplate/web/service/PersonService.java
new file mode 100644
index 0000000000..c5ad39e101
--- /dev/null
+++ b/spring-resttemplate/src/main/java/org/baeldung/resttemplate/web/service/PersonService.java
@@ -0,0 +1,10 @@
+package org.baeldung.resttemplate.web.service;
+
+import org.baeldung.resttemplate.web.dto.Person;
+
+public interface PersonService {
+
+ public Person saveUpdatePerson(Person person);
+
+ public Person findPersonById(Integer id);
+}
\ No newline at end of file
diff --git a/spring-resttemplate/src/main/java/org/baeldung/resttemplate/web/service/PersonServiceImpl.java b/spring-resttemplate/src/main/java/org/baeldung/resttemplate/web/service/PersonServiceImpl.java
new file mode 100644
index 0000000000..658e0fade0
--- /dev/null
+++ b/spring-resttemplate/src/main/java/org/baeldung/resttemplate/web/service/PersonServiceImpl.java
@@ -0,0 +1,19 @@
+package org.baeldung.resttemplate.web.service;
+
+import org.baeldung.resttemplate.web.dto.Person;
+import org.springframework.stereotype.Component;
+
+@Component
+public class PersonServiceImpl implements PersonService {
+
+ @Override
+ public Person saveUpdatePerson(Person person) {
+ return person;
+ }
+
+ @Override
+ public Person findPersonById(Integer id) {
+ return new Person(id, "John");
+ }
+
+}
diff --git a/spring-resttemplate/src/test/java/org/baeldung/resttemplate/PersonAPILiveTest.java b/spring-resttemplate/src/test/java/org/baeldung/resttemplate/PersonAPILiveTest.java
new file mode 100644
index 0000000000..de18f6db09
--- /dev/null
+++ b/spring-resttemplate/src/test/java/org/baeldung/resttemplate/PersonAPILiveTest.java
@@ -0,0 +1,96 @@
+package org.baeldung.resttemplate;
+
+import static org.junit.Assert.assertNotNull;
+
+import java.io.IOException;
+import java.net.URI;
+
+import org.baeldung.resttemplate.web.dto.Person;
+import org.json.JSONException;
+import org.json.JSONObject;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.web.client.RestTemplate;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = RestTemplateConfigurationApplication.class)
+public class PersonAPILiveTest {
+
+ private static String createPersonUrl;
+ private static String updatePersonUrl;
+
+ private static RestTemplate restTemplate;
+
+ private static HttpHeaders headers;
+
+ private final ObjectMapper objectMapper = new ObjectMapper();
+
+ private static JSONObject personJsonObject;
+
+ @BeforeClass
+ public static void runBeforeAllTestMethods() throws JSONException {
+ createPersonUrl = "http://localhost:8082/spring-rest/createPerson";
+ updatePersonUrl = "http://localhost:8082/spring-rest/updatePerson";
+
+ restTemplate = new RestTemplate();
+
+ headers = new HttpHeaders();
+ headers.setContentType(MediaType.APPLICATION_JSON);
+ personJsonObject = new JSONObject();
+ personJsonObject.put("id", 1);
+ personJsonObject.put("name", "John");
+ }
+
+ @Test
+ public void givenDataIsJson_whenDataIsPostedByPostForObject_thenResponseBodyIsNotNull() throws IOException {
+ HttpEntity request = new HttpEntity(personJsonObject.toString(), headers);
+ String personResultAsJsonStr = restTemplate.postForObject(createPersonUrl, request, String.class);
+ JsonNode root = objectMapper.readTree(personResultAsJsonStr);
+
+ Person person = restTemplate.postForObject(createPersonUrl, request, Person.class);
+
+ assertNotNull(personResultAsJsonStr);
+ assertNotNull(root);
+ assertNotNull(root.path("name")
+ .asText());
+
+ assertNotNull(person);
+ assertNotNull(person.getName());
+ }
+
+ @Test
+ public void givenDataIsJson_whenDataIsPostedByPostForEntity_thenResponseBodyIsNotNull() throws IOException {
+ HttpEntity request = new HttpEntity(personJsonObject.toString(), headers);
+ ResponseEntity responseEntityStr = restTemplate.postForEntity(createPersonUrl, request, String.class);
+ JsonNode root = objectMapper.readTree(responseEntityStr.getBody());
+
+ ResponseEntity responseEntityPerson = restTemplate.postForEntity(createPersonUrl, request, Person.class);
+
+ assertNotNull(responseEntityStr.getBody());
+ assertNotNull(root.path("name")
+ .asText());
+
+ assertNotNull(responseEntityPerson.getBody());
+ assertNotNull(responseEntityPerson.getBody()
+ .getName());
+ }
+
+ @Test
+ public void givenDataIsJson_whenDataIsPostedByPostForLocation_thenResponseBodyIsTheLocationHeader() throws JsonProcessingException {
+ HttpEntity request = new HttpEntity(personJsonObject.toString(), headers);
+ URI locationHeader = restTemplate.postForLocation(updatePersonUrl, request);
+
+ assertNotNull(locationHeader);
+ }
+}
\ No newline at end of file
diff --git a/spring-security-rest-basic-auth/README.md b/spring-security-rest-basic-auth/README.md
index 30da3afbcf..0a48a747c2 100644
--- a/spring-security-rest-basic-auth/README.md
+++ b/spring-security-rest-basic-auth/README.md
@@ -8,6 +8,5 @@ The "Learn Spring Security" Classes: http://github.learnspringsecurity.com
### Relevant Articles:
- [Basic Authentication with the RestTemplate](http://www.baeldung.com/how-to-use-resttemplate-with-basic-authentication-in-spring)
- [HttpClient Timeout](http://www.baeldung.com/httpclient-timeout)
-- [HttpClient with SSL](http://www.baeldung.com/httpclient-ssl)
- [A Custom Filter in the Spring Security Filter Chain](http://www.baeldung.com/spring-security-custom-filter)
- [Spring Security Basic Authentication](http://www.baeldung.com/spring-security-basic-authentication)
diff --git a/spring-security-rest-basic-auth/pom.xml b/spring-security-rest-basic-auth/pom.xml
index ca5c4c38e6..3c7f8eaa2b 100644
--- a/spring-security-rest-basic-auth/pom.xml
+++ b/spring-security-rest-basic-auth/pom.xml
@@ -272,8 +272,8 @@
- 4.4.5
- 4.5.3
+ 4.4.11
+ 4.5.8
1.2
diff --git a/spring-security-rest/README.md b/spring-security-rest/README.md
index f71eead9ae..f450a514b2 100644
--- a/spring-security-rest/README.md
+++ b/spring-security-rest/README.md
@@ -11,7 +11,6 @@ The "Learn Spring Security" Classes: http://github.learnspringsecurity.com
- [Spring REST Service Security](http://www.baeldung.com/2011/10/31/securing-a-restful-web-service-with-spring-security-3-1-part-3/)
- [Setting Up Swagger 2 with a Spring REST API](http://www.baeldung.com/swagger-2-documentation-for-spring-rest-api)
- [Custom Error Message Handling for REST API](http://www.baeldung.com/global-error-handler-in-a-spring-rest-api)
-- [An Intro to Spring HATEOAS](http://www.baeldung.com/spring-hateoas-tutorial)
- [Spring Security Context Propagation with @Async](http://www.baeldung.com/spring-security-async-principal-propagation)
- [Servlet 3 Async Support with Spring MVC and Spring Security](http://www.baeldung.com/spring-mvc-async-security)
- [Intro to Spring Security Expressions](http://www.baeldung.com/spring-security-expressions)
diff --git a/spring-security-rest/pom.xml b/spring-security-rest/pom.xml
index 24f1c5807a..b6039ce9d3 100644
--- a/spring-security-rest/pom.xml
+++ b/spring-security-rest/pom.xml
@@ -84,13 +84,6 @@
${spring.version}
-
-
- org.springframework.hateoas
- spring-hateoas
- ${org.springframework.hateoas.version}
-
-
@@ -273,9 +266,6 @@
-
- 0.25.0.RELEASE
-
3.1.0
1.1.0.Final
diff --git a/testing-modules/groovy-spock/README.md b/testing-modules/groovy-spock/README.md
index a98df27172..e61c56d470 100644
--- a/testing-modules/groovy-spock/README.md
+++ b/testing-modules/groovy-spock/README.md
@@ -2,3 +2,4 @@
- [Introduction to Testing with Spock and Groovy](http://www.baeldung.com/groovy-spock)
- [Difference Between Stub, Mock, and Spy in the Spock Framework](https://www.baeldung.com/spock-stub-mock-spy)
+- [Guide to Spock Extensions](https://www.baeldung.com/spock-extensions)
diff --git a/vaadin/pom.xml b/vaadin/pom.xml
index 145a6af293..ec69e240e2 100644
--- a/vaadin/pom.xml
+++ b/vaadin/pom.xml
@@ -70,17 +70,6 @@
com.vaadin
vaadin-maven-plugin
${vaadin.plugin.version}
-
-
-
- update-theme
- update-widgetset
- compile
-
- compile-theme
-
-
-
org.apache.maven.plugins