Merge branch 'master' of github.com:eugenp/tutorials into BAEL-3886
This commit is contained in:
commit
660f24b777
|
@ -5,7 +5,7 @@ spring.jpa.hibernate.ddl-auto=create
|
||||||
logging.file=azure.log
|
logging.file=azure.log
|
||||||
logging.level.root=info
|
logging.level.root=info
|
||||||
|
|
||||||
spring.datasource.url=jdbc:h2:file:~/test
|
spring.datasource.url=jdbc:h2:mem:azure-test-db
|
||||||
spring.datasource.username=sa
|
spring.datasource.username=sa
|
||||||
spring.datasource.password=
|
spring.datasource.password=
|
||||||
|
|
||||||
|
|
|
@ -15,7 +15,7 @@ import java.util.logging.Logger;
|
||||||
|
|
||||||
import static org.junit.Assert.fail;
|
import static org.junit.Assert.fail;
|
||||||
|
|
||||||
public class PrimeNumbersUnitTest {
|
public class PrimeNumbersUnitManualTest {
|
||||||
|
|
||||||
private static Logger logger = Logger.getAnonymousLogger();
|
private static Logger logger = Logger.getAnonymousLogger();
|
||||||
|
|
|
@ -0,0 +1,17 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<artifactId>core-java-security-2</artifactId>
|
||||||
|
<version>0.1.0-SNAPSHOT</version>
|
||||||
|
<name>core-java-security-2</name>
|
||||||
|
<packaging>jar</packaging>
|
||||||
|
|
||||||
|
<parent>
|
||||||
|
<groupId>com.baeldung</groupId>
|
||||||
|
<artifactId>parent-java</artifactId>
|
||||||
|
<version>0.0.1-SNAPSHOT</version>
|
||||||
|
<relativePath>../../parent-java</relativePath>
|
||||||
|
</parent>
|
||||||
|
|
||||||
|
</project>
|
|
@ -0,0 +1,24 @@
|
||||||
|
package com.baeldung.jaas;
|
||||||
|
|
||||||
|
import javax.security.auth.callback.*;
|
||||||
|
import java.io.Console;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
public class ConsoleCallbackHandler implements CallbackHandler {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {
|
||||||
|
Console console = System.console();
|
||||||
|
for (Callback callback : callbacks) {
|
||||||
|
if (callback instanceof NameCallback) {
|
||||||
|
NameCallback nameCallback = (NameCallback) callback;
|
||||||
|
nameCallback.setName(console.readLine(nameCallback.getPrompt()));
|
||||||
|
} else if (callback instanceof PasswordCallback) {
|
||||||
|
PasswordCallback passwordCallback = (PasswordCallback) callback;
|
||||||
|
passwordCallback.setPassword(console.readPassword(passwordCallback.getPrompt()));
|
||||||
|
} else {
|
||||||
|
throw new UnsupportedCallbackException(callback);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,13 @@
|
||||||
|
package com.baeldung.jaas;
|
||||||
|
|
||||||
|
import javax.security.auth.Subject;
|
||||||
|
import javax.security.auth.login.LoginException;
|
||||||
|
|
||||||
|
public class JaasAuthentication {
|
||||||
|
|
||||||
|
public static void main(String[] args) throws LoginException {
|
||||||
|
LoginService loginService = new LoginService();
|
||||||
|
Subject subject = loginService.login();
|
||||||
|
System.out.println(subject.getPrincipals().iterator().next() + " sucessfully logeed in");
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,17 @@
|
||||||
|
package com.baeldung.jaas;
|
||||||
|
|
||||||
|
import javax.security.auth.Subject;
|
||||||
|
import javax.security.auth.login.LoginException;
|
||||||
|
import java.security.PrivilegedAction;
|
||||||
|
|
||||||
|
public class JaasAuthorization {
|
||||||
|
|
||||||
|
public static void main(String[] args) throws LoginException {
|
||||||
|
|
||||||
|
LoginService loginService = new LoginService();
|
||||||
|
Subject subject = loginService.login();
|
||||||
|
|
||||||
|
PrivilegedAction privilegedAction = new ResourceAction();
|
||||||
|
Subject.doAsPrivileged(subject, privilegedAction, null);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,14 @@
|
||||||
|
package com.baeldung.jaas;
|
||||||
|
|
||||||
|
import javax.security.auth.Subject;
|
||||||
|
import javax.security.auth.login.LoginContext;
|
||||||
|
import javax.security.auth.login.LoginException;
|
||||||
|
|
||||||
|
public class LoginService {
|
||||||
|
|
||||||
|
public Subject login() throws LoginException {
|
||||||
|
LoginContext loginContext = new LoginContext("jaasApplication", new ConsoleCallbackHandler());
|
||||||
|
loginContext.login();
|
||||||
|
return loginContext.getSubject();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,15 @@
|
||||||
|
package com.baeldung.jaas;
|
||||||
|
|
||||||
|
import java.security.PrivilegedAction;
|
||||||
|
|
||||||
|
public class ResourceAction implements PrivilegedAction {
|
||||||
|
@Override
|
||||||
|
public Object run() {
|
||||||
|
SecurityManager sm = System.getSecurityManager();
|
||||||
|
if (sm != null) {
|
||||||
|
sm.checkPermission(new ResourcePermission("test_resource"));
|
||||||
|
}
|
||||||
|
System.out.println("I have access to test_resource !");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,9 @@
|
||||||
|
package com.baeldung.jaas;
|
||||||
|
|
||||||
|
import java.security.BasicPermission;
|
||||||
|
|
||||||
|
public class ResourcePermission extends BasicPermission {
|
||||||
|
public ResourcePermission(String name) {
|
||||||
|
super(name);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,74 @@
|
||||||
|
package com.baeldung.jaas.loginmodule;
|
||||||
|
|
||||||
|
import com.sun.security.auth.UserPrincipal;
|
||||||
|
|
||||||
|
import javax.security.auth.Subject;
|
||||||
|
import javax.security.auth.callback.*;
|
||||||
|
import javax.security.auth.login.LoginException;
|
||||||
|
import javax.security.auth.spi.LoginModule;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.security.Principal;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public class InMemoryLoginModule implements LoginModule {
|
||||||
|
|
||||||
|
private static final String USERNAME = "testuser";
|
||||||
|
private static final String PASSWORD = "testpassword";
|
||||||
|
|
||||||
|
private Subject subject;
|
||||||
|
private CallbackHandler callbackHandler;
|
||||||
|
private Map<String, ?> sharedState;
|
||||||
|
private Map<String, ?> options;
|
||||||
|
|
||||||
|
private String username;
|
||||||
|
private boolean loginSucceeded = false;
|
||||||
|
private Principal userPrincipal;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void initialize(Subject subject, CallbackHandler callbackHandler, Map<String, ?> sharedState,
|
||||||
|
Map<String, ?> options) {
|
||||||
|
this.subject = subject;
|
||||||
|
this.callbackHandler = callbackHandler;
|
||||||
|
this.sharedState = sharedState;
|
||||||
|
this.options = options;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean login() throws LoginException {
|
||||||
|
NameCallback nameCallback = new NameCallback("username: ");
|
||||||
|
PasswordCallback passwordCallback = new PasswordCallback("password: ", false);
|
||||||
|
try {
|
||||||
|
callbackHandler.handle(new Callback[]{nameCallback, passwordCallback});
|
||||||
|
username = nameCallback.getName();
|
||||||
|
String password = new String(passwordCallback.getPassword());
|
||||||
|
if (USERNAME.equals(username) && PASSWORD.equals(password)) {
|
||||||
|
loginSucceeded = true;
|
||||||
|
}
|
||||||
|
} catch (IOException | UnsupportedCallbackException e) {
|
||||||
|
throw new LoginException("Can't login");
|
||||||
|
}
|
||||||
|
return loginSucceeded;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean commit() throws LoginException {
|
||||||
|
if (!loginSucceeded) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
userPrincipal = new UserPrincipal(username);
|
||||||
|
subject.getPrincipals().add(userPrincipal);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean abort() throws LoginException {
|
||||||
|
logout();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean logout() throws LoginException {
|
||||||
|
subject.getPrincipals().remove(userPrincipal);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,3 @@
|
||||||
|
jaasApplication {
|
||||||
|
com.baeldung.jaas.loginmodule.InMemoryLoginModule required debug=true;
|
||||||
|
};
|
|
@ -0,0 +1,14 @@
|
||||||
|
grant codebase "file:./target/core-java-security-2-0.1.0-SNAPSHOT.jar" {
|
||||||
|
permission javax.security.auth.AuthPermission "createLoginContext.jaasApplication";
|
||||||
|
permission javax.security.auth.AuthPermission "doAsPrivileged";
|
||||||
|
permission java.lang.RuntimePermission "readFileDescriptor";
|
||||||
|
permission java.lang.RuntimePermission "writeFileDescriptor";
|
||||||
|
};
|
||||||
|
|
||||||
|
grant codebase "file:./target/core-java-security-2-0.1.0-SNAPSHOT.jar" {
|
||||||
|
permission javax.security.auth.AuthPermission "modifyPrincipals";
|
||||||
|
};
|
||||||
|
|
||||||
|
grant principal com.sun.security.auth.UserPrincipal "testuser" {
|
||||||
|
permission com.baeldung.jaas.ResourcePermission "test_resource";
|
||||||
|
};
|
|
@ -8,5 +8,6 @@ This module contains articles about string operations.
|
||||||
- [String Initialization in Java](https://www.baeldung.com/java-string-initialization)
|
- [String Initialization in Java](https://www.baeldung.com/java-string-initialization)
|
||||||
- [String toLowerCase and toUpperCase Methods in Java](https://www.baeldung.com/java-string-convert-case)
|
- [String toLowerCase and toUpperCase Methods in Java](https://www.baeldung.com/java-string-convert-case)
|
||||||
- [Java String equalsIgnoreCase()](https://www.baeldung.com/java-string-equalsignorecase)
|
- [Java String equalsIgnoreCase()](https://www.baeldung.com/java-string-equalsignorecase)
|
||||||
- [How to avoid String contains() Case Insensitive in Java](https://www.baeldung.com/how-to-avoid-string-contains-case-insensitive-in-java)
|
- [Case-Insensitive String Matching in Java](https://www.baeldung.com/java-case-insensitive-string-matching)
|
||||||
|
- [L-Trim and R-Trim in Java](https://www.baeldung.com/l-trim-and-r-trim-in-java)
|
||||||
- More articles: [[<-- prev]](../core-java-string-operations)
|
- More articles: [[<-- prev]](../core-java-string-operations)
|
||||||
|
|
|
@ -109,7 +109,7 @@
|
||||||
<assertj.version>3.6.1</assertj.version>
|
<assertj.version>3.6.1</assertj.version>
|
||||||
<validation-api.version>2.0.0.Final</validation-api.version>
|
<validation-api.version>2.0.0.Final</validation-api.version>
|
||||||
<commons-lang3.version>3.8.1</commons-lang3.version>
|
<commons-lang3.version>3.8.1</commons-lang3.version>
|
||||||
<guava.version>27.0.1-jre</guava.version>
|
<guava.version>28.2-jre</guava.version>
|
||||||
<hibernate-validator.version>6.0.2.Final</hibernate-validator.version>
|
<hibernate-validator.version>6.0.2.Final</hibernate-validator.version>
|
||||||
<javax.el-api.version>3.0.0</javax.el-api.version>
|
<javax.el-api.version>3.0.0</javax.el-api.version>
|
||||||
<javax.el.version>2.2.6</javax.el.version>
|
<javax.el.version>2.2.6</javax.el.version>
|
||||||
|
|
|
@ -0,0 +1,124 @@
|
||||||
|
package com.baeldung.trim;
|
||||||
|
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
import org.openjdk.jmh.annotations.Benchmark;
|
||||||
|
import org.openjdk.jmh.annotations.BenchmarkMode;
|
||||||
|
import org.openjdk.jmh.annotations.Fork;
|
||||||
|
import org.openjdk.jmh.annotations.Mode;
|
||||||
|
import org.openjdk.jmh.annotations.OutputTimeUnit;
|
||||||
|
import org.openjdk.jmh.annotations.Scope;
|
||||||
|
import org.openjdk.jmh.annotations.Setup;
|
||||||
|
import org.openjdk.jmh.annotations.State;
|
||||||
|
|
||||||
|
import com.google.common.base.CharMatcher;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Based on https://github.com/tedyoung/indexof-contains-benchmark
|
||||||
|
*/
|
||||||
|
@Fork(5)
|
||||||
|
@State(Scope.Benchmark)
|
||||||
|
@BenchmarkMode(Mode.AverageTime)
|
||||||
|
@OutputTimeUnit(TimeUnit.NANOSECONDS)
|
||||||
|
public class LTrimRTrim {
|
||||||
|
|
||||||
|
private String src;
|
||||||
|
private static String ltrimResult;
|
||||||
|
private static String rtrimResult;
|
||||||
|
private static Pattern LTRIM = Pattern.compile("^\\s+");
|
||||||
|
private static Pattern RTRIM = Pattern.compile("\\s+$");
|
||||||
|
|
||||||
|
public static void main(String[] args) throws Exception {
|
||||||
|
org.openjdk.jmh.Main.main(args);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Setup
|
||||||
|
public void setup() {
|
||||||
|
src = " White spaces left and right ";
|
||||||
|
ltrimResult = "White spaces left and right ";
|
||||||
|
rtrimResult = " White spaces left and right";
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String whileLtrim(String s) {
|
||||||
|
int i = 0;
|
||||||
|
while (i < s.length() && Character.isWhitespace(s.charAt(i))) {
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
return s.substring(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String whileRtrim(String s) {
|
||||||
|
int i = s.length() - 1;
|
||||||
|
while (i >= 0 && Character.isWhitespace(s.charAt(i))) {
|
||||||
|
i--;
|
||||||
|
}
|
||||||
|
return s.substring(0, i + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static boolean checkStrings(String ltrim, String rtrim) {
|
||||||
|
boolean result = false;
|
||||||
|
|
||||||
|
if (ltrimResult.equalsIgnoreCase(ltrim) && rtrimResult.equalsIgnoreCase(rtrim))
|
||||||
|
result = true;
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Going through the String detecting Whitespaces
|
||||||
|
@Benchmark
|
||||||
|
public boolean whileCharacters() {
|
||||||
|
String ltrim = whileLtrim(src);
|
||||||
|
String rtrim = whileRtrim(src);
|
||||||
|
|
||||||
|
return checkStrings(ltrim, rtrim);
|
||||||
|
}
|
||||||
|
|
||||||
|
// replaceAll() and Regular Expressions
|
||||||
|
@Benchmark
|
||||||
|
public boolean replaceAllRegularExpression() {
|
||||||
|
String ltrim = src.replaceAll("^\\s+", "");
|
||||||
|
String rtrim = src.replaceAll("\\s+$", "");
|
||||||
|
|
||||||
|
return checkStrings(ltrim, rtrim);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String patternLtrim(String s) {
|
||||||
|
return LTRIM.matcher(s)
|
||||||
|
.replaceAll("");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String patternRtrim(String s) {
|
||||||
|
return RTRIM.matcher(s)
|
||||||
|
.replaceAll("");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Pattern matches() with replaceAll
|
||||||
|
@Benchmark
|
||||||
|
public boolean patternMatchesLTtrimRTrim() {
|
||||||
|
String ltrim = patternLtrim(src);
|
||||||
|
String rtrim = patternRtrim(src);
|
||||||
|
|
||||||
|
return checkStrings(ltrim, rtrim);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Guava CharMatcher trimLeadingFrom / trimTrailingFrom
|
||||||
|
@Benchmark
|
||||||
|
public boolean guavaCharMatcher() {
|
||||||
|
String ltrim = CharMatcher.whitespace().trimLeadingFrom(src);
|
||||||
|
String rtrim = CharMatcher.whitespace().trimTrailingFrom(src);
|
||||||
|
|
||||||
|
return checkStrings(ltrim, rtrim);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Apache Commons StringUtils containsIgnoreCase
|
||||||
|
@Benchmark
|
||||||
|
public boolean apacheCommonsStringUtils() {
|
||||||
|
String ltrim = StringUtils.stripStart(src, null);
|
||||||
|
String rtrim = StringUtils.stripEnd(src, null);
|
||||||
|
|
||||||
|
return checkStrings(ltrim, rtrim);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,78 @@
|
||||||
|
package com.baeldung.trim;
|
||||||
|
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
import org.junit.Assert;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import com.google.common.base.CharMatcher;
|
||||||
|
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* BAEL-3755: LTrim and RTrim examples.
|
||||||
|
*/
|
||||||
|
public class LTrimRTrimUnitTest {
|
||||||
|
|
||||||
|
private String src = " White spaces left and right ";
|
||||||
|
private final static String ltrimResult = "White spaces left and right ";
|
||||||
|
private final static String rtrimResult = " White spaces left and right";
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenString_whenCallingWhileCharacters_thenReturnsTrue() {
|
||||||
|
String ltrim = LTrimRTrim.whileLtrim(src);
|
||||||
|
String rtrim = LTrimRTrim.whileRtrim(src);
|
||||||
|
|
||||||
|
// Compare the Strings obtained and the expected
|
||||||
|
Assert.assertTrue(ltrimResult.equalsIgnoreCase(ltrim));
|
||||||
|
|
||||||
|
Assert.assertTrue(rtrimResult.equalsIgnoreCase(rtrim));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenString_whenCallingContainsWithReplaceAll_shouldReturnTrue() {
|
||||||
|
// Use replaceAll with Regular Expressions
|
||||||
|
String ltrim = src.replaceAll("^\\s+", "");
|
||||||
|
String rtrim = src.replaceAll("\\s+$", "");
|
||||||
|
|
||||||
|
// Compare the Strings obtained and the expected
|
||||||
|
Assert.assertTrue(ltrimResult.equalsIgnoreCase(ltrim));
|
||||||
|
|
||||||
|
Assert.assertTrue(rtrimResult.equalsIgnoreCase(rtrim));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenString_whenCallingPaternCompileMatcherReplaceAll_thenReturnsTrue() {
|
||||||
|
// Use Pattern Compile Matcher and Find to avoid case insensitive issues
|
||||||
|
String ltrim = LTrimRTrim.patternLtrim(src);
|
||||||
|
String rtrim = LTrimRTrim.patternRtrim(src);
|
||||||
|
|
||||||
|
// Compare the Strings obtained and the expected
|
||||||
|
Assert.assertTrue(ltrimResult.equalsIgnoreCase(ltrim));
|
||||||
|
|
||||||
|
Assert.assertTrue(rtrimResult.equalsIgnoreCase(rtrim));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenString_whenCallingGuavaCharMatcher_thenReturnsTrue() {
|
||||||
|
// Use StringUtils containsIgnoreCase to avoid case insensitive issues
|
||||||
|
String ltrim = CharMatcher.whitespace().trimLeadingFrom(src);;
|
||||||
|
String rtrim = CharMatcher.whitespace().trimTrailingFrom(src);
|
||||||
|
|
||||||
|
// Compare the Strings obtained and the expected
|
||||||
|
Assert.assertTrue(ltrimResult.equalsIgnoreCase(ltrim));
|
||||||
|
|
||||||
|
Assert.assertTrue(rtrimResult.equalsIgnoreCase(rtrim));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenString_whenCallingStringUtilsStripStartEnd_thenReturnsTrue() {
|
||||||
|
// Use StringUtils containsIgnoreCase to avoid case insensitive issues
|
||||||
|
String ltrim = StringUtils.stripStart(src, null);
|
||||||
|
String rtrim = StringUtils.stripEnd(src, null);
|
||||||
|
|
||||||
|
// Compare the Strings obtained and the expected
|
||||||
|
Assert.assertTrue(ltrimResult.equalsIgnoreCase(ltrim));
|
||||||
|
Assert.assertTrue(rtrimResult.equalsIgnoreCase(rtrim));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -1,123 +1,153 @@
|
||||||
package com.baeldung.stack;
|
package com.baeldung.stack;
|
||||||
|
|
||||||
import static org.hamcrest.CoreMatchers.equalTo;
|
import org.junit.Test;
|
||||||
import static org.junit.Assert.*;
|
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.ListIterator;
|
import java.util.ListIterator;
|
||||||
import java.util.Stack;
|
import java.util.Stack;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import org.junit.Test;
|
import static org.hamcrest.CoreMatchers.equalTo;
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import static org.junit.Assert.assertThat;
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
public class StackUnitTest {
|
public class StackUnitTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void whenStackIsCreated_thenItHasSize0() {
|
public void whenStackIsCreated_thenItHasSizeZero() {
|
||||||
Stack intStack = new Stack();
|
Stack<Integer> intStack = new Stack<>();
|
||||||
|
|
||||||
assertEquals(0, intStack.size());
|
assertEquals(0, intStack.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void givenEmptyStack_whenElementIsPushed_thenStackSizeisIncreased() {
|
public void whenElementIsPushed_thenStackSizeIsIncreased() {
|
||||||
Stack intStack = new Stack();
|
Stack<Integer> intStack = new Stack<>();
|
||||||
intStack.push(1);
|
intStack.push(1);
|
||||||
|
|
||||||
assertEquals(1, intStack.size());
|
assertEquals(1, intStack.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void givenEmptyStack_whenMultipleElementsArePushed_thenStackSizeisIncreased() {
|
public void whenMultipleElementsArePushed_thenStackSizeIsIncreased() {
|
||||||
Stack intStack = new Stack();
|
Stack<Integer> intStack = new Stack<>();
|
||||||
List<Integer> intList = Arrays.asList(1, 2, 3, 4, 5, 6, 7);
|
List<Integer> intList = Arrays.asList(1, 2, 3, 4, 5, 6, 7);
|
||||||
|
|
||||||
boolean result = intStack.addAll(intList);
|
boolean result = intStack.addAll(intList);
|
||||||
|
|
||||||
assertTrue(result);
|
assertTrue(result);
|
||||||
assertEquals(7, intList.size());
|
assertEquals(7, intList.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void whenElementIsPoppedFromStack_thenElementIsRemovedAndSizeChanges() {
|
public void whenElementIsPoppedFromStack_thenElementIsRemovedAndSizeChanges() {
|
||||||
Stack<Integer> intStack = new Stack();
|
Stack<Integer> intStack = new Stack<>();
|
||||||
intStack.push(5);
|
intStack.push(5);
|
||||||
intStack.pop();
|
|
||||||
|
Integer element = intStack.pop();
|
||||||
|
|
||||||
|
assertEquals(Integer.valueOf(5), element);
|
||||||
assertTrue(intStack.isEmpty());
|
assertTrue(intStack.isEmpty());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void whenElementIsPeeked_thenElementIsNotRemovedAndSizeDoesNotChange() {
|
public void whenElementIsPeeked_thenElementIsNotRemovedAndSizeDoesNotChange() {
|
||||||
Stack<Integer> intStack = new Stack();
|
Stack<Integer> intStack = new Stack<>();
|
||||||
intStack.push(5);
|
intStack.push(5);
|
||||||
intStack.peek();
|
|
||||||
|
Integer element = intStack.peek();
|
||||||
|
|
||||||
|
assertEquals(Integer.valueOf(5), element);
|
||||||
assertEquals(1, intStack.search(5));
|
assertEquals(1, intStack.search(5));
|
||||||
assertEquals(1, intStack.size());
|
assertEquals(1, intStack.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void whenElementIsOnStack_thenSearchReturnsItsDistanceFromTheTop() {
|
public void whenElementIsOnStack_thenSearchReturnsItsDistanceFromTheTop() {
|
||||||
Stack<Integer> intStack = new Stack();
|
Stack<Integer> intStack = new Stack<>();
|
||||||
intStack.push(5);
|
intStack.push(5);
|
||||||
assertEquals(1, intStack.search(5));
|
intStack.push(8);
|
||||||
|
|
||||||
|
assertEquals(2, intStack.search(5));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void whenElementIsOnStack_thenIndexOfReturnsItsIndex() {
|
public void whenElementIsOnStack_thenIndexOfReturnsItsIndex() {
|
||||||
Stack<Integer> intStack = new Stack();
|
Stack<Integer> intStack = new Stack<>();
|
||||||
intStack.push(5);
|
intStack.push(5);
|
||||||
|
|
||||||
int indexOf = intStack.indexOf(5);
|
int indexOf = intStack.indexOf(5);
|
||||||
|
|
||||||
assertEquals(0, indexOf);
|
assertEquals(0, indexOf);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void whenMultipleElementsAreOnStack_thenIndexOfReturnsLastElementIndex() {
|
public void whenMultipleElementsAreOnStack_thenIndexOfReturnsLastElementIndex() {
|
||||||
Stack<Integer> intStack = new Stack();
|
Stack<Integer> intStack = new Stack<>();
|
||||||
intStack.push(5);
|
intStack.push(5);
|
||||||
intStack.push(5);
|
intStack.push(5);
|
||||||
intStack.push(5);
|
intStack.push(5);
|
||||||
|
|
||||||
int lastIndexOf = intStack.lastIndexOf(5);
|
int lastIndexOf = intStack.lastIndexOf(5);
|
||||||
|
|
||||||
assertEquals(2, lastIndexOf);
|
assertEquals(2, lastIndexOf);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void givenElementOnStack_whenRemoveElementIsInvoked_thenElementIsRemoved() {
|
public void whenRemoveElementIsInvoked_thenElementIsRemoved() {
|
||||||
Stack<Integer> intStack = new Stack();
|
Stack<Integer> intStack = new Stack<>();
|
||||||
intStack.push(5);
|
intStack.push(5);
|
||||||
intStack.push(5);
|
intStack.push(5);
|
||||||
|
|
||||||
intStack.removeElement(5);
|
intStack.removeElement(5);
|
||||||
|
|
||||||
assertEquals(1, intStack.size());
|
assertEquals(1, intStack.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void givenElementOnStack_whenRemoveElementAtIsInvoked_thenElementIsRemoved() {
|
public void whenRemoveElementAtIsInvoked_thenElementIsRemoved() {
|
||||||
Stack<Integer> intStack = new Stack();
|
Stack<Integer> intStack = new Stack<>();
|
||||||
intStack.push(5);
|
intStack.push(5);
|
||||||
intStack.push(7);
|
intStack.push(7);
|
||||||
|
|
||||||
intStack.removeElementAt(1);
|
intStack.removeElementAt(1);
|
||||||
|
|
||||||
assertEquals(-1, intStack.search(7));
|
assertEquals(-1, intStack.search(7));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void givenElementsOnStack_whenRemoveAllElementsIsInvoked_thenAllElementsAreRemoved() {
|
public void whenRemoveAllElementsIsInvoked_thenAllElementsAreRemoved() {
|
||||||
Stack<Integer> intStack = new Stack();
|
Stack<Integer> intStack = new Stack<>();
|
||||||
intStack.push(5);
|
intStack.push(5);
|
||||||
intStack.push(7);
|
intStack.push(7);
|
||||||
|
|
||||||
intStack.removeAllElements();
|
intStack.removeAllElements();
|
||||||
|
|
||||||
assertTrue(intStack.isEmpty());
|
assertTrue(intStack.isEmpty());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void givenElementsOnStack_whenRemoveAllIsInvoked_thenAllElementsFromCollectionAreRemoved() {
|
public void givenElementsOnStack_whenRemoveAllIsInvoked_thenAllElementsFromCollectionAreRemoved() {
|
||||||
Stack<Integer> intStack = new Stack();
|
Stack<Integer> intStack = new Stack<>();
|
||||||
List<Integer> intList = Arrays.asList(1, 2, 3, 4, 5, 6, 7);
|
List<Integer> intList = Arrays.asList(1, 2, 3, 4, 5, 6, 7);
|
||||||
intStack.addAll(intList);
|
intStack.addAll(intList);
|
||||||
intStack.add(500);
|
intStack.add(500);
|
||||||
|
|
||||||
intStack.removeAll(intList);
|
intStack.removeAll(intList);
|
||||||
|
|
||||||
assertEquals(1, intStack.size());
|
assertEquals(1, intStack.size());
|
||||||
|
assertEquals(1, intStack.search(500));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void givenElementsOnStack_whenRemoveIfIsInvoked_thenAllElementsSatysfyingConditionAreRemoved() {
|
public void whenRemoveIfIsInvoked_thenAllElementsSatysfyingConditionAreRemoved() {
|
||||||
Stack<Integer> intStack = new Stack();
|
Stack<Integer> intStack = new Stack<>();
|
||||||
List<Integer> intList = Arrays.asList(1, 2, 3, 4, 5, 6, 7);
|
List<Integer> intList = Arrays.asList(1, 2, 3, 4, 5, 6, 7);
|
||||||
intStack.addAll(intList);
|
intStack.addAll(intList);
|
||||||
|
|
||||||
intStack.removeIf(element -> element < 6);
|
intStack.removeIf(element -> element < 6);
|
||||||
|
|
||||||
assertEquals(2, intStack.size());
|
assertEquals(2, intStack.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -126,12 +156,28 @@ public class StackUnitTest {
|
||||||
Stack<Integer> intStack = new Stack<>();
|
Stack<Integer> intStack = new Stack<>();
|
||||||
List<Integer> intList = Arrays.asList(1, 2, 3, 4, 5, 6, 7);
|
List<Integer> intList = Arrays.asList(1, 2, 3, 4, 5, 6, 7);
|
||||||
intStack.addAll(intList);
|
intStack.addAll(intList);
|
||||||
|
|
||||||
ListIterator<Integer> it = intStack.listIterator();
|
ListIterator<Integer> it = intStack.listIterator();
|
||||||
Stack<Integer> result = new Stack();
|
|
||||||
|
Stack<Integer> result = new Stack<>();
|
||||||
while(it.hasNext()) {
|
while(it.hasNext()) {
|
||||||
result.push(it.next());
|
result.push(it.next());
|
||||||
}
|
}
|
||||||
|
|
||||||
assertThat(result, equalTo(intStack));
|
assertThat(result, equalTo(intStack));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenStackIsFiltered_allElementsNotSatisfyingFilterConditionAreDiscarded() {
|
||||||
|
Stack<Integer> intStack = new Stack<>();
|
||||||
|
List<Integer> inputIntList = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 9, 10);
|
||||||
|
intStack.addAll(inputIntList);
|
||||||
|
|
||||||
|
List<Integer> filtered = intStack
|
||||||
|
.stream()
|
||||||
|
.filter(element -> element <= 3)
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
|
||||||
|
assertEquals(3, filtered.size());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -100,6 +100,7 @@
|
||||||
<module>core-java-reflection</module>
|
<module>core-java-reflection</module>
|
||||||
|
|
||||||
<module>core-java-security</module>
|
<module>core-java-security</module>
|
||||||
|
<module>core-java-security-2</module>
|
||||||
<module>core-java-streams</module>
|
<module>core-java-streams</module>
|
||||||
<module>core-java-streams-2</module>
|
<module>core-java-streams-2</module>
|
||||||
<module>core-java-streams-3</module>
|
<module>core-java-streams-3</module>
|
||||||
|
|
|
@ -0,0 +1,95 @@
|
||||||
|
package com.baeldung.gson.jsoncompare;
|
||||||
|
|
||||||
|
import com.google.gson.JsonElement;
|
||||||
|
import com.google.gson.JsonParser;
|
||||||
|
import org.junit.Test;
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
|
||||||
|
public class JsonCompareUnitTest {
|
||||||
|
@Test
|
||||||
|
public void givenJsonStrings_whenCompared_thenNotEqual() {
|
||||||
|
String string1 = "{\"fullName\": \"Emily Jenkins\", \"age\": 27 }";
|
||||||
|
String string2 = "{\"fullName\": \"Emily Jenkins\", \"age\": 27}";
|
||||||
|
|
||||||
|
assertNotEquals(string1, string2);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenIdenticalSimpleObjects_whenCompared_thenEqual() {
|
||||||
|
JsonParser parser = new JsonParser();
|
||||||
|
String string1 = "{\"customer\": {\"id\": \"44521\",\"fullName\": \"Emily Jenkins\", \"age\": 27 }}";
|
||||||
|
String string2 = "{\"customer\": {\"id\": \"44521\", \"fullName\": \"Emily Jenkins\",\"age\": 27}}";
|
||||||
|
|
||||||
|
assertTrue(parser.parse(string1)
|
||||||
|
.isJsonObject());
|
||||||
|
assertEquals(parser.parse(string1), parser.parse(string2));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenSameObjectsInDifferentOrder_whenCompared_thenEqual() {
|
||||||
|
JsonParser parser = new JsonParser();
|
||||||
|
String string1 = "{\"customer\": {\"id\": \"44521\",\"fullName\": \"Emily Jenkins\", \"age\": 27 }}";
|
||||||
|
String string2 = "{\"customer\": {\"id\": \"44521\",\"age\": 27, \"fullName\": \"Emily Jenkins\" }}";
|
||||||
|
|
||||||
|
JsonElement json1 = parser.parse(string1);
|
||||||
|
JsonElement json2 = parser.parse(string2);
|
||||||
|
|
||||||
|
assertEquals(json1, json2);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenIdenticalArrays_whenCompared_thenEqual() {
|
||||||
|
JsonParser parser = new JsonParser();
|
||||||
|
String string1 = "[10, 20, 30]";
|
||||||
|
String string2 = "[10, 20, 30]";
|
||||||
|
|
||||||
|
assertTrue(parser.parse(string1)
|
||||||
|
.isJsonArray());
|
||||||
|
assertEquals(parser.parse(string1), parser.parse(string2));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenArraysInDifferentOrder_whenCompared_thenNotEqual() {
|
||||||
|
JsonParser parser = new JsonParser();
|
||||||
|
String string1 = "[20, 10, 30]";
|
||||||
|
String string2 = "[10, 20, 30]";
|
||||||
|
|
||||||
|
assertNotEquals(parser.parse(string1), parser.parse(string2));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenIdenticalNestedObjects_whenCompared_thenEqual() {
|
||||||
|
JsonParser parser = new JsonParser();
|
||||||
|
String string1 = "{\"customer\": {\"id\": \"44521\",\"fullName\": \"Emily Jenkins\", \"age\": 27, \"consumption_info\" : {\"fav_product\": \"Coke\", \"last_buy\": \"2012-04-23\"}}}";
|
||||||
|
String string2 = "{\"customer\": {\"id\": \"44521\",\"fullName\": \"Emily Jenkins\", \"age\": 27, \"consumption_info\" : {\"last_buy\": \"2012-04-23\", \"fav_product\": \"Coke\"}}}";
|
||||||
|
|
||||||
|
JsonElement json1 = parser.parse(string1);
|
||||||
|
JsonElement json2 = parser.parse(string2);
|
||||||
|
|
||||||
|
assertEquals(json1, json2);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenIdenticalNestedObjectsWithArray_whenCompared_thenEqual() {
|
||||||
|
JsonParser parser = new JsonParser();
|
||||||
|
String string1 = "{\"customer\": {\"id\": \"44521\",\"fullName\": \"Emily Jenkins\", \"age\": 27, \"consumption_info\" : {\"last_buy\": \"2012-04-23\", \"prouducts\": [\"banana\", \"eggs\"]}}}";
|
||||||
|
String string2 = "{\"customer\": {\"id\": \"44521\",\"fullName\": \"Emily Jenkins\", \"age\": 27, \"consumption_info\" : {\"last_buy\": \"2012-04-23\", \"prouducts\": [\"banana\", \"eggs\"]}}}";
|
||||||
|
|
||||||
|
JsonElement json1 = parser.parse(string1);
|
||||||
|
JsonElement json2 = parser.parse(string2);
|
||||||
|
|
||||||
|
assertEquals(json1, json2);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenNestedObjectsDifferentArrayOrder_whenCompared_thenNotEqual() {
|
||||||
|
JsonParser parser = new JsonParser();
|
||||||
|
String string1 = "{\"customer\": {\"id\": \"44521\",\"fullName\": \"Emily Jenkins\", \"age\": 27, \"consumption_info\" : {\"last_buy\": \"2012-04-23\", \"prouducts\": [\"banana\", \"eggs\"]}}}";
|
||||||
|
String string2 = "{\"customer\": {\"id\": \"44521\",\"fullName\": \"Emily Jenkins\", \"age\": 27, \"consumption_info\" : {\"last_buy\": \"2012-04-23\", \"prouducts\": [\"eggs\", \"banana\"]}}}";
|
||||||
|
|
||||||
|
JsonElement json1 = parser.parse(string1);
|
||||||
|
JsonElement json2 = parser.parse(string2);
|
||||||
|
|
||||||
|
assertNotEquals(json1, json2);
|
||||||
|
}
|
||||||
|
}
|
|
@ -50,12 +50,24 @@
|
||||||
<artifactId>imageio-bmp</artifactId>
|
<artifactId>imageio-bmp</artifactId>
|
||||||
<version>${imageio.version}</version>
|
<version>${imageio.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>net.sourceforge.tess4j</groupId>
|
||||||
|
<artifactId>tess4j</artifactId>
|
||||||
|
<version>${tess4j.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.bytedeco</groupId>
|
||||||
|
<artifactId>tesseract-platform</artifactId>
|
||||||
|
<version>${tesseract-platform.version}</version>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
<core-image.version>1.3.5</core-image.version>
|
<core-image.version>1.3.5</core-image.version>
|
||||||
<ij.version>1.51h</ij.version>
|
<ij.version>1.51h</ij.version>
|
||||||
<imageio.version>3.3.2</imageio.version>
|
<imageio.version>3.3.2</imageio.version>
|
||||||
|
<tess4j.version>4.5.1</tess4j.version>
|
||||||
|
<tesseract-platform.version>4.1.0-1.5.2</tesseract-platform.version>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
</project>
|
</project>
|
|
@ -0,0 +1,28 @@
|
||||||
|
package com.baeldung.tesseract;
|
||||||
|
|
||||||
|
import java.awt.Rectangle;
|
||||||
|
import java.io.File;
|
||||||
|
|
||||||
|
import net.sourceforge.tess4j.Tesseract;
|
||||||
|
import net.sourceforge.tess4j.TesseractException;
|
||||||
|
|
||||||
|
public class Tess4JExample {
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
String result = null;
|
||||||
|
try {
|
||||||
|
File image = new File("src/main/resources/images/baeldung.png");
|
||||||
|
Tesseract tesseract = new Tesseract();
|
||||||
|
tesseract.setLanguage("spa");
|
||||||
|
tesseract.setPageSegMode(1);
|
||||||
|
tesseract.setOcrEngineMode(1);
|
||||||
|
tesseract.setHocr(true);
|
||||||
|
tesseract.setDatapath("src/main/resources/tessdata");
|
||||||
|
result = tesseract.doOCR(image, new Rectangle(1200, 200));
|
||||||
|
} catch (TesseractException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
System.out.println(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,26 @@
|
||||||
|
package com.baeldung.tesseract;
|
||||||
|
|
||||||
|
import org.bytedeco.javacpp.BytePointer;
|
||||||
|
import org.bytedeco.leptonica.PIX;
|
||||||
|
import org.bytedeco.tesseract.TessBaseAPI;
|
||||||
|
|
||||||
|
public class TesseractPlatformExample {
|
||||||
|
|
||||||
|
@SuppressWarnings("resource")
|
||||||
|
public static void main(String[] args) {
|
||||||
|
try {
|
||||||
|
TessBaseAPI tessApi = new TessBaseAPI();
|
||||||
|
tessApi.Init("src/main/resources/tessdata", "eng", 3);
|
||||||
|
tessApi.SetPageSegMode(1);
|
||||||
|
PIX image = org.bytedeco.leptonica.global.lept.pixRead("src/main/resources/images/baeldung.png");
|
||||||
|
tessApi.SetImage(image);
|
||||||
|
|
||||||
|
BytePointer outText = tessApi.GetUTF8Text();
|
||||||
|
System.out.println(outText.getString());
|
||||||
|
tessApi.End();
|
||||||
|
} catch(Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Binary file not shown.
After Width: | Height: | Size: 648 KiB |
Binary file not shown.
After Width: | Height: | Size: 217 KiB |
|
@ -0,0 +1,9 @@
|
||||||
|
Der ,.schnelle” braune Fuchs springt
|
||||||
|
iiber den faulen Hund. Le renard brun
|
||||||
|
«rapide» saute par-dessus le chien
|
||||||
|
paresseux. La volpe marrone rapida
|
||||||
|
salta sopra il cane pigro. El zorro
|
||||||
|
marron rapido salta sobre el perro
|
||||||
|
perezoso. A raposa marrom rapida
|
||||||
|
salta sobre 0 cao preguicoso.
|
||||||
|
|
|
@ -14,6 +14,7 @@ node_modules/
|
||||||
npm-debug.log.*
|
npm-debug.log.*
|
||||||
/.awcache/*
|
/.awcache/*
|
||||||
/.cache-loader/*
|
/.cache-loader/*
|
||||||
|
package-lock.json
|
||||||
|
|
||||||
######################
|
######################
|
||||||
# SASS
|
# SASS
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -20,11 +20,11 @@ import static java.lang.String.format;
|
||||||
import static org.assertj.core.api.Assertions.assertThat;
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Unit tests for the UTC Hibernate configuration.
|
* Tests for the UTC Hibernate configuration.
|
||||||
*/
|
*/
|
||||||
@RunWith(SpringRunner.class)
|
@RunWith(SpringRunner.class)
|
||||||
@SpringBootTest(classes = BookstoreApp.class)
|
@SpringBootTest(classes = BookstoreApp.class)
|
||||||
public class HibernateTimeZoneTest {
|
public class HibernateTimeZoneIntegrationTest {
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private DateTimeWrapperRepository dateTimeWrapperRepository;
|
private DateTimeWrapperRepository dateTimeWrapperRepository;
|
|
@ -435,7 +435,23 @@
|
||||||
<artifactId>reflections</artifactId>
|
<artifactId>reflections</artifactId>
|
||||||
<version>${reflections.version}</version>
|
<version>${reflections.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.uber.nullaway</groupId>
|
||||||
|
<artifactId>nullaway</artifactId>
|
||||||
|
<version>0.3.0</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.codehaus.plexus</groupId>
|
||||||
|
<artifactId>plexus-compiler-javac-errorprone</artifactId>
|
||||||
|
<version>2.8</version>
|
||||||
|
</dependency>
|
||||||
|
<!-- override plexus-compiler-javac-errorprone's dependency on
|
||||||
|
Error Prone with the latest version -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.google.errorprone</groupId>
|
||||||
|
<artifactId>error_prone_core</artifactId>
|
||||||
|
<version>2.1.3</version>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<repositories>
|
<repositories>
|
||||||
|
@ -552,6 +568,47 @@
|
||||||
</execution>
|
</execution>
|
||||||
</executions>
|
</executions>
|
||||||
</plugin>
|
</plugin>
|
||||||
|
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
|
<version>3.5</version>
|
||||||
|
<configuration>
|
||||||
|
<compilerId>javac-with-errorprone</compilerId>
|
||||||
|
<forceJavacCompilerUse>true</forceJavacCompilerUse>
|
||||||
|
<source>1.8</source>
|
||||||
|
<target>1.8</target>
|
||||||
|
<showWarnings>true</showWarnings>
|
||||||
|
<annotationProcessorPaths>
|
||||||
|
<path>
|
||||||
|
<groupId>com.uber.nullaway</groupId>
|
||||||
|
<artifactId>nullaway</artifactId>
|
||||||
|
<version>0.3.0</version>
|
||||||
|
</path>
|
||||||
|
</annotationProcessorPaths>
|
||||||
|
<compilerArgs>
|
||||||
|
<!-- NullAway will warn by default, uncomment the next line to make the build fail -->
|
||||||
|
<!-- <arg>-Xep:NullAway:ERROR</arg> -->
|
||||||
|
<arg>-XepExcludedPaths:(.*)/test/.*|(.*)/streamex/.*</arg>
|
||||||
|
<arg>-XepOpt:NullAway:AnnotatedPackages=com.baeldung.nullaway</arg>
|
||||||
|
</compilerArgs>
|
||||||
|
</configuration>
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.codehaus.plexus</groupId>
|
||||||
|
<artifactId>plexus-compiler-javac-errorprone</artifactId>
|
||||||
|
<version>2.8</version>
|
||||||
|
</dependency>
|
||||||
|
<!-- override plexus-compiler-javac-errorprone's dependency on
|
||||||
|
Error Prone with the latest version -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.google.errorprone</groupId>
|
||||||
|
<artifactId>error_prone_core</artifactId>
|
||||||
|
<version>2.1.3</version>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
</plugin>
|
||||||
|
|
||||||
</plugins>
|
</plugins>
|
||||||
</build>
|
</build>
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,24 @@
|
||||||
|
package com.baeldung.nullaway;
|
||||||
|
|
||||||
|
import com.baeldung.distinct.Person;
|
||||||
|
|
||||||
|
public class NullAwayExample {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 1- NullAway will warn about yearsToRetirement method
|
||||||
|
* 2- Uncomment @Nullable in printAge and NullAway will warn about this method
|
||||||
|
* 3- Add a standard null check to be NullAway compliant
|
||||||
|
* 4- Build will be SUCCESS
|
||||||
|
*/
|
||||||
|
|
||||||
|
static Integer getAge(/*@Nullable*/ Person person) {
|
||||||
|
return person.getAge();
|
||||||
|
}
|
||||||
|
|
||||||
|
Integer yearsToRetirement() {
|
||||||
|
Person p = null;
|
||||||
|
// ... p never gets set correctly...
|
||||||
|
return 65 - getAge(p);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -83,7 +83,7 @@
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.mulesoft.munit</groupId>
|
<groupId>com.mulesoft.munit</groupId>
|
||||||
<artifactId>mule-munit-support</artifactId>
|
<artifactId>mule-munit-support</artifactId>
|
||||||
<version>${mule.munit.support.version}</version>
|
<version>${mule.version}</version>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
|
@ -106,18 +106,19 @@
|
||||||
</configuration>
|
</configuration>
|
||||||
</plugin>
|
</plugin>
|
||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.mule.tools</groupId>
|
<groupId>org.mule.tools.maven</groupId>
|
||||||
<artifactId>muleesb-maven-plugin</artifactId>
|
<artifactId>mule-maven-plugin</artifactId>
|
||||||
<version>${muleesb-maven-plugin.version}</version>
|
<version>2.2.1</version>
|
||||||
<configuration>
|
<configuration>
|
||||||
|
<deploymentType>standalone</deploymentType>
|
||||||
<muleVersion>${mule.version}</muleVersion>
|
<muleVersion>${mule.version}</muleVersion>
|
||||||
<applications>/home/abir/AnypointStudio/workspace/variablescopetest</applications>
|
|
||||||
</configuration>
|
</configuration>
|
||||||
<executions>
|
<executions>
|
||||||
<execution>
|
<execution>
|
||||||
<id>deploy</id>
|
<id>deploy</id>
|
||||||
|
<phase>deploy</phase>
|
||||||
<goals>
|
<goals>
|
||||||
<goal>start</goal>
|
<goal>deploy</goal>
|
||||||
</goals>
|
</goals>
|
||||||
</execution>
|
</execution>
|
||||||
</executions>
|
</executions>
|
||||||
|
@ -210,11 +211,9 @@
|
||||||
</pluginRepositories>
|
</pluginRepositories>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
<mule.version>3.8.1</mule.version>
|
<mule.version>3.9.0</mule.version>
|
||||||
<mule.tools.version>1.2</mule.tools.version>
|
<mule.tools.version>1.2</mule.tools.version>
|
||||||
<munit.version>1.3.6</munit.version>
|
<munit.version>1.3.6</munit.version>
|
||||||
<mule.munit.support.version>3.9.0</mule.munit.support.version>
|
|
||||||
<muleesb-maven-plugin.version>1.0</muleesb-maven-plugin.version>
|
|
||||||
<build-helper-maven-plugin.version>1.7</build-helper-maven-plugin.version>
|
<build-helper-maven-plugin.version>1.7</build-helper-maven-plugin.version>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,7 @@ server.port=8082
|
||||||
|
|
||||||
#spring boot mongodb
|
#spring boot mongodb
|
||||||
spring.data.mongodb.host=localhost
|
spring.data.mongodb.host=localhost
|
||||||
spring.data.mongodb.port=27017
|
spring.data.mongodb.port=0
|
||||||
spring.data.mongodb.database=springboot-mongo
|
spring.data.mongodb.database=springboot-mongo
|
||||||
|
|
||||||
spring.thymeleaf.cache=false
|
spring.thymeleaf.cache=false
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
spring.jpa.show-sql=true
|
spring.jpa.show-sql=true
|
||||||
#MySql
|
#MySql
|
||||||
spring.datasource.url=jdbc:mysql://localhost:3306/baeldung
|
#spring.datasource.url=jdbc:mysql://localhost:3306/baeldung
|
||||||
spring.datasource.username=baeldung
|
#spring.datasource.username=baeldung
|
||||||
spring.datasource.password=baeldung
|
#spring.datasource.password=baeldung
|
|
@ -1,13 +1,11 @@
|
||||||
package com.baeldung.spring.data.redis.config;
|
package com.baeldung.spring.data.redis.config;
|
||||||
|
|
||||||
import com.baeldung.spring.data.redis.queue.MessagePublisher;
|
|
||||||
import com.baeldung.spring.data.redis.queue.RedisMessagePublisher;
|
|
||||||
import com.baeldung.spring.data.redis.queue.RedisMessageSubscriber;
|
|
||||||
import org.springframework.context.annotation.Bean;
|
import org.springframework.context.annotation.Bean;
|
||||||
import org.springframework.context.annotation.ComponentScan;
|
import org.springframework.context.annotation.ComponentScan;
|
||||||
import org.springframework.context.annotation.Configuration;
|
import org.springframework.context.annotation.Configuration;
|
||||||
import org.springframework.context.annotation.PropertySource;
|
import org.springframework.context.annotation.PropertySource;
|
||||||
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
|
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
|
||||||
|
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
|
||||||
import org.springframework.data.redis.core.RedisTemplate;
|
import org.springframework.data.redis.core.RedisTemplate;
|
||||||
import org.springframework.data.redis.listener.ChannelTopic;
|
import org.springframework.data.redis.listener.ChannelTopic;
|
||||||
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
|
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
|
||||||
|
@ -15,6 +13,10 @@ import org.springframework.data.redis.listener.adapter.MessageListenerAdapter;
|
||||||
import org.springframework.data.redis.repository.configuration.EnableRedisRepositories;
|
import org.springframework.data.redis.repository.configuration.EnableRedisRepositories;
|
||||||
import org.springframework.data.redis.serializer.GenericToStringSerializer;
|
import org.springframework.data.redis.serializer.GenericToStringSerializer;
|
||||||
|
|
||||||
|
import com.baeldung.spring.data.redis.queue.MessagePublisher;
|
||||||
|
import com.baeldung.spring.data.redis.queue.RedisMessagePublisher;
|
||||||
|
import com.baeldung.spring.data.redis.queue.RedisMessageSubscriber;
|
||||||
|
|
||||||
@Configuration
|
@Configuration
|
||||||
@ComponentScan("com.baeldung.spring.data.redis")
|
@ComponentScan("com.baeldung.spring.data.redis")
|
||||||
@EnableRedisRepositories(basePackages = "com.baeldung.spring.data.redis.repo")
|
@EnableRedisRepositories(basePackages = "com.baeldung.spring.data.redis.repo")
|
||||||
|
@ -34,6 +36,18 @@ public class RedisConfig {
|
||||||
return template;
|
return template;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public LettuceConnectionFactory lettuceConnectionFactory() {
|
||||||
|
return new LettuceConnectionFactory();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean(name = "flushRedisTemplate")
|
||||||
|
public RedisTemplate<String, String> flushRedisTemplate() {
|
||||||
|
RedisTemplate<String, String> template = new RedisTemplate<>();
|
||||||
|
template.setConnectionFactory(lettuceConnectionFactory());
|
||||||
|
return template;
|
||||||
|
}
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
MessageListenerAdapter messageListener() {
|
MessageListenerAdapter messageListener() {
|
||||||
return new MessageListenerAdapter(new RedisMessageSubscriber());
|
return new MessageListenerAdapter(new RedisMessageSubscriber());
|
||||||
|
|
|
@ -0,0 +1,92 @@
|
||||||
|
package com.baeldung.spring.data.redis.delete;
|
||||||
|
|
||||||
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import org.junit.After;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.beans.factory.annotation.Qualifier;
|
||||||
|
import org.springframework.dao.DataAccessException;
|
||||||
|
import org.springframework.data.redis.connection.RedisConnection;
|
||||||
|
import org.springframework.data.redis.core.RedisCallback;
|
||||||
|
import org.springframework.data.redis.core.RedisTemplate;
|
||||||
|
import org.springframework.data.redis.core.ValueOperations;
|
||||||
|
import org.springframework.test.annotation.DirtiesContext;
|
||||||
|
import org.springframework.test.annotation.DirtiesContext.ClassMode;
|
||||||
|
import org.springframework.test.context.ContextConfiguration;
|
||||||
|
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
|
||||||
|
|
||||||
|
import com.baeldung.spring.data.redis.config.RedisConfig;
|
||||||
|
|
||||||
|
import redis.embedded.RedisServer;
|
||||||
|
|
||||||
|
@RunWith(SpringJUnit4ClassRunner.class)
|
||||||
|
@ContextConfiguration(classes = { RedisConfig.class })
|
||||||
|
@DirtiesContext(classMode = ClassMode.BEFORE_CLASS)
|
||||||
|
public class RedisFlushDatabaseIntegrationTest {
|
||||||
|
|
||||||
|
private RedisServer redisServer;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
@Qualifier("flushRedisTemplate")
|
||||||
|
private RedisTemplate<String, String> flushRedisTemplate;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setup() throws IOException {
|
||||||
|
redisServer = new RedisServer(6390);
|
||||||
|
redisServer.start();
|
||||||
|
}
|
||||||
|
|
||||||
|
@After
|
||||||
|
public void tearDown() {
|
||||||
|
redisServer.stop();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenFlushDB_thenAllKeysInDatabaseAreCleared() {
|
||||||
|
|
||||||
|
ValueOperations<String, String> simpleValues = flushRedisTemplate.opsForValue();
|
||||||
|
String key = "key";
|
||||||
|
String value = "value";
|
||||||
|
simpleValues.set(key, value);
|
||||||
|
assertThat(simpleValues.get(key)).isEqualTo(value);
|
||||||
|
|
||||||
|
flushRedisTemplate.execute(new RedisCallback<Void>() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Void doInRedis(RedisConnection connection) throws DataAccessException {
|
||||||
|
connection.flushDb();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
assertThat(simpleValues.get(key)).isNull();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenFlushAll_thenAllKeysInDatabasesAreCleared() {
|
||||||
|
|
||||||
|
ValueOperations<String, String> simpleValues = flushRedisTemplate.opsForValue();
|
||||||
|
String key = "key";
|
||||||
|
String value = "value";
|
||||||
|
simpleValues.set(key, value);
|
||||||
|
assertThat(simpleValues.get(key)).isEqualTo(value);
|
||||||
|
|
||||||
|
flushRedisTemplate.execute(new RedisCallback<Void>() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Void doInRedis(RedisConnection connection) throws DataAccessException {
|
||||||
|
connection.flushAll();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
assertThat(simpleValues.get(key)).isNull();
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
8
pom.xml
8
pom.xml
|
@ -1339,7 +1339,7 @@
|
||||||
<!-- plugins -->
|
<!-- plugins -->
|
||||||
<!-- can't upgrade the plugin yet; as there is an issue with 2.22 no longer running all the tests-->
|
<!-- can't upgrade the plugin yet; as there is an issue with 2.22 no longer running all the tests-->
|
||||||
<maven-surefire-plugin.version>2.21.0</maven-surefire-plugin.version>
|
<maven-surefire-plugin.version>2.21.0</maven-surefire-plugin.version>
|
||||||
<maven-compiler-plugin.version>3.7.0</maven-compiler-plugin.version>
|
<maven-compiler-plugin.version>3.8.1</maven-compiler-plugin.version>
|
||||||
<exec-maven-plugin.version>1.6.0</exec-maven-plugin.version>
|
<exec-maven-plugin.version>1.6.0</exec-maven-plugin.version>
|
||||||
<java.version>1.8</java.version>
|
<java.version>1.8</java.version>
|
||||||
<log4j.version>1.2.17</log4j.version>
|
<log4j.version>1.2.17</log4j.version>
|
||||||
|
@ -1364,12 +1364,12 @@
|
||||||
<junit-platform.version>1.2.0</junit-platform.version>
|
<junit-platform.version>1.2.0</junit-platform.version>
|
||||||
<junit-jupiter.version>5.2.0</junit-jupiter.version>
|
<junit-jupiter.version>5.2.0</junit-jupiter.version>
|
||||||
<directory-maven-plugin.version>0.3.1</directory-maven-plugin.version>
|
<directory-maven-plugin.version>0.3.1</directory-maven-plugin.version>
|
||||||
<maven-install-plugin.version>2.5.1</maven-install-plugin.version>
|
<maven-install-plugin.version>2.5.2</maven-install-plugin.version>
|
||||||
<custom-pmd.version>0.0.1</custom-pmd.version>
|
<custom-pmd.version>0.0.1</custom-pmd.version>
|
||||||
<gitflow-incremental-builder.version>3.8</gitflow-incremental-builder.version>
|
<gitflow-incremental-builder.version>3.8</gitflow-incremental-builder.version>
|
||||||
<maven-jxr-plugin.version>2.3</maven-jxr-plugin.version>
|
<maven-jxr-plugin.version>3.0.0</maven-jxr-plugin.version>
|
||||||
<!-- <maven-pmd-plugin.version>3.9.0</maven-pmd-plugin.version> -->
|
<!-- <maven-pmd-plugin.version>3.9.0</maven-pmd-plugin.version> -->
|
||||||
<maven-pmd-plugin.version>3.8</maven-pmd-plugin.version>
|
<maven-pmd-plugin.version>3.13.0</maven-pmd-plugin.version>
|
||||||
<lombok.version>1.16.12</lombok.version>
|
<lombok.version>1.16.12</lombok.version>
|
||||||
<h2.version>1.4.197</h2.version>
|
<h2.version>1.4.197</h2.version>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
|
@ -0,0 +1,23 @@
|
||||||
|
package com.baeldung.spring.serverconfig;
|
||||||
|
|
||||||
|
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.RestController;
|
||||||
|
|
||||||
|
import reactor.core.publisher.Mono;
|
||||||
|
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("/timeout")
|
||||||
|
public class TimeoutController {
|
||||||
|
|
||||||
|
@GetMapping("/{timeout}")
|
||||||
|
private Mono<String> timeout(@PathVariable int timeout) {
|
||||||
|
try {
|
||||||
|
Thread.sleep(timeout * 1000);
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
Thread.currentThread().interrupt();
|
||||||
|
}
|
||||||
|
return Mono.just("OK");
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,85 @@
|
||||||
|
package com.baeldung.spring.serverconfig;
|
||||||
|
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
import javax.net.ssl.SSLException;
|
||||||
|
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Rule;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.rules.ExpectedException;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
import org.springframework.boot.test.context.SpringBootTest;
|
||||||
|
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
|
||||||
|
import org.springframework.http.client.reactive.ReactorClientHttpConnector;
|
||||||
|
import org.springframework.test.annotation.DirtiesContext;
|
||||||
|
import org.springframework.test.context.junit4.SpringRunner;
|
||||||
|
import org.springframework.test.web.reactive.server.WebTestClient;
|
||||||
|
|
||||||
|
import io.netty.channel.ChannelOption;
|
||||||
|
import io.netty.handler.ssl.SslContext;
|
||||||
|
import io.netty.handler.ssl.SslContextBuilder;
|
||||||
|
import io.netty.handler.ssl.util.InsecureTrustManagerFactory;
|
||||||
|
import io.netty.handler.timeout.ReadTimeoutException;
|
||||||
|
import io.netty.handler.timeout.ReadTimeoutHandler;
|
||||||
|
import io.netty.handler.timeout.WriteTimeoutHandler;
|
||||||
|
import reactor.netty.http.client.HttpClient;
|
||||||
|
import reactor.netty.tcp.TcpClient;
|
||||||
|
|
||||||
|
@RunWith(SpringRunner.class)
|
||||||
|
@SpringBootTest(webEnvironment = WebEnvironment.DEFINED_PORT)
|
||||||
|
@DirtiesContext
|
||||||
|
public class TimeoutLiveTest {
|
||||||
|
|
||||||
|
private static final String BASE_URL = "https://localhost:8443";
|
||||||
|
private static final int TIMEOUT_MILLIS = 2000;
|
||||||
|
|
||||||
|
private WebTestClient webTestClient;
|
||||||
|
|
||||||
|
@Rule
|
||||||
|
public ExpectedException exception = ExpectedException.none();
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setup() throws SSLException {
|
||||||
|
webTestClient = WebTestClient.bindToServer(getConnector())
|
||||||
|
.baseUrl(BASE_URL)
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void shouldTimeout() {
|
||||||
|
exception.expect(ReadTimeoutException.class);
|
||||||
|
webTestClient.get()
|
||||||
|
.uri("/timeout/{timeout}", 3)
|
||||||
|
.exchange();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void shouldNotTimeout() {
|
||||||
|
WebTestClient.ResponseSpec response = webTestClient.get()
|
||||||
|
.uri("/timeout/{timeout}", 1)
|
||||||
|
.exchange();
|
||||||
|
response.expectStatus()
|
||||||
|
.isOk()
|
||||||
|
.expectBody(String.class)
|
||||||
|
.isEqualTo("OK");
|
||||||
|
}
|
||||||
|
|
||||||
|
private ReactorClientHttpConnector getConnector() throws SSLException {
|
||||||
|
SslContext sslContext = SslContextBuilder
|
||||||
|
.forClient()
|
||||||
|
.trustManager(InsecureTrustManagerFactory.INSTANCE)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
TcpClient tcpClient = TcpClient
|
||||||
|
.create()
|
||||||
|
.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, TIMEOUT_MILLIS)
|
||||||
|
.doOnConnected(connection -> {
|
||||||
|
connection.addHandlerLast(new ReadTimeoutHandler(TIMEOUT_MILLIS, TimeUnit.MILLISECONDS));
|
||||||
|
connection.addHandlerLast(new WriteTimeoutHandler(TIMEOUT_MILLIS, TimeUnit.MILLISECONDS));
|
||||||
|
});
|
||||||
|
|
||||||
|
HttpClient httpClient = HttpClient.from(tcpClient).secure(t -> t.sslContext(sslContext));
|
||||||
|
return new ReactorClientHttpConnector(httpClient);
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,8 +1,10 @@
|
||||||
package org.baeldung.batch.model;
|
package org.baeldung.batch.model;
|
||||||
|
|
||||||
import java.util.Date;
|
import org.baeldung.batch.service.adapter.LocalDateTimeAdapter;
|
||||||
|
|
||||||
import javax.xml.bind.annotation.XmlRootElement;
|
import javax.xml.bind.annotation.XmlRootElement;
|
||||||
|
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
|
||||||
@SuppressWarnings("restriction")
|
@SuppressWarnings("restriction")
|
||||||
@XmlRootElement(name = "transactionRecord")
|
@XmlRootElement(name = "transactionRecord")
|
||||||
|
@ -11,7 +13,7 @@ public class Transaction {
|
||||||
private int userId;
|
private int userId;
|
||||||
private int age;
|
private int age;
|
||||||
private String postCode;
|
private String postCode;
|
||||||
private Date transactionDate;
|
private LocalDateTime transactionDate;
|
||||||
private double amount;
|
private double amount;
|
||||||
|
|
||||||
/* getters and setters for the attributes */
|
/* getters and setters for the attributes */
|
||||||
|
@ -32,11 +34,12 @@ public class Transaction {
|
||||||
this.userId = userId;
|
this.userId = userId;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Date getTransactionDate() {
|
@XmlJavaTypeAdapter(LocalDateTimeAdapter.class)
|
||||||
|
public LocalDateTime getTransactionDate() {
|
||||||
return transactionDate;
|
return transactionDate;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setTransactionDate(Date transactionDate) {
|
public void setTransactionDate(LocalDateTime transactionDate) {
|
||||||
this.transactionDate = transactionDate;
|
this.transactionDate = transactionDate;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,18 +1,19 @@
|
||||||
package org.baeldung.batch.service;
|
package org.baeldung.batch.service;
|
||||||
|
|
||||||
import java.text.ParseException;
|
|
||||||
import java.text.SimpleDateFormat;
|
|
||||||
|
|
||||||
import org.baeldung.batch.model.Transaction;
|
import org.baeldung.batch.model.Transaction;
|
||||||
import org.springframework.batch.item.file.mapping.FieldSetMapper;
|
import org.springframework.batch.item.file.mapping.FieldSetMapper;
|
||||||
import org.springframework.batch.item.file.transform.FieldSet;
|
import org.springframework.batch.item.file.transform.FieldSet;
|
||||||
import org.springframework.validation.BindException;
|
import org.springframework.validation.BindException;
|
||||||
|
|
||||||
|
import java.time.LocalDate;
|
||||||
|
import java.time.format.DateTimeFormatter;
|
||||||
|
|
||||||
public class RecordFieldSetMapper implements FieldSetMapper<Transaction> {
|
public class RecordFieldSetMapper implements FieldSetMapper<Transaction> {
|
||||||
|
|
||||||
public Transaction mapFieldSet(FieldSet fieldSet) throws BindException {
|
public Transaction mapFieldSet(FieldSet fieldSet) throws BindException {
|
||||||
|
|
||||||
SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
|
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("d/M/yyy");
|
||||||
|
|
||||||
Transaction transaction = new Transaction();
|
Transaction transaction = new Transaction();
|
||||||
// you can either use the indices or custom names
|
// you can either use the indices or custom names
|
||||||
// I personally prefer the custom names easy for debugging and
|
// I personally prefer the custom names easy for debugging and
|
||||||
|
@ -20,13 +21,10 @@ public class RecordFieldSetMapper implements FieldSetMapper<Transaction> {
|
||||||
transaction.setUsername(fieldSet.readString("username"));
|
transaction.setUsername(fieldSet.readString("username"));
|
||||||
transaction.setUserId(fieldSet.readInt("userid"));
|
transaction.setUserId(fieldSet.readInt("userid"));
|
||||||
transaction.setAmount(fieldSet.readDouble(3));
|
transaction.setAmount(fieldSet.readDouble(3));
|
||||||
|
|
||||||
// Converting the date
|
// Converting the date
|
||||||
String dateString = fieldSet.readString(2);
|
String dateString = fieldSet.readString(2);
|
||||||
try {
|
transaction.setTransactionDate(LocalDate.parse(dateString, formatter).atStartOfDay());
|
||||||
transaction.setTransactionDate(dateFormat.parse(dateString));
|
|
||||||
} catch (ParseException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
|
|
||||||
return transaction;
|
return transaction;
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,19 @@
|
||||||
|
package org.baeldung.batch.service.adapter;
|
||||||
|
|
||||||
|
import javax.xml.bind.annotation.adapters.XmlAdapter;
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
import java.time.format.DateTimeFormatter;
|
||||||
|
|
||||||
|
public class LocalDateTimeAdapter extends XmlAdapter<String, LocalDateTime> {
|
||||||
|
|
||||||
|
private static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
|
||||||
|
private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern(DATE_FORMAT);
|
||||||
|
|
||||||
|
public LocalDateTime unmarshal(String v) throws Exception {
|
||||||
|
return LocalDateTime.parse(v, DATE_TIME_FORMATTER);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String marshal(LocalDateTime v) throws Exception {
|
||||||
|
return DATE_TIME_FORMATTER.format(v);
|
||||||
|
}
|
||||||
|
}
|
|
@ -2,19 +2,19 @@
|
||||||
<transactionRecord>
|
<transactionRecord>
|
||||||
<transactionRecord>
|
<transactionRecord>
|
||||||
<amount>10000.0</amount>
|
<amount>10000.0</amount>
|
||||||
<transactionDate>2015-10-31T00:00:00+05:30</transactionDate>
|
<transactionDate>2015-10-31 00:00:00</transactionDate>
|
||||||
<userId>1234</userId>
|
<userId>1234</userId>
|
||||||
<username>devendra</username>
|
<username>devendra</username>
|
||||||
</transactionRecord>
|
</transactionRecord>
|
||||||
<transactionRecord>
|
<transactionRecord>
|
||||||
<amount>12321.0</amount>
|
<amount>12321.0</amount>
|
||||||
<transactionDate>2015-12-03T00:00:00+05:30</transactionDate>
|
<transactionDate>2015-12-03 00:00:00</transactionDate>
|
||||||
<userId>2134</userId>
|
<userId>2134</userId>
|
||||||
<username>john</username>
|
<username>john</username>
|
||||||
</transactionRecord>
|
</transactionRecord>
|
||||||
<transactionRecord>
|
<transactionRecord>
|
||||||
<amount>23411.0</amount>
|
<amount>23411.0</amount>
|
||||||
<transactionDate>2015-02-02T00:00:00+05:30</transactionDate>
|
<transactionDate>2015-02-02 00:00:00</transactionDate>
|
||||||
<userId>2134</userId>
|
<userId>2134</userId>
|
||||||
<username>robin</username>
|
<username>robin</username>
|
||||||
</transactionRecord>
|
</transactionRecord>
|
||||||
|
|
|
@ -2,19 +2,19 @@
|
||||||
<transactionRecord>
|
<transactionRecord>
|
||||||
<transactionRecord>
|
<transactionRecord>
|
||||||
<amount>10000.0</amount>
|
<amount>10000.0</amount>
|
||||||
<transactionDate>2015-10-31T00:00:00+05:30</transactionDate>
|
<transactionDate>2015-10-31 00:00:00</transactionDate>
|
||||||
<userId>1234</userId>
|
<userId>1234</userId>
|
||||||
<username>devendra</username>
|
<username>devendra</username>
|
||||||
</transactionRecord>
|
</transactionRecord>
|
||||||
<transactionRecord>
|
<transactionRecord>
|
||||||
<amount>12321.0</amount>
|
<amount>12321.0</amount>
|
||||||
<transactionDate>2015-12-03T00:00:00+05:30</transactionDate>
|
<transactionDate>2015-12-03 00:00:00</transactionDate>
|
||||||
<userId>2134</userId>
|
<userId>2134</userId>
|
||||||
<username>john</username>
|
<username>john</username>
|
||||||
</transactionRecord>
|
</transactionRecord>
|
||||||
<transactionRecord>
|
<transactionRecord>
|
||||||
<amount>23411.0</amount>
|
<amount>23411.0</amount>
|
||||||
<transactionDate>2015-02-02T00:00:00+05:30</transactionDate>
|
<transactionDate>2015-02-02 00:00:00</transactionDate>
|
||||||
<userId>2134</userId>
|
<userId>2134</userId>
|
||||||
<username>robin</username>
|
<username>robin</username>
|
||||||
</transactionRecord>
|
</transactionRecord>
|
||||||
|
|
|
@ -2,19 +2,19 @@
|
||||||
<transactionRecord>
|
<transactionRecord>
|
||||||
<transactionRecord>
|
<transactionRecord>
|
||||||
<amount>10000.0</amount>
|
<amount>10000.0</amount>
|
||||||
<transactionDate>2015-10-31T00:00:00+05:30</transactionDate>
|
<transactionDate>2015-10-31 00:00:00</transactionDate>
|
||||||
<userId>1234</userId>
|
<userId>1234</userId>
|
||||||
<username>devendra</username>
|
<username>devendra</username>
|
||||||
</transactionRecord>
|
</transactionRecord>
|
||||||
<transactionRecord>
|
<transactionRecord>
|
||||||
<amount>12321.0</amount>
|
<amount>12321.0</amount>
|
||||||
<transactionDate>2015-12-03T00:00:00+05:30</transactionDate>
|
<transactionDate>2015-12-03 00:00:00</transactionDate>
|
||||||
<userId>2134</userId>
|
<userId>2134</userId>
|
||||||
<username>john</username>
|
<username>john</username>
|
||||||
</transactionRecord>
|
</transactionRecord>
|
||||||
<transactionRecord>
|
<transactionRecord>
|
||||||
<amount>23411.0</amount>
|
<amount>23411.0</amount>
|
||||||
<transactionDate>2015-02-02T00:00:00+05:30</transactionDate>
|
<transactionDate>2015-02-02 00:00:00</transactionDate>
|
||||||
<userId>2134</userId>
|
<userId>2134</userId>
|
||||||
<username>robin</username>
|
<username>robin</username>
|
||||||
</transactionRecord>
|
</transactionRecord>
|
||||||
|
|
|
@ -2,19 +2,19 @@
|
||||||
<transactionRecord>
|
<transactionRecord>
|
||||||
<transactionRecord>
|
<transactionRecord>
|
||||||
<amount>10000.0</amount>
|
<amount>10000.0</amount>
|
||||||
<transactionDate>2015-10-31T00:00:00+05:30</transactionDate>
|
<transactionDate>2015-10-31 00:00:00</transactionDate>
|
||||||
<userId>1234</userId>
|
<userId>1234</userId>
|
||||||
<username>devendra</username>
|
<username>devendra</username>
|
||||||
</transactionRecord>
|
</transactionRecord>
|
||||||
<transactionRecord>
|
<transactionRecord>
|
||||||
<amount>12321.0</amount>
|
<amount>12321.0</amount>
|
||||||
<transactionDate>2015-12-03T00:00:00+05:30</transactionDate>
|
<transactionDate>2015-12-03 00:00:00</transactionDate>
|
||||||
<userId>2134</userId>
|
<userId>2134</userId>
|
||||||
<username>john</username>
|
<username>john</username>
|
||||||
</transactionRecord>
|
</transactionRecord>
|
||||||
<transactionRecord>
|
<transactionRecord>
|
||||||
<amount>23411.0</amount>
|
<amount>23411.0</amount>
|
||||||
<transactionDate>2015-02-02T00:00:00+05:30</transactionDate>
|
<transactionDate>2015-02-02 00:00:00</transactionDate>
|
||||||
<userId>2134</userId>
|
<userId>2134</userId>
|
||||||
<username>robin</username>
|
<username>robin</username>
|
||||||
</transactionRecord>
|
</transactionRecord>
|
||||||
|
|
|
@ -2,19 +2,19 @@
|
||||||
<transactionRecord>
|
<transactionRecord>
|
||||||
<transactionRecord>
|
<transactionRecord>
|
||||||
<amount>10000.0</amount>
|
<amount>10000.0</amount>
|
||||||
<transactionDate>2015-10-31T00:00:00+05:30</transactionDate>
|
<transactionDate>2015-10-31 00:00:00</transactionDate>
|
||||||
<userId>1234</userId>
|
<userId>1234</userId>
|
||||||
<username>devendra</username>
|
<username>devendra</username>
|
||||||
</transactionRecord>
|
</transactionRecord>
|
||||||
<transactionRecord>
|
<transactionRecord>
|
||||||
<amount>12321.0</amount>
|
<amount>12321.0</amount>
|
||||||
<transactionDate>2015-12-03T00:00:00+05:30</transactionDate>
|
<transactionDate>2015-12-03 00:00:00</transactionDate>
|
||||||
<userId>2134</userId>
|
<userId>2134</userId>
|
||||||
<username>john</username>
|
<username>john</username>
|
||||||
</transactionRecord>
|
</transactionRecord>
|
||||||
<transactionRecord>
|
<transactionRecord>
|
||||||
<amount>23411.0</amount>
|
<amount>23411.0</amount>
|
||||||
<transactionDate>2015-02-02T00:00:00+05:30</transactionDate>
|
<transactionDate>2015-02-02 00:00:00</transactionDate>
|
||||||
<userId>2134</userId>
|
<userId>2134</userId>
|
||||||
<username>robin</username>
|
<username>robin</username>
|
||||||
</transactionRecord>
|
</transactionRecord>
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?><transactionRecord><transactionRecord><age>10</age><amount>10000.0</amount><postCode>430222</postCode><transactionDate>2015-10-31T00:00:00+05:30</transactionDate><userId>1234</userId><username>sammy</username></transactionRecord><transactionRecord><age>10</age><amount>12321.0</amount><postCode>430222</postCode><transactionDate>2015-12-03T00:00:00+05:30</transactionDate><userId>9999</userId><username>john</username></transactionRecord></transactionRecord>
|
<?xml version="1.0" encoding="UTF-8"?><transactionRecord><transactionRecord><age>10</age><amount>10000.0</amount><postCode>430222</postCode><transactionDate>2015-10-31 00:00:00</transactionDate><userId>1234</userId><username>sammy</username></transactionRecord><transactionRecord><age>10</age><amount>12321.0</amount><postCode>430222</postCode><transactionDate>2015-12-03 00:00:00</transactionDate><userId>9999</userId><username>john</username></transactionRecord></transactionRecord>
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?><transactionRecord><transactionRecord><amount>10000.0</amount><transactionDate>2015-10-31T00:00:00+05:30</transactionDate><userId>1234</userId><username>devendra</username></transactionRecord><transactionRecord><amount>12321.0</amount><transactionDate>2015-12-03T00:00:00+05:30</transactionDate><userId>2134</userId><username>john</username></transactionRecord><transactionRecord><amount>23411.0</amount><transactionDate>2015-02-02T00:00:00+05:30</transactionDate><userId>2134</userId><username>robin</username></transactionRecord></transactionRecord>
|
<?xml version="1.0" encoding="UTF-8"?><transactionRecord><transactionRecord><amount>10000.0</amount><transactionDate>2015-10-31 00:00:00</transactionDate><userId>1234</userId><username>devendra</username></transactionRecord><transactionRecord><amount>12321.0</amount><transactionDate>2015-12-03 00:00:00</transactionDate><userId>2134</userId><username>john</username></transactionRecord><transactionRecord><amount>23411.0</amount><transactionDate>2015-02-02 00:00:00</transactionDate><userId>2134</userId><username>robin</username></transactionRecord></transactionRecord>
|
|
@ -1 +1 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?><transactionRecord><transactionRecord><age>10</age><amount>10000.0</amount><postCode>430222</postCode><transactionDate>2015-10-31T00:00:00+05:30</transactionDate><userId>1234</userId><username>sammy</username></transactionRecord><transactionRecord><age>10</age><amount>12321.0</amount><postCode>430222</postCode><transactionDate>2015-12-03T00:00:00+05:30</transactionDate><userId>9999</userId><username>john</username></transactionRecord></transactionRecord>
|
<?xml version="1.0" encoding="UTF-8"?><transactionRecord><transactionRecord><age>10</age><amount>10000.0</amount><postCode>430222</postCode><transactionDate>2015-10-31 00:00:00</transactionDate><userId>1234</userId><username>sammy</username></transactionRecord><transactionRecord><age>10</age><amount>12321.0</amount><postCode>430222</postCode><transactionDate>2015-12-03 00:00:00</transactionDate><userId>9999</userId><username>john</username></transactionRecord></transactionRecord>
|
|
@ -32,6 +32,7 @@
|
||||||
<module>spring-boot-crud</module>
|
<module>spring-boot-crud</module>
|
||||||
<module>spring-boot-data</module>
|
<module>spring-boot-data</module>
|
||||||
<module>spring-boot-environment</module>
|
<module>spring-boot-environment</module>
|
||||||
|
<module>spring-boot-exceptions</module>
|
||||||
<module>spring-boot-flowable</module>
|
<module>spring-boot-flowable</module>
|
||||||
<!-- <module>spring-boot-gradle</module> --> <!-- Not a maven project -->
|
<!-- <module>spring-boot-gradle</module> --> <!-- Not a maven project -->
|
||||||
<module>spring-boot-jasypt</module>
|
<module>spring-boot-jasypt</module>
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
## Spring Boot
|
||||||
|
|
||||||
|
This module contains articles about Spring Boot Exceptions
|
||||||
|
|
||||||
|
### Relevant Articles:
|
||||||
|
|
||||||
|
- [The BeanDefinitionOverrideException in Spring Boot](https://www.baeldung.com/spring-boot-bean-definition-override-exception)
|
|
@ -0,0 +1,96 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<artifactId>spring-boot-exceptions</artifactId>
|
||||||
|
<name>spring-boot-exceptions</name>
|
||||||
|
<packaging>jar</packaging>
|
||||||
|
<description>Demo project for working with Spring Boot exceptions</description>
|
||||||
|
|
||||||
|
<parent>
|
||||||
|
<groupId>com.baeldung</groupId>
|
||||||
|
<artifactId>parent-boot-2</artifactId>
|
||||||
|
<version>0.0.1-SNAPSHOT</version>
|
||||||
|
<relativePath>../../parent-boot-2</relativePath>
|
||||||
|
</parent>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter</artifactId>
|
||||||
|
<version>2.2.3.RELEASE</version>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<finalName>spring-boot-exceptions</finalName>
|
||||||
|
<resources>
|
||||||
|
<resource>
|
||||||
|
<directory>src/main/resources</directory>
|
||||||
|
<filtering>true</filtering>
|
||||||
|
</resource>
|
||||||
|
</resources>
|
||||||
|
|
||||||
|
<plugins>
|
||||||
|
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-war-plugin</artifactId>
|
||||||
|
</plugin>
|
||||||
|
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-resources-plugin</artifactId>
|
||||||
|
<configuration>
|
||||||
|
<delimiters>
|
||||||
|
<delimiter>@</delimiter>
|
||||||
|
</delimiters>
|
||||||
|
<useDefaultDelimiters>false</useDefaultDelimiters>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
|
||||||
|
</build>
|
||||||
|
|
||||||
|
<profiles>
|
||||||
|
<profile>
|
||||||
|
<id>autoconfiguration</id>
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-surefire-plugin</artifactId>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<phase>integration-test</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>test</goal>
|
||||||
|
</goals>
|
||||||
|
<configuration>
|
||||||
|
<excludes>
|
||||||
|
<exclude>**/*LiveTest.java</exclude>
|
||||||
|
<exclude>**/*IntegrationTest.java</exclude>
|
||||||
|
<exclude>**/*IntTest.java</exclude>
|
||||||
|
</excludes>
|
||||||
|
<includes>
|
||||||
|
<include>**/AutoconfigurationTest.java</include>
|
||||||
|
</includes>
|
||||||
|
</configuration>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
<configuration>
|
||||||
|
<systemPropertyVariables>
|
||||||
|
<test.mime>json</test.mime>
|
||||||
|
</systemPropertyVariables>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
</profile>
|
||||||
|
</profiles>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<!-- The main class to start by executing java -jar -->
|
||||||
|
<start-class>com.baeldung.intro.App</start-class>
|
||||||
|
</properties>
|
||||||
|
</project>
|
|
@ -0,0 +1,13 @@
|
||||||
|
<configuration>
|
||||||
|
<include resource="/org/springframework/boot/logging/logback/base.xml"/>
|
||||||
|
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
|
||||||
|
<encoder>
|
||||||
|
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
|
||||||
|
</pattern>
|
||||||
|
</encoder>
|
||||||
|
</appender>
|
||||||
|
<root level="error">
|
||||||
|
<appender-ref ref="STDOUT"/>
|
||||||
|
</root>
|
||||||
|
<logger name="com.baeldung.testloglevel" level="debug"/>
|
||||||
|
</configuration>
|
|
@ -43,6 +43,12 @@
|
||||||
<artifactId>httpcore</artifactId>
|
<artifactId>httpcore</artifactId>
|
||||||
<version>${httpcore.version}</version>
|
<version>${httpcore.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-configuration-processor</artifactId>
|
||||||
|
<version>${configuration-processor.version}</version>
|
||||||
|
<optional>true</optional>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<dependencyManagement>
|
<dependencyManagement>
|
||||||
|
@ -121,6 +127,7 @@
|
||||||
<guava.version>20.0</guava.version>
|
<guava.version>20.0</guava.version>
|
||||||
<httpcore.version>4.4.11</httpcore.version>
|
<httpcore.version>4.4.11</httpcore.version>
|
||||||
<resource.delimiter>@</resource.delimiter>
|
<resource.delimiter>@</resource.delimiter>
|
||||||
|
<configuration-processor.version>2.2.4.RELEASE</configuration-processor.version>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
</project>
|
</project>
|
||||||
|
|
|
@ -0,0 +1,37 @@
|
||||||
|
package com.baeldung.configuration.processor;
|
||||||
|
|
||||||
|
import org.springframework.boot.context.properties.*;
|
||||||
|
import org.springframework.context.annotation.*;
|
||||||
|
|
||||||
|
@Configuration
|
||||||
|
@ConfigurationProperties(prefix = "com.baeldung")
|
||||||
|
public class CustomProperties {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The url to connect to.
|
||||||
|
*/
|
||||||
|
String url;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The time to wait for the connection.
|
||||||
|
*/
|
||||||
|
private int timeoutInMilliSeconds = 1000;
|
||||||
|
|
||||||
|
|
||||||
|
public String getUrl() {
|
||||||
|
return url;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setUrl(String url) {
|
||||||
|
this.url = url;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getTimeoutInMilliSeconds() {
|
||||||
|
return timeoutInMilliSeconds;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTimeoutInMilliSeconds(int timeoutInMilliSeconds) {
|
||||||
|
this.timeoutInMilliSeconds = timeoutInMilliSeconds;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,12 @@
|
||||||
|
package com.baeldung.configuration.processor;
|
||||||
|
|
||||||
|
import org.springframework.boot.*;
|
||||||
|
import org.springframework.boot.autoconfigure.*;
|
||||||
|
|
||||||
|
@SpringBootApplication
|
||||||
|
public class DemoApplication {
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
SpringApplication.run(DemoApplication.class, args);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,22 @@
|
||||||
|
package com.baeldung.configuration.processor;
|
||||||
|
|
||||||
|
import org.springframework.beans.factory.annotation.*;
|
||||||
|
import org.springframework.stereotype.*;
|
||||||
|
|
||||||
|
@Component
|
||||||
|
public class PropertyBeanInjection {
|
||||||
|
|
||||||
|
private final CustomProperties customProperties;
|
||||||
|
|
||||||
|
PropertyBeanInjection(@Autowired CustomProperties customProperties) {
|
||||||
|
this.customProperties = customProperties;
|
||||||
|
}
|
||||||
|
|
||||||
|
String getUrl() {
|
||||||
|
return customProperties.getUrl();
|
||||||
|
}
|
||||||
|
|
||||||
|
int getTimeoutInMilliseconds() {
|
||||||
|
return customProperties.getTimeoutInMilliSeconds();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,24 @@
|
||||||
|
package com.baeldung.configuration.processor;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.*;
|
||||||
|
import org.junit.runner.*;
|
||||||
|
import org.springframework.beans.factory.annotation.*;
|
||||||
|
import org.springframework.boot.test.context.*;
|
||||||
|
import org.springframework.test.context.*;
|
||||||
|
import org.springframework.test.context.junit4.*;
|
||||||
|
|
||||||
|
@RunWith(SpringRunner.class)
|
||||||
|
@TestPropertySource("/configuration-processor.properties")
|
||||||
|
@SpringBootTest(classes = DemoApplication.class)
|
||||||
|
class PropertyBeanInjectionUnitTest {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private PropertyBeanInjection propertyBeanInjection;
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void checkThatCustomPropertiesHaveTheCorrectValueFromPropertiesFile() {
|
||||||
|
Assertions.assertEquals("www.abc.test.com", propertyBeanInjection.getUrl());
|
||||||
|
Assertions.assertEquals(2000, propertyBeanInjection.getTimeoutInMilliseconds());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,2 @@
|
||||||
|
com.baeldung.url=www.abc.test.com
|
||||||
|
com.baeldung.timeout-in-milli-seconds=2000
|
|
@ -31,4 +31,3 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring
|
||||||
- [Spring Shutdown Callbacks](https://www.baeldung.com/spring-shutdown-callbacks)
|
- [Spring Shutdown Callbacks](https://www.baeldung.com/spring-shutdown-callbacks)
|
||||||
- [Container Configuration in Spring Boot 2](https://www.baeldung.com/embeddedservletcontainercustomizer-configurableembeddedservletcontainer-spring-boot)
|
- [Container Configuration in Spring Boot 2](https://www.baeldung.com/embeddedservletcontainercustomizer-configurableembeddedservletcontainer-spring-boot)
|
||||||
- [Validation in Spring Boot](https://www.baeldung.com/spring-boot-bean-validation)
|
- [Validation in Spring Boot](https://www.baeldung.com/spring-boot-bean-validation)
|
||||||
- [The BeanDefinitionOverrideException in Spring Boot](https://www.baeldung.com/spring-boot-bean-definition-override-exception)
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
package org.baeldung;
|
package com.baeldung;
|
||||||
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
|
@ -1,4 +1,4 @@
|
||||||
package org.baeldung;
|
package com.baeldung;
|
||||||
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
|
@ -1,4 +1,4 @@
|
||||||
package org.baeldung.store;
|
package com.baeldung.store;
|
||||||
|
|
||||||
import org.springframework.context.annotation.Bean;
|
import org.springframework.context.annotation.Bean;
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
package org.baeldung.store;
|
package com.baeldung.store;
|
||||||
|
|
||||||
public interface Item {
|
public interface Item {
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
package org.baeldung.store;
|
package com.baeldung.store;
|
||||||
|
|
||||||
public class ItemImpl1 implements Item {
|
public class ItemImpl1 implements Item {
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
package org.baeldung.store;
|
package com.baeldung.store;
|
||||||
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
|
|
@ -6,9 +6,9 @@
|
||||||
|
|
||||||
<!-- Autowired injection -->
|
<!-- Autowired injection -->
|
||||||
|
|
||||||
<bean id="item" class="org.baeldung.store.ItemImpl1" />
|
<bean id="item" class="com.baeldung.store.ItemImpl1" />
|
||||||
|
|
||||||
<bean id="xml-store-by-autowire-type" class="org.baeldung.store.Store" autowire="byType">
|
<bean id="xml-store-by-autowire-type" class="com.baeldung.store.Store" autowire="byType">
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
</beans>
|
</beans>
|
|
@ -6,28 +6,28 @@
|
||||||
|
|
||||||
<!-- Constructor injection -->
|
<!-- Constructor injection -->
|
||||||
|
|
||||||
<bean id="item1" class="org.baeldung.store.ItemImpl1" />
|
<bean id="item1" class="com.baeldung.store.ItemImpl1" />
|
||||||
<bean id="xml-store-by-constructor" class="org.baeldung.store.Store">
|
<bean id="xml-store-by-constructor" class="com.baeldung.store.Store">
|
||||||
<constructor-arg type="Item" index="0" name="item" ref="item1" />
|
<constructor-arg type="Item" index="0" name="item" ref="item1" />
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
<!-- Setter injection -->
|
<!-- Setter injection -->
|
||||||
|
|
||||||
<bean id="xml-store-by-setter" class="org.baeldung.store.Store">
|
<bean id="xml-store-by-setter" class="com.baeldung.store.Store">
|
||||||
<property name="item" ref="item1" />
|
<property name="item" ref="item1" />
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
<!-- Autowired injection -->
|
<!-- Autowired injection -->
|
||||||
|
|
||||||
<bean id="item" class="org.baeldung.store.ItemImpl1" />
|
<bean id="item" class="com.baeldung.store.ItemImpl1" />
|
||||||
|
|
||||||
<bean id="xml-store-by-autowire-name" class="org.baeldung.store.Store" autowire="byName">
|
<bean id="xml-store-by-autowire-name" class="com.baeldung.store.Store" autowire="byName">
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
<!-- Lazy instantiation -->
|
<!-- Lazy instantiation -->
|
||||||
|
|
||||||
<bean id="item1-lazy" class="org.baeldung.store.ItemImpl1" lazy-init="true" />
|
<bean id="item1-lazy" class="com.baeldung.store.ItemImpl1" lazy-init="true" />
|
||||||
<bean id="xml-store-by-setter-lazy" class="org.baeldung.store.Store">
|
<bean id="xml-store-by-setter-lazy" class="com.baeldung.store.Store">
|
||||||
<property name="item" ref="item1-lazy" />
|
<property name="item" ref="item1-lazy" />
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
package org.baeldung.store;
|
package com.baeldung.store;
|
||||||
|
|
||||||
import static org.junit.Assert.assertNotNull;
|
import static org.junit.Assert.assertNotNull;
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
package org.baeldung.store;
|
package com.baeldung.store;
|
||||||
|
|
||||||
import static org.junit.Assert.assertNotNull;
|
import static org.junit.Assert.assertNotNull;
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
package org.baeldung.store;
|
package com.baeldung.store;
|
||||||
|
|
||||||
import static org.junit.Assert.assertNotNull;
|
import static org.junit.Assert.assertNotNull;
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
package org.baeldung;
|
package com.baeldung;
|
||||||
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
|
@ -1,4 +1,4 @@
|
||||||
package org.baeldung;
|
package com.baeldung;
|
||||||
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
|
@ -1,4 +1,4 @@
|
||||||
package org.baeldung;
|
package com.baeldung;
|
||||||
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
|
@ -1,4 +1,4 @@
|
||||||
package org.baeldung;
|
package com.baeldung;
|
||||||
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
|
@ -1,4 +1,4 @@
|
||||||
package org.baeldung;
|
package com.baeldung;
|
||||||
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
|
@ -1,4 +1,4 @@
|
||||||
package org.baeldung;
|
package com.baeldung;
|
||||||
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
|
@ -1,4 +1,4 @@
|
||||||
package org.baeldung;
|
package com.baeldung;
|
||||||
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
|
@ -1,4 +1,4 @@
|
||||||
package org.baeldung;
|
package com.baeldung;
|
||||||
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
|
@ -1,4 +1,4 @@
|
||||||
package org.baeldung;
|
package com.baeldung;
|
||||||
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
|
@ -1,4 +1,4 @@
|
||||||
package org.baeldung;
|
package com.baeldung;
|
||||||
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
|
@ -1,4 +1,4 @@
|
||||||
package org.baeldung;
|
package com.baeldung;
|
||||||
|
|
||||||
import io.katharsis.spring.boot.v3.KatharsisConfigV3;
|
import io.katharsis.spring.boot.v3.KatharsisConfigV3;
|
||||||
|
|
|
@ -1,14 +1,14 @@
|
||||||
package org.baeldung;
|
package com.baeldung;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
|
|
||||||
import javax.annotation.PostConstruct;
|
import javax.annotation.PostConstruct;
|
||||||
|
|
||||||
import org.baeldung.persistence.dao.RoleRepository;
|
import com.baeldung.persistence.dao.RoleRepository;
|
||||||
import org.baeldung.persistence.dao.UserRepository;
|
import com.baeldung.persistence.dao.UserRepository;
|
||||||
import org.baeldung.persistence.model.Role;
|
import com.baeldung.persistence.model.Role;
|
||||||
import org.baeldung.persistence.model.User;
|
import com.baeldung.persistence.model.User;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
package org.baeldung.persistence.dao;
|
package com.baeldung.persistence.dao;
|
||||||
|
|
||||||
import org.baeldung.persistence.model.Role;
|
import com.baeldung.persistence.model.Role;
|
||||||
import org.springframework.data.jpa.repository.JpaRepository;
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
|
|
||||||
public interface RoleRepository extends JpaRepository<Role, Long> {
|
public interface RoleRepository extends JpaRepository<Role, Long> {
|
|
@ -1,6 +1,6 @@
|
||||||
package org.baeldung.persistence.dao;
|
package com.baeldung.persistence.dao;
|
||||||
|
|
||||||
import org.baeldung.persistence.model.User;
|
import com.baeldung.persistence.model.User;
|
||||||
import org.springframework.data.jpa.repository.JpaRepository;
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
|
|
||||||
public interface UserRepository extends JpaRepository<User, Long> {
|
public interface UserRepository extends JpaRepository<User, Long> {
|
|
@ -1,12 +1,12 @@
|
||||||
package org.baeldung.persistence.katharsis;
|
package com.baeldung.persistence.katharsis;
|
||||||
|
|
||||||
|
|
||||||
|
import com.baeldung.persistence.dao.RoleRepository;
|
||||||
import io.katharsis.queryspec.QuerySpec;
|
import io.katharsis.queryspec.QuerySpec;
|
||||||
import io.katharsis.repository.ResourceRepositoryV2;
|
import io.katharsis.repository.ResourceRepositoryV2;
|
||||||
import io.katharsis.resource.list.ResourceList;
|
import io.katharsis.resource.list.ResourceList;
|
||||||
|
|
||||||
import org.baeldung.persistence.dao.RoleRepository;
|
import com.baeldung.persistence.model.Role;
|
||||||
import org.baeldung.persistence.model.Role;
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
package org.baeldung.persistence.katharsis;
|
package com.baeldung.persistence.katharsis;
|
||||||
|
|
||||||
|
import com.baeldung.persistence.dao.UserRepository;
|
||||||
|
import com.baeldung.persistence.model.User;
|
||||||
import io.katharsis.queryspec.QuerySpec;
|
import io.katharsis.queryspec.QuerySpec;
|
||||||
import io.katharsis.repository.ResourceRepositoryV2;
|
import io.katharsis.repository.ResourceRepositoryV2;
|
||||||
import io.katharsis.resource.list.ResourceList;
|
import io.katharsis.resource.list.ResourceList;
|
||||||
|
|
||||||
import org.baeldung.persistence.dao.UserRepository;
|
|
||||||
import org.baeldung.persistence.model.User;
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
|
@ -1,5 +1,8 @@
|
||||||
package org.baeldung.persistence.katharsis;
|
package com.baeldung.persistence.katharsis;
|
||||||
|
|
||||||
|
import com.baeldung.persistence.dao.RoleRepository;
|
||||||
|
import com.baeldung.persistence.dao.UserRepository;
|
||||||
|
import com.baeldung.persistence.model.User;
|
||||||
import io.katharsis.queryspec.QuerySpec;
|
import io.katharsis.queryspec.QuerySpec;
|
||||||
import io.katharsis.repository.RelationshipRepositoryV2;
|
import io.katharsis.repository.RelationshipRepositoryV2;
|
||||||
import io.katharsis.resource.list.ResourceList;
|
import io.katharsis.resource.list.ResourceList;
|
||||||
|
@ -7,10 +10,7 @@ import io.katharsis.resource.list.ResourceList;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import org.baeldung.persistence.dao.RoleRepository;
|
import com.baeldung.persistence.model.Role;
|
||||||
import org.baeldung.persistence.dao.UserRepository;
|
|
||||||
import org.baeldung.persistence.model.Role;
|
|
||||||
import org.baeldung.persistence.model.User;
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
package org.baeldung.persistence.model;
|
package com.baeldung.persistence.model;
|
||||||
|
|
||||||
import io.katharsis.resource.annotations.JsonApiId;
|
import io.katharsis.resource.annotations.JsonApiId;
|
||||||
import io.katharsis.resource.annotations.JsonApiRelation;
|
import io.katharsis.resource.annotations.JsonApiRelation;
|
|
@ -1,4 +1,4 @@
|
||||||
package org.baeldung.persistence.model;
|
package com.baeldung.persistence.model;
|
||||||
|
|
||||||
import io.katharsis.resource.annotations.JsonApiId;
|
import io.katharsis.resource.annotations.JsonApiId;
|
||||||
import io.katharsis.resource.annotations.JsonApiRelation;
|
import io.katharsis.resource.annotations.JsonApiRelation;
|
|
@ -1,6 +1,5 @@
|
||||||
package org.baeldung;
|
package com.baeldung;
|
||||||
|
|
||||||
import org.baeldung.Application;
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.springframework.boot.test.context.SpringBootTest;
|
import org.springframework.boot.test.context.SpringBootTest;
|
|
@ -1,4 +1,4 @@
|
||||||
package org.baeldung.test;
|
package com.baeldung.test;
|
||||||
|
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
package com.baeldung.requestmapping;
|
package com.baeldung.requestmapping;
|
||||||
|
|
||||||
|
import org.springframework.http.HttpStatus;
|
||||||
import org.springframework.http.MediaType;
|
import org.springframework.http.MediaType;
|
||||||
|
import org.springframework.http.ResponseEntity;
|
||||||
import org.springframework.stereotype.Controller;
|
import org.springframework.stereotype.Controller;
|
||||||
import org.springframework.web.bind.annotation.GetMapping;
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
import org.springframework.web.bind.annotation.PathVariable;
|
import org.springframework.web.bind.annotation.PathVariable;
|
||||||
|
@ -103,8 +105,8 @@ public class FooMappingExamplesController {
|
||||||
// --- Ambiguous Mapping
|
// --- Ambiguous Mapping
|
||||||
|
|
||||||
@GetMapping(value = "foos/duplicate" )
|
@GetMapping(value = "foos/duplicate" )
|
||||||
public String duplicate() {
|
public ResponseEntity<String> duplicate() {
|
||||||
return "Duplicate";
|
return new ResponseEntity<>("Duplicate", HttpStatus.OK);
|
||||||
}
|
}
|
||||||
|
|
||||||
// uncomment for exception of type java.lang.IllegalStateException: Ambiguous mapping
|
// uncomment for exception of type java.lang.IllegalStateException: Ambiguous mapping
|
||||||
|
@ -114,14 +116,14 @@ public class FooMappingExamplesController {
|
||||||
// return "Duplicate";
|
// return "Duplicate";
|
||||||
// }
|
// }
|
||||||
|
|
||||||
@GetMapping(value = "foos/duplicate/xml", produces = MediaType.APPLICATION_XML_VALUE)
|
@GetMapping(value = "foos/duplicate", produces = MediaType.APPLICATION_XML_VALUE)
|
||||||
public String duplicateXml() {
|
public ResponseEntity<String> duplicateXml() {
|
||||||
return "Duplicate Xml";
|
return new ResponseEntity<>("<message>Duplicate</message>", HttpStatus.OK);
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping(value = "foos/duplicate/json", produces = MediaType.APPLICATION_JSON_VALUE)
|
@GetMapping(value = "foos/duplicate", produces = MediaType.APPLICATION_JSON_VALUE)
|
||||||
public String duplicateJson() {
|
public ResponseEntity<String> duplicateJson() {
|
||||||
return "Duplicate Json";
|
return new ResponseEntity<>("{\"message\":\"Duplicate\"}", HttpStatus.OK);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -0,0 +1,35 @@
|
||||||
|
package com.baeldung.requestmapping;
|
||||||
|
|
||||||
|
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.http.MediaType;
|
||||||
|
import org.springframework.test.context.junit4.SpringRunner;
|
||||||
|
import org.springframework.test.web.servlet.MockMvc;
|
||||||
|
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
|
||||||
|
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
|
||||||
|
|
||||||
|
@RunWith(SpringRunner.class)
|
||||||
|
@WebMvcTest(FooMappingExamplesController.class)
|
||||||
|
public class FooMappingExamplesControllerUnitTest {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private MockMvc mvc;
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenAcceptsJson_whenGetDuplicate_thenJsonResponseReturned() throws Exception {
|
||||||
|
mvc.perform(get("/ex/foos/duplicate")
|
||||||
|
.accept(MediaType.APPLICATION_JSON))
|
||||||
|
.andExpect(status().isOk())
|
||||||
|
.andExpect(content().string("{\"message\":\"Duplicate\"}"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenAcceptsXml_whenGetDuplicate_thenXmlResponseReturned() throws Exception {
|
||||||
|
mvc.perform(get("/ex/foos/duplicate")
|
||||||
|
.accept(MediaType.APPLICATION_XML))
|
||||||
|
.andExpect(status().isOk())
|
||||||
|
.andExpect(content().string("<message>Duplicate</message>"));
|
||||||
|
}
|
||||||
|
}
|
|
@ -59,7 +59,7 @@ public class CustomUserDetailsServiceIntegrationTest {
|
||||||
@WithAnonymousUser
|
@WithAnonymousUser
|
||||||
public void givenAnonymous_whenRequestFoo_thenRetrieveUnauthorized() throws Exception {
|
public void givenAnonymous_whenRequestFoo_thenRetrieveUnauthorized() throws Exception {
|
||||||
this.mvc.perform(get("/foos/1").with(csrf()))
|
this.mvc.perform(get("/foos/1").with(csrf()))
|
||||||
.andExpect(status().isUnauthorized());
|
.andExpect(status().isFound());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
|
@ -17,8 +17,7 @@ import static io.restassured.RestAssured.with;
|
||||||
import static org.hamcrest.Matchers.hasItems;
|
import static org.hamcrest.Matchers.hasItems;
|
||||||
|
|
||||||
public class RestAssured2IntegrationTest {
|
public class RestAssured2IntegrationTest {
|
||||||
private static final int PORT = 8084;
|
private static WireMockServer wireMockServer;
|
||||||
private static WireMockServer wireMockServer = new WireMockServer(PORT);
|
|
||||||
|
|
||||||
private static final String EVENTS_PATH = "/odds";
|
private static final String EVENTS_PATH = "/odds";
|
||||||
private static final String APPLICATION_JSON = "application/json";
|
private static final String APPLICATION_JSON = "application/json";
|
||||||
|
@ -27,9 +26,11 @@ public class RestAssured2IntegrationTest {
|
||||||
@BeforeClass
|
@BeforeClass
|
||||||
public static void before() throws Exception {
|
public static void before() throws Exception {
|
||||||
System.out.println("Setting up!");
|
System.out.println("Setting up!");
|
||||||
|
final int port = Util.getAvailablePort();
|
||||||
|
wireMockServer = new WireMockServer(port);
|
||||||
wireMockServer.start();
|
wireMockServer.start();
|
||||||
configureFor("localhost", PORT);
|
configureFor("localhost", port);
|
||||||
RestAssured.port = PORT;
|
RestAssured.port = port;
|
||||||
stubFor(get(urlEqualTo(EVENTS_PATH)).willReturn(
|
stubFor(get(urlEqualTo(EVENTS_PATH)).willReturn(
|
||||||
aResponse().withStatus(200)
|
aResponse().withStatus(200)
|
||||||
.withHeader("Content-Type", APPLICATION_JSON)
|
.withHeader("Content-Type", APPLICATION_JSON)
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue