Merge branch 'master' of https://github.com/eugenp/tutorials
This commit is contained in:
commit
d09a0fdf8e
|
@ -0,0 +1,30 @@
|
||||||
|
package com.baeldung.algorithms.linkedlist;
|
||||||
|
|
||||||
|
public class LinkedListReversal {
|
||||||
|
|
||||||
|
ListNode reverseList(ListNode head) {
|
||||||
|
ListNode previous = null;
|
||||||
|
ListNode current = head;
|
||||||
|
while (current != null) {
|
||||||
|
ListNode nextElement = current.getNext();
|
||||||
|
current.setNext(previous);
|
||||||
|
previous = current;
|
||||||
|
current = nextElement;
|
||||||
|
}
|
||||||
|
return previous;
|
||||||
|
}
|
||||||
|
|
||||||
|
ListNode reverseListRecursive(ListNode head) {
|
||||||
|
if (head == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
if (head.getNext() == null) {
|
||||||
|
return head;
|
||||||
|
}
|
||||||
|
ListNode node = reverseListRecursive(head.getNext());
|
||||||
|
head.getNext().setNext(head);
|
||||||
|
head.setNext(null);
|
||||||
|
return node;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,28 @@
|
||||||
|
package com.baeldung.algorithms.linkedlist;
|
||||||
|
|
||||||
|
public class ListNode {
|
||||||
|
|
||||||
|
private int data;
|
||||||
|
private ListNode next;
|
||||||
|
|
||||||
|
ListNode(int data) {
|
||||||
|
this.data = data;
|
||||||
|
this.next = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getData() {
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ListNode getNext() {
|
||||||
|
return next;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setData(int data) {
|
||||||
|
this.data = data;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setNext(ListNode next) {
|
||||||
|
this.next = next;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,59 @@
|
||||||
|
package com.baeldung.algorithms.linkedlist;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import static org.junit.Assert.assertNotNull;
|
||||||
|
|
||||||
|
public class LinkedListReversalUnitTest {
|
||||||
|
@Test
|
||||||
|
public void givenLinkedList_whenIterativeReverse_thenOutputCorrectResult() {
|
||||||
|
ListNode head = constructLinkedList();
|
||||||
|
ListNode node = head;
|
||||||
|
for (int i = 1; i <= 5; i++) {
|
||||||
|
assertNotNull(node);
|
||||||
|
assertEquals(i, node.getData());
|
||||||
|
node = node.getNext();
|
||||||
|
}
|
||||||
|
LinkedListReversal reversal = new LinkedListReversal();
|
||||||
|
node = reversal.reverseList(head);
|
||||||
|
for (int i = 5; i >= 1; i--) {
|
||||||
|
assertNotNull(node);
|
||||||
|
assertEquals(i, node.getData());
|
||||||
|
node = node.getNext();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenLinkedList_whenRecursiveReverse_thenOutputCorrectResult() {
|
||||||
|
ListNode head = constructLinkedList();
|
||||||
|
ListNode node = head;
|
||||||
|
for (int i = 1; i <= 5; i++) {
|
||||||
|
assertNotNull(node);
|
||||||
|
assertEquals(i, node.getData());
|
||||||
|
node = node.getNext();
|
||||||
|
}
|
||||||
|
LinkedListReversal reversal = new LinkedListReversal();
|
||||||
|
node = reversal.reverseListRecursive(head);
|
||||||
|
for (int i = 5; i >= 1; i--) {
|
||||||
|
assertNotNull(node);
|
||||||
|
assertEquals(i, node.getData());
|
||||||
|
node = node.getNext();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private ListNode constructLinkedList() {
|
||||||
|
ListNode head = null;
|
||||||
|
ListNode tail = null;
|
||||||
|
for (int i = 1; i <= 5; i++) {
|
||||||
|
ListNode node = new ListNode(i);
|
||||||
|
if (head == null) {
|
||||||
|
head = node;
|
||||||
|
} else {
|
||||||
|
tail.setNext(node);
|
||||||
|
}
|
||||||
|
tail = node;
|
||||||
|
}
|
||||||
|
return head;
|
||||||
|
}
|
||||||
|
}
|
|
@ -129,6 +129,11 @@
|
||||||
<artifactId>zookeeper</artifactId>
|
<artifactId>zookeeper</artifactId>
|
||||||
<version>${zookeeper.version}</version>
|
<version>${zookeeper.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.fasterxml.jackson.core</groupId>
|
||||||
|
<artifactId>jackson-core</artifactId>
|
||||||
|
<version>${jackson.version}</version>
|
||||||
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.fasterxml.jackson.core</groupId>
|
<groupId>com.fasterxml.jackson.core</groupId>
|
||||||
<artifactId>jackson-databind</artifactId>
|
<artifactId>jackson-databind</artifactId>
|
||||||
|
|
|
@ -0,0 +1,61 @@
|
||||||
|
package com.baeldung.lastmodifiedfile;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileFilter;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.nio.file.Paths;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
import org.apache.commons.io.comparator.LastModifiedFileComparator;
|
||||||
|
import org.apache.commons.io.filefilter.FileFilterUtils;
|
||||||
|
|
||||||
|
public class LastModifiedFileApp {
|
||||||
|
|
||||||
|
public static File findUsingIOApi(String sdir) {
|
||||||
|
File dir = new File(sdir);
|
||||||
|
if (dir.isDirectory()) {
|
||||||
|
Optional<File> opFile = Arrays.stream(dir.listFiles(File::isFile))
|
||||||
|
.max((f1, f2) -> Long.compare(f1.lastModified(), f2.lastModified()));
|
||||||
|
|
||||||
|
if (opFile.isPresent()) {
|
||||||
|
return opFile.get();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Path findUsingNIOApi(String sdir) throws IOException {
|
||||||
|
Path dir = Paths.get(sdir);
|
||||||
|
if (Files.isDirectory(dir)) {
|
||||||
|
Optional<Path> opPath = Files.list(dir)
|
||||||
|
.filter(p -> !Files.isDirectory(p))
|
||||||
|
.sorted((p1, p2) -> Long.valueOf(p2.toFile().lastModified())
|
||||||
|
.compareTo(p1.toFile().lastModified()))
|
||||||
|
.findFirst();
|
||||||
|
|
||||||
|
if (opPath.isPresent()) {
|
||||||
|
return opPath.get();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static File findUsingCommonsIO(String sdir) {
|
||||||
|
File dir = new File(sdir);
|
||||||
|
if (dir.isDirectory()) {
|
||||||
|
File[] dirFiles = dir.listFiles((FileFilter) FileFilterUtils.fileFileFilter());
|
||||||
|
if (dirFiles != null && dirFiles.length > 0) {
|
||||||
|
Arrays.sort(dirFiles, LastModifiedFileComparator.LASTMODIFIED_REVERSE);
|
||||||
|
return dirFiles[0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,78 @@
|
||||||
|
package com.baeldung.lastmodifiedfile;
|
||||||
|
|
||||||
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.nio.file.Paths;
|
||||||
|
|
||||||
|
import org.apache.commons.io.FileUtils;
|
||||||
|
import org.junit.jupiter.api.AfterAll;
|
||||||
|
import org.junit.jupiter.api.BeforeAll;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
public class LastModifiedFileAppUnitTest {
|
||||||
|
|
||||||
|
private final static String SOURCEDIRECTORY = "src/test/resources/lastmodfiles";
|
||||||
|
|
||||||
|
@BeforeAll
|
||||||
|
public static void setUpFiles() throws IOException, InterruptedException {
|
||||||
|
File srcDir = new File(SOURCEDIRECTORY);
|
||||||
|
if (!srcDir.exists()) {
|
||||||
|
srcDir.mkdir();
|
||||||
|
}
|
||||||
|
|
||||||
|
FileUtils.cleanDirectory(srcDir);
|
||||||
|
|
||||||
|
File file01 = new File(SOURCEDIRECTORY + "/file01.txt");
|
||||||
|
file01.createNewFile();
|
||||||
|
|
||||||
|
Thread.sleep(2000);
|
||||||
|
|
||||||
|
File file02 = new File(SOURCEDIRECTORY + "/file02.txt");
|
||||||
|
file02.createNewFile();
|
||||||
|
|
||||||
|
Thread.sleep(2000);
|
||||||
|
|
||||||
|
File file03 = new File(SOURCEDIRECTORY + "/file03.txt");
|
||||||
|
file03.createNewFile();
|
||||||
|
|
||||||
|
Thread.sleep(2000);
|
||||||
|
|
||||||
|
Files.write(Paths.get(SOURCEDIRECTORY + "/file02.txt"), "Hello File02".getBytes());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenDirectory_whenUsingIoApi_thenFindLastModfile() throws IOException {
|
||||||
|
File lastModFile = LastModifiedFileApp.findUsingIOApi(SOURCEDIRECTORY);
|
||||||
|
|
||||||
|
assertThat(lastModFile).isNotNull();
|
||||||
|
assertThat(lastModFile.getName()).isEqualTo("file02.txt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenDirectory_whenUsingNioApi_thenFindLastModfile() throws IOException {
|
||||||
|
Path lastModPath = LastModifiedFileApp.findUsingNIOApi(SOURCEDIRECTORY);
|
||||||
|
|
||||||
|
assertThat(lastModPath).isNotNull();
|
||||||
|
assertThat(lastModPath.toFile().getName()).isEqualTo("file02.txt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenDirectory_whenUsingApacheCommons_thenFindLastModfile() throws IOException {
|
||||||
|
File lastModFile = LastModifiedFileApp.findUsingCommonsIO(SOURCEDIRECTORY);
|
||||||
|
|
||||||
|
assertThat(lastModFile).isNotNull();
|
||||||
|
assertThat(lastModFile.getName()).isEqualTo("file02.txt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@AfterAll
|
||||||
|
public static void cleanUp() throws IOException {
|
||||||
|
File srcDir = new File(SOURCEDIRECTORY);
|
||||||
|
FileUtils.deleteDirectory(srcDir);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,5 @@
|
||||||
|
package com.baeldung.getclassobject;
|
||||||
|
|
||||||
|
public class Animal {
|
||||||
|
protected int numberOfEyes;
|
||||||
|
}
|
|
@ -0,0 +1,4 @@
|
||||||
|
package com.baeldung.getclassobject;
|
||||||
|
|
||||||
|
public class Monkey extends Animal {
|
||||||
|
}
|
|
@ -0,0 +1,4 @@
|
||||||
|
package com.baeldung.getclassobject;
|
||||||
|
|
||||||
|
public abstract class SomeAbstractClass {
|
||||||
|
}
|
|
@ -0,0 +1,4 @@
|
||||||
|
package com.baeldung.getclassobject;
|
||||||
|
|
||||||
|
interface SomeInterface {
|
||||||
|
}
|
|
@ -0,0 +1,9 @@
|
||||||
|
package com.baeldung.getclassobject;
|
||||||
|
|
||||||
|
public class SomeUtils {
|
||||||
|
private SomeUtils() {
|
||||||
|
throw new RuntimeException("This Util class is not allowed to be instantiated!");
|
||||||
|
}
|
||||||
|
// public static utilMethods
|
||||||
|
// ...
|
||||||
|
}
|
|
@ -0,0 +1,55 @@
|
||||||
|
package com.baeldung.getclassobject;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
|
||||||
|
public class GetClassObjectUnitTest {
|
||||||
|
@Test
|
||||||
|
public void givenObjectAndType_whenGettingClassObject_thenTwoMethodsHaveTheSameResult() {
|
||||||
|
String str = "I am an object of the String class";
|
||||||
|
Class fromStrObject = str.getClass();
|
||||||
|
Class clazz = String.class;
|
||||||
|
assertSame(fromStrObject, clazz);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenClassInheritance_whenGettingRuntimeTypeAndStaticType_thenGetDifferentResult() {
|
||||||
|
Animal animal = new Monkey();
|
||||||
|
Class runtimeType = animal.getClass();
|
||||||
|
Class staticType = Animal.class;
|
||||||
|
//Not equals
|
||||||
|
assertNotEquals(staticType, runtimeType);
|
||||||
|
|
||||||
|
Class monkeyClass = Monkey.class;
|
||||||
|
assertSame(runtimeType, monkeyClass);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenPrimitiveType_whenGettingClassObject_thenOnlyStaticTypeWorks() {
|
||||||
|
int number = 7;
|
||||||
|
// Class numberClass = number.getClass(); <-- compilation error
|
||||||
|
Class intType = int.class;
|
||||||
|
|
||||||
|
assertNotNull(intType);
|
||||||
|
assertEquals("int", intType.getName());
|
||||||
|
assertTrue(intType.isPrimitive());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenTypeCannotInstantiate_whenGetTypeStatically_thenGetTypesSuccefully() {
|
||||||
|
Class interfaceType = SomeInterface.class;
|
||||||
|
Class abstractClassType = SomeAbstractClass.class;
|
||||||
|
Class utilClassType = SomeUtils.class;
|
||||||
|
|
||||||
|
assertNotNull(interfaceType);
|
||||||
|
assertTrue(interfaceType.isInterface());
|
||||||
|
assertEquals("SomeInterface", interfaceType.getSimpleName());
|
||||||
|
|
||||||
|
assertNotNull(abstractClassType);
|
||||||
|
assertEquals("SomeAbstractClass", abstractClassType.getSimpleName());
|
||||||
|
|
||||||
|
assertNotNull(utilClassType);
|
||||||
|
assertEquals("SomeUtils", utilClassType.getSimpleName());
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,94 @@
|
||||||
|
package com.baeldung.trustedcert;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import javax.net.ssl.TrustManager;
|
||||||
|
import javax.net.ssl.TrustManagerFactory;
|
||||||
|
import javax.net.ssl.X509TrustManager;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.security.KeyStore;
|
||||||
|
import java.security.KeyStoreException;
|
||||||
|
import java.security.NoSuchAlgorithmException;
|
||||||
|
import java.security.cert.Certificate;
|
||||||
|
import java.security.cert.CertificateException;
|
||||||
|
import java.security.cert.PKIXParameters;
|
||||||
|
import java.security.cert.TrustAnchor;
|
||||||
|
import java.security.cert.X509Certificate;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.Enumeration;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertFalse;
|
||||||
|
import static org.junit.Assert.assertNotNull;
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
|
|
||||||
|
public class CertificatesUnitTest {
|
||||||
|
|
||||||
|
private static final String GODADDY_CA_ALIAS = "godaddyrootg2ca [jdk]";
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenLoadingCacertsKeyStore_thenCertificatesArePresent() throws Exception {
|
||||||
|
KeyStore keyStore = loadKeyStore();
|
||||||
|
PKIXParameters params = new PKIXParameters(keyStore);
|
||||||
|
|
||||||
|
Set<TrustAnchor> trustAnchors = params.getTrustAnchors();
|
||||||
|
List<Certificate> certificates = trustAnchors.stream()
|
||||||
|
.map(TrustAnchor::getTrustedCert)
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
|
||||||
|
assertFalse(certificates.isEmpty());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenLoadingDefaultKeyStore_thenCertificatesArePresent() throws Exception {
|
||||||
|
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
|
||||||
|
trustManagerFactory.init((KeyStore)null);
|
||||||
|
|
||||||
|
List<TrustManager> trustManagers = Arrays.asList(trustManagerFactory.getTrustManagers());
|
||||||
|
List<X509Certificate> certificates = trustManagers.stream()
|
||||||
|
.filter(X509TrustManager.class::isInstance)
|
||||||
|
.map(X509TrustManager.class::cast)
|
||||||
|
.map(trustManager -> Arrays.asList(trustManager.getAcceptedIssuers()))
|
||||||
|
.flatMap(Collection::stream)
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
|
||||||
|
assertFalse(certificates.isEmpty());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenLoadingKeyStore_thenGoDaddyCALabelIsPresent() throws Exception {
|
||||||
|
KeyStore keyStore = loadKeyStore();
|
||||||
|
|
||||||
|
Enumeration<String> aliasEnumeration = keyStore.aliases();
|
||||||
|
List<String> aliases = Collections.list(aliasEnumeration);
|
||||||
|
|
||||||
|
assertTrue(aliases.contains(GODADDY_CA_ALIAS));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenLoadingKeyStore_thenGoDaddyCertificateIsPresent() throws Exception {
|
||||||
|
KeyStore keyStore = loadKeyStore();
|
||||||
|
|
||||||
|
Certificate goDaddyCertificate = keyStore.getCertificate(GODADDY_CA_ALIAS);
|
||||||
|
|
||||||
|
assertNotNull(goDaddyCertificate);
|
||||||
|
}
|
||||||
|
|
||||||
|
private KeyStore loadKeyStore() throws CertificateException, NoSuchAlgorithmException, IOException, KeyStoreException {
|
||||||
|
String relativeCacertsPath = "/lib/security/cacerts".replace("/", File.separator);
|
||||||
|
String filename = System.getProperty("java.home") + relativeCacertsPath;
|
||||||
|
FileInputStream is = new FileInputStream(filename);
|
||||||
|
|
||||||
|
KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType());
|
||||||
|
String password = "changeit";
|
||||||
|
keystore.load(is, password.toCharArray());
|
||||||
|
|
||||||
|
return keystore;
|
||||||
|
}
|
||||||
|
}
|
|
@ -16,11 +16,6 @@
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<dependency>
|
|
||||||
<groupId>io.github.openfeign</groupId>
|
|
||||||
<artifactId>feign-core</artifactId>
|
|
||||||
<version>${feign.version}</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>io.github.openfeign</groupId>
|
<groupId>io.github.openfeign</groupId>
|
||||||
<artifactId>feign-okhttp</artifactId>
|
<artifactId>feign-okhttp</artifactId>
|
||||||
|
@ -44,21 +39,8 @@
|
||||||
</dependency>
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<build>
|
|
||||||
<pluginManagement>
|
|
||||||
<plugins>
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.springframework.boot</groupId>
|
|
||||||
<artifactId>spring-boot-maven-plugin</artifactId>
|
|
||||||
<version>${spring-boot-maven-plugin.version}</version>
|
|
||||||
</plugin>
|
|
||||||
</plugins>
|
|
||||||
</pluginManagement>
|
|
||||||
</build>
|
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
<feign.version>9.4.0</feign.version>
|
<feign.version>10.11</feign.version>
|
||||||
<spring-boot-maven-plugin.version>1.4.2.RELEASE</spring-boot-maven-plugin.version>
|
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
</project>
|
</project>
|
||||||
|
|
|
@ -6,8 +6,6 @@ import com.baeldung.feign.models.BookResource;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
|
||||||
import org.junit.runners.JUnit4;
|
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
@ -22,7 +20,6 @@ import static org.junit.Assert.assertTrue;
|
||||||
* Consumes https://github.com/Baeldung/spring-hypermedia-api
|
* Consumes https://github.com/Baeldung/spring-hypermedia-api
|
||||||
*/
|
*/
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@RunWith(JUnit4.class)
|
|
||||||
public class BookClientLiveTest {
|
public class BookClientLiveTest {
|
||||||
private BookClient bookClient;
|
private BookClient bookClient;
|
||||||
|
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<artifactId>httpclient-2</artifactId>
|
<artifactId>httpclient-2</artifactId>
|
||||||
<version>0.1-SNAPSHOT</version>
|
<version>0.1-SNAPSHOT</version>
|
||||||
|
<name>httpclient-2</name>
|
||||||
|
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>com.baeldung</groupId>
|
<groupId>com.baeldung</groupId>
|
||||||
|
@ -13,6 +14,7 @@
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
|
<!-- http client -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.apache.httpcomponents</groupId>
|
<groupId>org.apache.httpcomponents</groupId>
|
||||||
<artifactId>httpclient</artifactId>
|
<artifactId>httpclient</artifactId>
|
||||||
|
@ -24,6 +26,19 @@
|
||||||
</exclusion>
|
</exclusion>
|
||||||
</exclusions>
|
</exclusions>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<!-- rest template -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-web</artifactId>
|
||||||
|
<version>${spring-boot.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-test</artifactId>
|
||||||
|
<version>${spring-boot.version}</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
|
@ -34,10 +49,24 @@
|
||||||
<filtering>true</filtering>
|
<filtering>true</filtering>
|
||||||
</resource>
|
</resource>
|
||||||
</resources>
|
</resources>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
|
<version>${maven-compiler-plugin.version}</version>
|
||||||
|
<configuration>
|
||||||
|
<source>${maven.compiler.source.version}</source>
|
||||||
|
<target>${maven.compiler.target.version}</target>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
</build>
|
</build>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
<httpclient.version>4.5.8</httpclient.version>
|
<httpclient.version>4.5.8</httpclient.version>
|
||||||
|
<maven.compiler.source.version>11</maven.compiler.source.version>
|
||||||
|
<maven.compiler.target.version>11</maven.compiler.target.version>
|
||||||
|
<spring-boot.version>2.1.7.RELEASE</spring-boot.version>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
</project>
|
</project>
|
|
@ -0,0 +1,54 @@
|
||||||
|
package com.baeldung.httpclient.cookies;
|
||||||
|
|
||||||
|
import org.apache.http.client.CookieStore;
|
||||||
|
import org.apache.http.client.methods.CloseableHttpResponse;
|
||||||
|
import org.apache.http.client.methods.HttpGet;
|
||||||
|
import org.apache.http.client.protocol.HttpClientContext;
|
||||||
|
import org.apache.http.cookie.Cookie;
|
||||||
|
import org.apache.http.impl.client.BasicCookieStore;
|
||||||
|
import org.apache.http.impl.client.CloseableHttpClient;
|
||||||
|
import org.apache.http.impl.client.HttpClients;
|
||||||
|
import org.apache.http.impl.cookie.BasicClientCookie;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
|
||||||
|
|
||||||
|
public class HttpClientGettingCookieValueUnitTest {
|
||||||
|
private static Logger log = LoggerFactory.getLogger(HttpClientGettingCookieValueUnitTest.class);
|
||||||
|
|
||||||
|
private static final String SAMPLE_URL = "http://www.baeldung.com/";
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public final void whenSettingCustomCookieOnTheRequest_thenGettingTheSameCookieFromTheResponse() throws IOException {
|
||||||
|
HttpClientContext context = HttpClientContext.create();
|
||||||
|
context.setAttribute(HttpClientContext.COOKIE_STORE, createCustomCookieStore());
|
||||||
|
|
||||||
|
try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
|
||||||
|
try (CloseableHttpResponse response = httpClient.execute(new HttpGet(SAMPLE_URL), context)) {
|
||||||
|
CookieStore cookieStore = context.getCookieStore();
|
||||||
|
Cookie customCookie = cookieStore.getCookies()
|
||||||
|
.stream()
|
||||||
|
.peek(cookie -> log.info("cookie name:{}", cookie.getName()))
|
||||||
|
.filter(cookie -> "custom_cookie".equals(cookie.getName()))
|
||||||
|
.findFirst()
|
||||||
|
.orElseThrow(IllegalStateException::new);
|
||||||
|
|
||||||
|
assertEquals("test_value", customCookie.getValue());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private BasicCookieStore createCustomCookieStore() {
|
||||||
|
BasicCookieStore cookieStore = new BasicCookieStore();
|
||||||
|
BasicClientCookie cookie = new BasicClientCookie("custom_cookie", "test_value");
|
||||||
|
cookie.setDomain("baeldung.com");
|
||||||
|
cookie.setPath("/");
|
||||||
|
cookieStore.addCookie(cookie);
|
||||||
|
return cookieStore;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,26 @@
|
||||||
|
package com.baeldung.httpclient.readresponsebodystring;
|
||||||
|
|
||||||
|
import org.apache.http.HttpEntity;
|
||||||
|
import org.apache.http.client.methods.CloseableHttpResponse;
|
||||||
|
import org.apache.http.client.methods.HttpGet;
|
||||||
|
import org.apache.http.impl.client.CloseableHttpClient;
|
||||||
|
import org.apache.http.impl.client.HttpClients;
|
||||||
|
import org.apache.http.util.EntityUtils;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
public class ApacheHttpClientUnitTest {
|
||||||
|
public static final String DUMMY_URL = "https://postman-echo.com/get";
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenUseApacheHttpClient_thenCorrect() throws IOException {
|
||||||
|
HttpGet request = new HttpGet(DUMMY_URL);
|
||||||
|
|
||||||
|
try (CloseableHttpClient client = HttpClients.createDefault(); CloseableHttpResponse response = client.execute(request)) {
|
||||||
|
HttpEntity entity = response.getEntity();
|
||||||
|
String result = EntityUtils.toString(entity);
|
||||||
|
System.out.println("Response -> " + result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,29 @@
|
||||||
|
package com.baeldung.httpclient.readresponsebodystring;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.net.URI;
|
||||||
|
import java.net.http.HttpClient;
|
||||||
|
import java.net.http.HttpRequest;
|
||||||
|
import java.net.http.HttpResponse;
|
||||||
|
|
||||||
|
public class HttpClientUnitTest {
|
||||||
|
public static final String DUMMY_URL = "https://postman-echo.com/get";
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenUseHttpClient_thenCorrect() throws IOException, InterruptedException {
|
||||||
|
HttpClient client = HttpClient.newHttpClient();
|
||||||
|
HttpRequest request = HttpRequest.newBuilder().uri(URI.create(DUMMY_URL)).build();
|
||||||
|
|
||||||
|
// synchronous response
|
||||||
|
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
|
||||||
|
System.out.println(response.body());
|
||||||
|
|
||||||
|
// asynchronous response
|
||||||
|
client.sendAsync(request, HttpResponse.BodyHandlers.ofString())
|
||||||
|
.thenApply(HttpResponse::body)
|
||||||
|
.thenAccept(System.out::println)
|
||||||
|
.join();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,34 @@
|
||||||
|
package com.baeldung.httpclient.readresponsebodystring;
|
||||||
|
|
||||||
|
import org.junit.Assert;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
import java.net.HttpURLConnection;
|
||||||
|
import java.net.URL;
|
||||||
|
|
||||||
|
public class HttpUrlConnectionUnitTest {
|
||||||
|
|
||||||
|
public static final String DUMMY_URL = "https://postman-echo.com/get";
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenUseHttpUrlConnection_thenCorrect() throws IOException {
|
||||||
|
HttpURLConnection connection = (HttpURLConnection) new URL(DUMMY_URL).openConnection();
|
||||||
|
|
||||||
|
InputStream inputStream = connection.getInputStream();
|
||||||
|
|
||||||
|
BufferedReader in = new BufferedReader(new InputStreamReader(inputStream));
|
||||||
|
StringBuilder response = new StringBuilder();
|
||||||
|
String currentLine;
|
||||||
|
|
||||||
|
while ((currentLine = in.readLine()) != null)
|
||||||
|
response.append(currentLine);
|
||||||
|
|
||||||
|
in.close();
|
||||||
|
Assert.assertNotNull(response.toString());
|
||||||
|
System.out.println("Response -> " + response.toString());
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,17 @@
|
||||||
|
package com.baeldung.httpclient.readresponsebodystring;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.springframework.web.client.RestTemplate;
|
||||||
|
|
||||||
|
public class SpringRestTemplateUnitTest {
|
||||||
|
|
||||||
|
public static final String DUMMY_URL = "https://postman-echo.com/get";
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenUseRestTemplate_thenCorrect() {
|
||||||
|
RestTemplate restTemplate = new RestTemplate();
|
||||||
|
String response = restTemplate.getForObject(DUMMY_URL, String.class);
|
||||||
|
System.out.println(response);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -23,6 +23,13 @@
|
||||||
<artifactId>jackson-datatype-joda</artifactId>
|
<artifactId>jackson-datatype-joda</artifactId>
|
||||||
<version>${jackson.version}</version>
|
<version>${jackson.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.fasterxml.jackson.core</groupId>
|
||||||
|
<artifactId>jackson-core</artifactId>
|
||||||
|
<version>${jackson.version}</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
|
|
|
@ -60,8 +60,6 @@ public class CustomDeserializationUnitTest {
|
||||||
String converted = objectMapper.writeValueAsString(now);
|
String converted = objectMapper.writeValueAsString(now);
|
||||||
// restore an instance of ZonedDateTime from String
|
// restore an instance of ZonedDateTime from String
|
||||||
ZonedDateTime restored = objectMapper.readValue(converted, ZonedDateTime.class);
|
ZonedDateTime restored = objectMapper.readValue(converted, ZonedDateTime.class);
|
||||||
System.out.println("serialized: " + now);
|
|
||||||
System.out.println("restored: " + restored);
|
|
||||||
assertThat(now, is(not(restored)));
|
assertThat(now, is(not(restored)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -70,15 +68,14 @@ public class CustomDeserializationUnitTest {
|
||||||
ObjectMapper objectMapper = new ObjectMapper();
|
ObjectMapper objectMapper = new ObjectMapper();
|
||||||
objectMapper.findAndRegisterModules();
|
objectMapper.findAndRegisterModules();
|
||||||
objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
|
objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
|
||||||
|
objectMapper.enable(SerializationFeature.WRITE_DATES_WITH_ZONE_ID);
|
||||||
objectMapper.disable(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE);
|
objectMapper.disable(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE);
|
||||||
// construct a new instance of ZonedDateTime
|
// construct a new instance of ZonedDateTime
|
||||||
ZonedDateTime now = ZonedDateTime.now(ZoneId.of("Europe/Berlin"));
|
ZonedDateTime now = ZonedDateTime.now(ZoneId.of("Europe/Berlin"));
|
||||||
String converted = objectMapper.writeValueAsString(now);
|
String converted = objectMapper.writeValueAsString(now);
|
||||||
// restore an instance of ZonedDateTime from String
|
// restore an instance of ZonedDateTime from String
|
||||||
ZonedDateTime restored = objectMapper.readValue(converted, ZonedDateTime.class);
|
ZonedDateTime restored = objectMapper.readValue(converted, ZonedDateTime.class);
|
||||||
System.out.println("serialized: " + now);
|
assertThat(restored, is(now));
|
||||||
System.out.println("restored: " + restored);
|
|
||||||
assertThat(now, is(restored));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,7 +24,6 @@ public class CustomSerializationUnitTest {
|
||||||
public final void whenSerializing_thenNoExceptions() throws JsonGenerationException, JsonMappingException, IOException {
|
public final void whenSerializing_thenNoExceptions() throws JsonGenerationException, JsonMappingException, IOException {
|
||||||
final Item myItem = new Item(1, "theItem", new User(2, "theUser"));
|
final Item myItem = new Item(1, "theItem", new User(2, "theUser"));
|
||||||
final String serialized = new ObjectMapper().writeValueAsString(myItem);
|
final String serialized = new ObjectMapper().writeValueAsString(myItem);
|
||||||
System.out.println(serialized);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -38,7 +37,6 @@ public class CustomSerializationUnitTest {
|
||||||
mapper.registerModule(simpleModule);
|
mapper.registerModule(simpleModule);
|
||||||
|
|
||||||
final String serialized = mapper.writeValueAsString(myItem);
|
final String serialized = mapper.writeValueAsString(myItem);
|
||||||
System.out.println(serialized);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -46,7 +44,6 @@ public class CustomSerializationUnitTest {
|
||||||
final ItemWithSerializer myItem = new ItemWithSerializer(1, "theItem", new User(2, "theUser"));
|
final ItemWithSerializer myItem = new ItemWithSerializer(1, "theItem", new User(2, "theUser"));
|
||||||
|
|
||||||
final String serialized = new ObjectMapper().writeValueAsString(myItem);
|
final String serialized = new ObjectMapper().writeValueAsString(myItem);
|
||||||
System.out.println(serialized);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -37,7 +37,6 @@ public class IgnoreFieldsWithFilterUnitTest {
|
||||||
assertThat(dtoAsString, not(containsString("intValue")));
|
assertThat(dtoAsString, not(containsString("intValue")));
|
||||||
assertThat(dtoAsString, containsString("booleanValue"));
|
assertThat(dtoAsString, containsString("booleanValue"));
|
||||||
assertThat(dtoAsString, containsString("stringValue"));
|
assertThat(dtoAsString, containsString("stringValue"));
|
||||||
System.out.println(dtoAsString);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -83,7 +82,6 @@ public class IgnoreFieldsWithFilterUnitTest {
|
||||||
assertThat(dtoAsString, not(containsString("intValue")));
|
assertThat(dtoAsString, not(containsString("intValue")));
|
||||||
assertThat(dtoAsString, containsString("booleanValue"));
|
assertThat(dtoAsString, containsString("booleanValue"));
|
||||||
assertThat(dtoAsString, containsString("stringValue"));
|
assertThat(dtoAsString, containsString("stringValue"));
|
||||||
System.out.println(dtoAsString);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -51,8 +51,6 @@ public class JacksonDynamicIgnoreUnitTest {
|
||||||
assertTrue(result.contains("john"));
|
assertTrue(result.contains("john"));
|
||||||
assertTrue(result.contains("address"));
|
assertTrue(result.contains("address"));
|
||||||
assertTrue(result.contains("usa"));
|
assertTrue(result.contains("usa"));
|
||||||
|
|
||||||
System.out.println("Not Hidden = " + result);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -65,8 +63,6 @@ public class JacksonDynamicIgnoreUnitTest {
|
||||||
assertTrue(result.contains("john"));
|
assertTrue(result.contains("john"));
|
||||||
assertFalse(result.contains("address"));
|
assertFalse(result.contains("address"));
|
||||||
assertFalse(result.contains("usa"));
|
assertFalse(result.contains("usa"));
|
||||||
|
|
||||||
System.out.println("Address Hidden = " + result);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -76,8 +72,6 @@ public class JacksonDynamicIgnoreUnitTest {
|
||||||
final String result = mapper.writeValueAsString(person);
|
final String result = mapper.writeValueAsString(person);
|
||||||
|
|
||||||
assertTrue(result.length() == 0);
|
assertTrue(result.length() == 0);
|
||||||
|
|
||||||
System.out.println("All Hidden = " + result);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -90,7 +84,5 @@ public class JacksonDynamicIgnoreUnitTest {
|
||||||
final Person p3 = new Person("adam", ad3, false);
|
final Person p3 = new Person("adam", ad3, false);
|
||||||
|
|
||||||
final String result = mapper.writeValueAsString(Arrays.asList(p1, p2, p3));
|
final String result = mapper.writeValueAsString(Arrays.asList(p1, p2, p3));
|
||||||
|
|
||||||
System.out.println(result);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -53,12 +53,12 @@
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.fasterxml.jackson.core</groupId>
|
<groupId>com.fasterxml.jackson.core</groupId>
|
||||||
<artifactId>jackson-annotations</artifactId>
|
<artifactId>jackson-annotations</artifactId>
|
||||||
<version>2.11.0</version>
|
<version>${jackson.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.fasterxml.jackson.core</groupId>
|
<groupId>com.fasterxml.jackson.core</groupId>
|
||||||
<artifactId>jackson-databind</artifactId>
|
<artifactId>jackson-databind</artifactId>
|
||||||
<version>2.11.0</version>
|
<version>${jackson.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.io-informatics.oss</groupId>
|
<groupId>com.io-informatics.oss</groupId>
|
||||||
|
|
|
@ -7,22 +7,38 @@ import au.com.dius.pact.consumer.dsl.PactDslWithProvider;
|
||||||
import au.com.dius.pact.model.RequestResponsePact;
|
import au.com.dius.pact.model.RequestResponsePact;
|
||||||
import org.junit.Rule;
|
import org.junit.Rule;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.springframework.http.HttpEntity;
|
import org.springframework.http.*;
|
||||||
import org.springframework.http.HttpHeaders;
|
|
||||||
import org.springframework.http.HttpMethod;
|
|
||||||
import org.springframework.http.MediaType;
|
|
||||||
import org.springframework.http.ResponseEntity;
|
|
||||||
import org.springframework.web.client.RestTemplate;
|
import org.springframework.web.client.RestTemplate;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.net.ServerSocket;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
import static org.assertj.core.api.Assertions.assertThat;
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
|
||||||
public class PactConsumerDrivenContractUnitTest {
|
public class PactConsumerDrivenContractUnitTest {
|
||||||
|
|
||||||
|
private static int getAvailablePort() {
|
||||||
|
return new Random()
|
||||||
|
.ints(6000, 9000)
|
||||||
|
.filter(PactConsumerDrivenContractUnitTest::isFree)
|
||||||
|
.findFirst()
|
||||||
|
.orElse(8080);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static boolean isFree(int port) {
|
||||||
|
try {
|
||||||
|
new ServerSocket(port).close();
|
||||||
|
return true;
|
||||||
|
} catch (IOException e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Rule
|
@Rule
|
||||||
public PactProviderRuleMk2 mockProvider = new PactProviderRuleMk2("test_provider", "localhost", 8080, this);
|
public PactProviderRuleMk2 mockProvider = new PactProviderRuleMk2("test_provider", "localhost", getAvailablePort(), this);
|
||||||
|
|
||||||
@Pact(consumer = "test_consumer")
|
@Pact(consumer = "test_consumer")
|
||||||
public RequestResponsePact createPact(PactDslWithProvider builder) {
|
public RequestResponsePact createPact(PactDslWithProvider builder) {
|
||||||
|
|
|
@ -107,6 +107,12 @@
|
||||||
<artifactId>renjin-script-engine</artifactId>
|
<artifactId>renjin-script-engine</artifactId>
|
||||||
<version>${renjin.version}</version>
|
<version>${renjin.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<!-- libphonenumber -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.googlecode.libphonenumber</groupId>
|
||||||
|
<artifactId>libphonenumber</artifactId>
|
||||||
|
<version>${libphonenumber.version}</version>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<repositories>
|
<repositories>
|
||||||
|
@ -150,6 +156,7 @@
|
||||||
<renjin.version>RELEASE</renjin.version>
|
<renjin.version>RELEASE</renjin.version>
|
||||||
<rcaller.version>3.0</rcaller.version>
|
<rcaller.version>3.0</rcaller.version>
|
||||||
<rserve.version>1.8.1</rserve.version>
|
<rserve.version>1.8.1</rserve.version>
|
||||||
|
<libphonenumber.version>8.12.9</libphonenumber.version>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,79 @@
|
||||||
|
package com.baeldung.libphonenumber;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertFalse;
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import com.google.i18n.phonenumbers.NumberParseException;
|
||||||
|
import com.google.i18n.phonenumbers.PhoneNumberUtil;
|
||||||
|
import com.google.i18n.phonenumbers.PhoneNumberUtil.PhoneNumberType;
|
||||||
|
import com.google.i18n.phonenumbers.Phonenumber.PhoneNumber;
|
||||||
|
import com.google.i18n.phonenumbers.Phonenumber.PhoneNumber.CountryCodeSource;
|
||||||
|
|
||||||
|
public class LibPhoneNumberUnitTest {
|
||||||
|
|
||||||
|
private static final PhoneNumberUtil phoneNumberUtil = PhoneNumberUtil.getInstance();
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenPhoneNumber_whenValid_thenOK() throws Exception {
|
||||||
|
|
||||||
|
PhoneNumber phone = phoneNumberUtil.parse("+911234567890", CountryCodeSource.UNSPECIFIED.name());
|
||||||
|
|
||||||
|
assertTrue(phoneNumberUtil.isValidNumber(phone));
|
||||||
|
assertTrue(phoneNumberUtil.isValidNumberForRegion(phone, "IN"));
|
||||||
|
assertFalse(phoneNumberUtil.isValidNumberForRegion(phone, "US"));
|
||||||
|
assertTrue(phoneNumberUtil.isValidNumber(phoneNumberUtil.getExampleNumber("IN")));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenPhoneNumber_whenAlphaNumber_thenValid() {
|
||||||
|
assertTrue(phoneNumberUtil.isAlphaNumber("325-CARS"));
|
||||||
|
assertTrue(phoneNumberUtil.isAlphaNumber("0800 REPAIR"));
|
||||||
|
assertTrue(phoneNumberUtil.isAlphaNumber("1-800-MY-APPLE"));
|
||||||
|
assertTrue(phoneNumberUtil.isAlphaNumber("1-800-MY-APPLE.."));
|
||||||
|
assertFalse(phoneNumberUtil.isAlphaNumber("+876 1234-1234"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenPhoneNumber_whenPossibleForType_thenValid() {
|
||||||
|
PhoneNumber number = new PhoneNumber();
|
||||||
|
number.setCountryCode(54);
|
||||||
|
|
||||||
|
number.setNationalNumber(123456);
|
||||||
|
assertTrue(phoneNumberUtil.isPossibleNumberForType(number, PhoneNumberType.FIXED_LINE));
|
||||||
|
assertFalse(phoneNumberUtil.isPossibleNumberForType(number, PhoneNumberType.TOLL_FREE));
|
||||||
|
|
||||||
|
number.setNationalNumber(12345678901L);
|
||||||
|
assertFalse(phoneNumberUtil.isPossibleNumberForType(number, PhoneNumberType.FIXED_LINE));
|
||||||
|
assertTrue(phoneNumberUtil.isPossibleNumberForType(number, PhoneNumberType.MOBILE));
|
||||||
|
assertFalse(phoneNumberUtil.isPossibleNumberForType(number, PhoneNumberType.TOLL_FREE));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenPhoneNumber_whenPossible_thenValid() {
|
||||||
|
PhoneNumber number = new PhoneNumber();
|
||||||
|
number.setCountryCode(1)
|
||||||
|
.setNationalNumber(123000L);
|
||||||
|
assertFalse(phoneNumberUtil.isPossibleNumber(number));
|
||||||
|
assertFalse(phoneNumberUtil.isPossibleNumber("+1 343 253 00000", "US"));
|
||||||
|
assertFalse(phoneNumberUtil.isPossibleNumber("(343) 253-00000", "US"));
|
||||||
|
assertFalse(phoneNumberUtil.isPossibleNumber("dial p for pizza", "US"));
|
||||||
|
assertFalse(phoneNumberUtil.isPossibleNumber("123-000", "US"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenPhoneNumber_whenNumberGeographical_thenValid() throws NumberParseException {
|
||||||
|
|
||||||
|
PhoneNumber phone = phoneNumberUtil.parse("+911234567890", "IN");
|
||||||
|
assertTrue(phoneNumberUtil.isNumberGeographical(phone));
|
||||||
|
|
||||||
|
phone = new PhoneNumber().setCountryCode(1)
|
||||||
|
.setNationalNumber(2530000L);
|
||||||
|
assertFalse(phoneNumberUtil.isNumberGeographical(phone));
|
||||||
|
|
||||||
|
phone = new PhoneNumber().setCountryCode(800)
|
||||||
|
.setNationalNumber(12345678L);
|
||||||
|
assertFalse(phoneNumberUtil.isNumberGeographical(phone));
|
||||||
|
}
|
||||||
|
}
|
|
@ -168,7 +168,7 @@
|
||||||
<crdt.version>0.1.0</crdt.version>
|
<crdt.version>0.1.0</crdt.version>
|
||||||
<unit-ri.version>1.0.3</unit-ri.version>
|
<unit-ri.version>1.0.3</unit-ri.version>
|
||||||
<infinispan.version>9.1.5.Final</infinispan.version>
|
<infinispan.version>9.1.5.Final</infinispan.version>
|
||||||
<jackson.version>2.9.8</jackson.version>
|
<!-- <jackson.version>2.9.8</jackson.version>-->
|
||||||
<spring.version>4.3.8.RELEASE</spring.version>
|
<spring.version>4.3.8.RELEASE</spring.version>
|
||||||
<suanshu.version>4.0.0</suanshu.version>
|
<suanshu.version>4.0.0</suanshu.version>
|
||||||
<derive4j.version>1.1.0</derive4j.version>
|
<derive4j.version>1.1.0</derive4j.version>
|
||||||
|
|
|
@ -72,7 +72,7 @@
|
||||||
<okhttp.version>3.14.2</okhttp.version>
|
<okhttp.version>3.14.2</okhttp.version>
|
||||||
<gson.version>2.8.5</gson.version>
|
<gson.version>2.8.5</gson.version>
|
||||||
<mockwebserver.version>3.14.2</mockwebserver.version>
|
<mockwebserver.version>3.14.2</mockwebserver.version>
|
||||||
<jackson.version>2.9.8</jackson.version>
|
<!-- <jackson.version>2.9.8</jackson.version>-->
|
||||||
<jetty.httpclient.version>1.0.3</jetty.httpclient.version>
|
<jetty.httpclient.version>1.0.3</jetty.httpclient.version>
|
||||||
<jetty.server.version>9.4.19.v20190610</jetty.server.version>
|
<jetty.server.version>9.4.19.v20190610</jetty.server.version>
|
||||||
<rxjava2.version>2.2.11</rxjava2.version>
|
<rxjava2.version>2.2.11</rxjava2.version>
|
||||||
|
|
|
@ -118,7 +118,7 @@
|
||||||
<properties>
|
<properties>
|
||||||
<gson.version>2.8.5</gson.version>
|
<gson.version>2.8.5</gson.version>
|
||||||
<httpclient.version>4.5.3</httpclient.version>
|
<httpclient.version>4.5.3</httpclient.version>
|
||||||
<jackson.version>2.9.8</jackson.version>
|
<!-- <jackson.version>2.9.8</jackson.version>-->
|
||||||
<assertj.version>3.6.2</assertj.version>
|
<assertj.version>3.6.2</assertj.version>
|
||||||
<com.squareup.okhttp3.version>3.14.2</com.squareup.okhttp3.version>
|
<com.squareup.okhttp3.version>3.14.2</com.squareup.okhttp3.version>
|
||||||
<googleclient.version>1.23.0</googleclient.version>
|
<googleclient.version>1.23.0</googleclient.version>
|
||||||
|
|
|
@ -66,12 +66,12 @@
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.fasterxml.jackson.core</groupId>
|
<groupId>com.fasterxml.jackson.core</groupId>
|
||||||
<artifactId>jackson-databind</artifactId>
|
<artifactId>jackson-databind</artifactId>
|
||||||
<version>${fasterxml.jackson.version}</version>
|
<version>${jackson.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.fasterxml.jackson.dataformat</groupId>
|
<groupId>com.fasterxml.jackson.dataformat</groupId>
|
||||||
<artifactId>jackson-dataformat-smile</artifactId>
|
<artifactId>jackson-dataformat-smile</artifactId>
|
||||||
<version>${fasterxml.jackson.version}</version>
|
<version>${jackson.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
|
@ -93,7 +93,7 @@
|
||||||
<dep.ver.servlet>3.1.0</dep.ver.servlet>
|
<dep.ver.servlet>3.1.0</dep.ver.servlet>
|
||||||
<netflix.servo.ver>0.12.17</netflix.servo.ver>
|
<netflix.servo.ver>0.12.17</netflix.servo.ver>
|
||||||
<micrometer.ver>0.12.0.RELEASE</micrometer.ver>
|
<micrometer.ver>0.12.0.RELEASE</micrometer.ver>
|
||||||
<fasterxml.jackson.version>2.9.1</fasterxml.jackson.version>
|
<!-- <fasterxml.jackson.version>2.9.1</fasterxml.jackson.version>-->
|
||||||
<spring-boot-starter-web.version>2.0.7.RELEASE</spring-boot-starter-web.version>
|
<spring-boot-starter-web.version>2.0.7.RELEASE</spring-boot-starter-web.version>
|
||||||
<assertj-core.version>3.11.1</assertj-core.version>
|
<assertj-core.version>3.11.1</assertj-core.version>
|
||||||
<metrics-aspectj.version>1.1.0</metrics-aspectj.version>
|
<metrics-aspectj.version>1.1.0</metrics-aspectj.version>
|
||||||
|
|
|
@ -9,4 +9,5 @@ This module contains articles about enterprise concerns such as Multitenancy, Er
|
||||||
- [Hibernate Aggregate Functions](https://www.baeldung.com/hibernate-aggregate-functions)
|
- [Hibernate Aggregate Functions](https://www.baeldung.com/hibernate-aggregate-functions)
|
||||||
- [Common Hibernate Exceptions](https://www.baeldung.com/hibernate-exceptions)
|
- [Common Hibernate Exceptions](https://www.baeldung.com/hibernate-exceptions)
|
||||||
- [Hibernate Error “Not all named parameters have been set”](https://www.baeldung.com/hibernate-error-named-parameters-not-set)
|
- [Hibernate Error “Not all named parameters have been set”](https://www.baeldung.com/hibernate-error-named-parameters-not-set)
|
||||||
- [Various Logging Levels in Hibernate](https://www.baeldung.com/hibernate-logging-levels)
|
- [Various Logging Levels in Hibernate](https://www.baeldung.com/hibernate-logging-levels)
|
||||||
|
- [Hibernate: save, persist, update, merge, saveOrUpdate](https://www.baeldung.com/hibernate-save-persist-update-merge-saveorupdate)
|
|
@ -61,13 +61,25 @@
|
||||||
<version>${byte-buddy.version}</version>
|
<version>${byte-buddy.version}</version>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.hsqldb</groupId>
|
||||||
|
<artifactId>hsqldb</artifactId>
|
||||||
|
<version>${hsqldb.version}</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<repositories>
|
<repositories>
|
||||||
<repository>
|
<repository>
|
||||||
<id>geodb-repo</id>
|
<id>osgeo</id>
|
||||||
<name>GeoDB repository</name>
|
<name>OSGeo Release Repository</name>
|
||||||
<url>http://repo.boundlessgeo.com/main/</url>
|
<url>https://repo.osgeo.org/repository/release/</url>
|
||||||
|
<snapshots>
|
||||||
|
<enabled>false</enabled>
|
||||||
|
</snapshots>
|
||||||
|
<releases>
|
||||||
|
<enabled>true</enabled>
|
||||||
|
</releases>
|
||||||
</repository>
|
</repository>
|
||||||
</repositories>
|
</repositories>
|
||||||
|
|
||||||
|
@ -77,6 +89,7 @@
|
||||||
<mariaDB4j.version>2.2.3</mariaDB4j.version>
|
<mariaDB4j.version>2.2.3</mariaDB4j.version>
|
||||||
<assertj-core.version>3.8.0</assertj-core.version>
|
<assertj-core.version>3.8.0</assertj-core.version>
|
||||||
<geodb.version>0.9</geodb.version>
|
<geodb.version>0.9</geodb.version>
|
||||||
|
<hsqldb.version>2.3.4</hsqldb.version>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
</project>
|
</project>
|
||||||
|
|
|
@ -1,6 +1,14 @@
|
||||||
package com.baeldung.persistence.save;
|
package com.baeldung.persistence.save;
|
||||||
|
|
||||||
import com.baeldung.persistence.model.Person;
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import static org.junit.Assert.assertNotEquals;
|
||||||
|
import static org.junit.Assert.assertNotNull;
|
||||||
|
import static org.junit.Assert.assertNotSame;
|
||||||
|
import static org.junit.Assert.assertNull;
|
||||||
|
import static org.junit.Assert.assertSame;
|
||||||
|
|
||||||
|
import javax.persistence.PersistenceException;
|
||||||
|
|
||||||
import org.hibernate.HibernateException;
|
import org.hibernate.HibernateException;
|
||||||
import org.hibernate.Session;
|
import org.hibernate.Session;
|
||||||
import org.hibernate.SessionFactory;
|
import org.hibernate.SessionFactory;
|
||||||
|
@ -8,9 +16,13 @@ import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
|
||||||
import org.hibernate.cfg.Configuration;
|
import org.hibernate.cfg.Configuration;
|
||||||
import org.hibernate.dialect.HSQLDialect;
|
import org.hibernate.dialect.HSQLDialect;
|
||||||
import org.hibernate.service.ServiceRegistry;
|
import org.hibernate.service.ServiceRegistry;
|
||||||
import org.junit.*;
|
import org.junit.After;
|
||||||
|
import org.junit.AfterClass;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.BeforeClass;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
import static org.junit.Assert.*;
|
import com.baeldung.persistence.model.Person;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Testing specific implementation details for different methods:
|
* Testing specific implementation details for different methods:
|
||||||
|
@ -21,12 +33,19 @@ public class SaveMethodsIntegrationTest {
|
||||||
private static SessionFactory sessionFactory;
|
private static SessionFactory sessionFactory;
|
||||||
|
|
||||||
private Session session;
|
private Session session;
|
||||||
|
private boolean doNotCommit = false;
|
||||||
|
|
||||||
@BeforeClass
|
@BeforeClass
|
||||||
public static void beforeTests() {
|
public static void beforeTests() {
|
||||||
Configuration configuration = new Configuration().addAnnotatedClass(Person.class).setProperty("hibernate.dialect", HSQLDialect.class.getName()).setProperty("hibernate.connection.driver_class", org.hsqldb.jdbcDriver.class.getName())
|
Configuration configuration = new Configuration().addAnnotatedClass(Person.class)
|
||||||
.setProperty("hibernate.connection.url", "jdbc:hsqldb:mem:test").setProperty("hibernate.connection.username", "sa").setProperty("hibernate.connection.password", "").setProperty("hibernate.hbm2ddl.auto", "update");
|
.setProperty("hibernate.dialect", HSQLDialect.class.getName())
|
||||||
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();
|
.setProperty("hibernate.connection.driver_class", org.hsqldb.jdbcDriver.class.getName())
|
||||||
|
.setProperty("hibernate.connection.url", "jdbc:hsqldb:mem:test")
|
||||||
|
.setProperty("hibernate.connection.username", "sa")
|
||||||
|
.setProperty("hibernate.connection.password", "")
|
||||||
|
.setProperty("hibernate.hbm2ddl.auto", "update");
|
||||||
|
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties())
|
||||||
|
.build();
|
||||||
sessionFactory = configuration.buildSessionFactory(serviceRegistry);
|
sessionFactory = configuration.buildSessionFactory(serviceRegistry);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -34,6 +53,7 @@ public class SaveMethodsIntegrationTest {
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
session = sessionFactory.openSession();
|
session = sessionFactory.openSession();
|
||||||
session.beginTransaction();
|
session.beginTransaction();
|
||||||
|
doNotCommit = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -43,7 +63,8 @@ public class SaveMethodsIntegrationTest {
|
||||||
person.setName("John");
|
person.setName("John");
|
||||||
session.persist(person);
|
session.persist(person);
|
||||||
|
|
||||||
session.getTransaction().commit();
|
session.getTransaction()
|
||||||
|
.commit();
|
||||||
session.close();
|
session.close();
|
||||||
|
|
||||||
session = sessionFactory.openSession();
|
session = sessionFactory.openSession();
|
||||||
|
@ -68,15 +89,33 @@ public class SaveMethodsIntegrationTest {
|
||||||
assertEquals(id1, id2);
|
assertEquals(id1, id2);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test(expected = HibernateException.class)
|
@Test(expected = PersistenceException.class)
|
||||||
public void whenPersistDetached_thenThrowsException() {
|
public void whenPersistDetached_thenThrowsException() {
|
||||||
|
|
||||||
|
doNotCommit = true;
|
||||||
|
|
||||||
Person person = new Person();
|
Person person = new Person();
|
||||||
person.setName("John");
|
person.setName("John");
|
||||||
session.persist(person);
|
session.persist(person);
|
||||||
session.evict(person);
|
session.evict(person);
|
||||||
|
|
||||||
session.persist(person);
|
session.persist(person);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenMergeDetached_thenEntityUpdatedFromDatabase() {
|
||||||
|
|
||||||
|
Person person = new Person();
|
||||||
|
person.setName("John");
|
||||||
|
session.save(person);
|
||||||
|
session.flush();
|
||||||
|
session.evict(person);
|
||||||
|
|
||||||
|
person.setName("Mary");
|
||||||
|
Person mergedPerson = (Person) session.merge(person);
|
||||||
|
|
||||||
|
assertNotSame(person, mergedPerson);
|
||||||
|
assertEquals("Mary", mergedPerson.getName());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -92,7 +131,8 @@ public class SaveMethodsIntegrationTest {
|
||||||
|
|
||||||
assertNotNull(id);
|
assertNotNull(id);
|
||||||
|
|
||||||
session.getTransaction().commit();
|
session.getTransaction()
|
||||||
|
.commit();
|
||||||
session.close();
|
session.close();
|
||||||
|
|
||||||
assertEquals(id, person.getId());
|
assertEquals(id, person.getId());
|
||||||
|
@ -128,22 +168,6 @@ public class SaveMethodsIntegrationTest {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
|
||||||
public void whenMergeDetached_thenEntityUpdatedFromDatabase() {
|
|
||||||
|
|
||||||
Person person = new Person();
|
|
||||||
person.setName("John");
|
|
||||||
session.save(person);
|
|
||||||
session.evict(person);
|
|
||||||
|
|
||||||
person.setName("Mary");
|
|
||||||
Person mergedPerson = (Person) session.merge(person);
|
|
||||||
|
|
||||||
assertNotSame(person, mergedPerson);
|
|
||||||
assertEquals("Mary", mergedPerson.getName());
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void whenMergeTransient_thenNewEntitySavedToDatabase() {
|
public void whenMergeTransient_thenNewEntitySavedToDatabase() {
|
||||||
|
|
||||||
|
@ -151,7 +175,8 @@ public class SaveMethodsIntegrationTest {
|
||||||
person.setName("John");
|
person.setName("John");
|
||||||
Person mergedPerson = (Person) session.merge(person);
|
Person mergedPerson = (Person) session.merge(person);
|
||||||
|
|
||||||
session.getTransaction().commit();
|
session.getTransaction()
|
||||||
|
.commit();
|
||||||
session.beginTransaction();
|
session.beginTransaction();
|
||||||
|
|
||||||
assertNull(person.getId());
|
assertNull(person.getId());
|
||||||
|
@ -227,7 +252,8 @@ public class SaveMethodsIntegrationTest {
|
||||||
person.setName("John");
|
person.setName("John");
|
||||||
session.saveOrUpdate(person);
|
session.saveOrUpdate(person);
|
||||||
|
|
||||||
session.getTransaction().commit();
|
session.getTransaction()
|
||||||
|
.commit();
|
||||||
session.close();
|
session.close();
|
||||||
|
|
||||||
session = sessionFactory.openSession();
|
session = sessionFactory.openSession();
|
||||||
|
@ -250,7 +276,10 @@ public class SaveMethodsIntegrationTest {
|
||||||
|
|
||||||
@After
|
@After
|
||||||
public void tearDown() {
|
public void tearDown() {
|
||||||
session.getTransaction().commit();
|
if (!doNotCommit) {
|
||||||
|
session.getTransaction()
|
||||||
|
.commit();
|
||||||
|
}
|
||||||
session.close();
|
session.close();
|
||||||
}
|
}
|
||||||
|
|
|
@ -170,7 +170,6 @@
|
||||||
<guava.version>29.0-jre</guava.version>
|
<guava.version>29.0-jre</guava.version>
|
||||||
<hibernate-types.version>2.9.7</hibernate-types.version>
|
<hibernate-types.version>2.9.7</hibernate-types.version>
|
||||||
<hibernate.version>5.4.14.Final</hibernate.version>
|
<hibernate.version>5.4.14.Final</hibernate.version>
|
||||||
<jackson.version>2.10.3</jackson.version>
|
|
||||||
<javassist.version>3.27.0-GA</javassist.version>
|
<javassist.version>3.27.0-GA</javassist.version>
|
||||||
<jaxb.version>2.3.1</jaxb.version>
|
<jaxb.version>2.3.1</jaxb.version>
|
||||||
<log4jdbc.version>2.0.0</log4jdbc.version>
|
<log4jdbc.version>2.0.0</log4jdbc.version>
|
||||||
|
|
|
@ -19,14 +19,14 @@ public class Crud {
|
||||||
|
|
||||||
public static Result<Record> getAll(DSLContext context, Table<? extends Record> table) {
|
public static Result<Record> getAll(DSLContext context, Table<? extends Record> table) {
|
||||||
return context.select()
|
return context.select()
|
||||||
.from(table)
|
.from(table)
|
||||||
.fetch();
|
.fetch();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Result<Record> getFields(DSLContext context, Table<? extends Record> table, SelectFieldOrAsterisk... fields) {
|
public static Result<Record> getFields(DSLContext context, Table<? extends Record> table, SelectFieldOrAsterisk... fields) {
|
||||||
return context.select(fields)
|
return context.select(fields)
|
||||||
.from(table)
|
.from(table)
|
||||||
.fetch();
|
.fetch();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static <R extends Record> R getOne(DSLContext context, Table<R> table, Condition condition) {
|
public static <R extends Record> R getOne(DSLContext context, Table<R> table, Condition condition) {
|
||||||
|
@ -35,9 +35,9 @@ public class Crud {
|
||||||
|
|
||||||
public static <T> void update(DSLContext context, Table<? extends Record> table, Map<Field<T>, T> values, Condition condition) {
|
public static <T> void update(DSLContext context, Table<? extends Record> table, Map<Field<T>, T> values, Condition condition) {
|
||||||
context.update(table)
|
context.update(table)
|
||||||
.set(values)
|
.set(values)
|
||||||
.where(condition)
|
.where(condition)
|
||||||
.execute();
|
.execute();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static <R extends UpdatableRecord<R>> void update(UpdatableRecord<R> record) {
|
public static <R extends UpdatableRecord<R>> void update(UpdatableRecord<R> record) {
|
||||||
|
@ -46,8 +46,8 @@ public class Crud {
|
||||||
|
|
||||||
public static void delete(DSLContext context, Table<? extends Record> table, Condition condition) {
|
public static void delete(DSLContext context, Table<? extends Record> table, Condition condition) {
|
||||||
context.delete(table)
|
context.delete(table)
|
||||||
.where(condition)
|
.where(condition)
|
||||||
.execute();
|
.execute();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static <R extends UpdatableRecord<R>> void delete(UpdatableRecord<R> record) {
|
public static <R extends UpdatableRecord<R>> void delete(UpdatableRecord<R> record) {
|
||||||
|
|
|
@ -60,8 +60,8 @@ public class CrudExamples {
|
||||||
|
|
||||||
private void readValues(DSLContext context) {
|
private void readValues(DSLContext context) {
|
||||||
Result<Record> authors = getAll(
|
Result<Record> authors = getAll(
|
||||||
context,
|
context,
|
||||||
Author.AUTHOR
|
Author.AUTHOR
|
||||||
);
|
);
|
||||||
|
|
||||||
authors.forEach(author -> {
|
authors.forEach(author -> {
|
||||||
|
@ -73,15 +73,15 @@ public class CrudExamples {
|
||||||
});
|
});
|
||||||
|
|
||||||
Result<Record> articles = getFields(
|
Result<Record> articles = getFields(
|
||||||
context,
|
context,
|
||||||
Author.AUTHOR,
|
Author.AUTHOR,
|
||||||
Article.ARTICLE.ID, Article.ARTICLE.TITLE
|
Article.ARTICLE.ID, Article.ARTICLE.TITLE
|
||||||
);
|
);
|
||||||
|
|
||||||
AuthorRecord author = getOne(
|
AuthorRecord author = getOne(
|
||||||
context,
|
context,
|
||||||
Author.AUTHOR,
|
Author.AUTHOR,
|
||||||
Author.AUTHOR.ID.eq(1)
|
Author.AUTHOR.ID.eq(1)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -90,24 +90,22 @@ public class CrudExamples {
|
||||||
fieldsToUpdate.put(Author.AUTHOR.FIRST_NAME, "David");
|
fieldsToUpdate.put(Author.AUTHOR.FIRST_NAME, "David");
|
||||||
fieldsToUpdate.put(Author.AUTHOR.LAST_NAME, "Brown");
|
fieldsToUpdate.put(Author.AUTHOR.LAST_NAME, "Brown");
|
||||||
update(
|
update(
|
||||||
context,
|
context,
|
||||||
Author.AUTHOR,
|
Author.AUTHOR,
|
||||||
fieldsToUpdate,
|
fieldsToUpdate,
|
||||||
Author.AUTHOR.ID.eq(1)
|
Author.AUTHOR.ID.eq(1)
|
||||||
);
|
);
|
||||||
|
|
||||||
ArticleRecord article = context.fetchOne(Article.ARTICLE, Article.ARTICLE.ID.eq(1));
|
ArticleRecord article = context.fetchOne(Article.ARTICLE, Article.ARTICLE.ID.eq(1));
|
||||||
article.setTitle("A New Article Title");
|
article.setTitle("A New Article Title");
|
||||||
update(
|
update(article);
|
||||||
article
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void deleteValues(DSLContext context) {
|
private void deleteValues(DSLContext context) {
|
||||||
delete(
|
delete(
|
||||||
context,
|
context,
|
||||||
Article.ARTICLE,
|
Article.ARTICLE,
|
||||||
Article.ARTICLE.ID.eq(1)
|
Article.ARTICLE.ID.eq(1)
|
||||||
);
|
);
|
||||||
|
|
||||||
AuthorRecord author = context.fetchOne(Author.AUTHOR, Author.AUTHOR.ID.eq(1));
|
AuthorRecord author = context.fetchOne(Author.AUTHOR, Author.AUTHOR.ID.eq(1));
|
||||||
|
|
|
@ -81,8 +81,7 @@
|
||||||
<module>spring-data-redis</module>
|
<module>spring-data-redis</module>
|
||||||
<module>spring-data-solr</module>
|
<module>spring-data-solr</module>
|
||||||
<module>spring-hibernate-3</module>
|
<module>spring-hibernate-3</module>
|
||||||
<module>spring-hibernate-5</module> <!-- long running -->
|
<module>spring-hibernate-5</module> <!-- long running -->
|
||||||
<module>spring-hibernate4</module>
|
|
||||||
<module>spring-jpa</module>
|
<module>spring-jpa</module>
|
||||||
<module>spring-jpa-2</module>
|
<module>spring-jpa-2</module>
|
||||||
<module>spring-jdbc</module>
|
<module>spring-jdbc</module>
|
||||||
|
|
|
@ -6,6 +6,12 @@ This module contains articles about querying data using Spring Data JPA
|
||||||
- [Spring Data JPA @Query Annotation](https://www.baeldung.com/spring-data-jpa-query)
|
- [Spring Data JPA @Query Annotation](https://www.baeldung.com/spring-data-jpa-query)
|
||||||
- [Use Criteria Queries in a Spring Data Application](https://www.baeldung.com/spring-data-criteria-queries)
|
- [Use Criteria Queries in a Spring Data Application](https://www.baeldung.com/spring-data-criteria-queries)
|
||||||
- [Query Entities by Dates and Times with Spring Data JPA](https://www.baeldung.com/spring-data-jpa-query-by-date)
|
- [Query Entities by Dates and Times with Spring Data JPA](https://www.baeldung.com/spring-data-jpa-query-by-date)
|
||||||
|
- [Hibernate Pagination](https://www.baeldung.com/hibernate-pagination)
|
||||||
|
- [Sorting with Hibernate](https://www.baeldung.com/hibernate-sort)
|
||||||
|
- [Stored Procedures with Hibernate](https://www.baeldung.com/stored-procedures-with-hibernate-tutorial)
|
||||||
|
- [Eager/Lazy Loading In Hibernate](https://www.baeldung.com/hibernate-lazy-eager-loading)
|
||||||
|
- [Auditing with JPA, Hibernate, and Spring Data JPA](https://www.baeldung.com/database-auditing-jpa)
|
||||||
|
|
||||||
- More articles: [[<-- prev]](../spring-data-jpa-query)
|
- More articles: [[<-- prev]](../spring-data-jpa-query)
|
||||||
|
|
||||||
### Eclipse Config
|
### Eclipse Config
|
||||||
|
|
|
@ -18,6 +18,10 @@
|
||||||
<groupId>org.springframework.boot</groupId>
|
<groupId>org.springframework.boot</groupId>
|
||||||
<artifactId>spring-boot-starter-data-jpa</artifactId>
|
<artifactId>spring-boot-starter-data-jpa</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.security</groupId>
|
||||||
|
<artifactId>spring-security-core</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.h2database</groupId>
|
<groupId>com.h2database</groupId>
|
||||||
|
@ -28,6 +32,55 @@
|
||||||
<groupId>com.fasterxml.jackson.core</groupId>
|
<groupId>com.fasterxml.jackson.core</groupId>
|
||||||
<artifactId>jackson-databind</artifactId>
|
<artifactId>jackson-databind</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.hibernate</groupId>
|
||||||
|
<artifactId>hibernate-envers</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>javax.transaction</groupId>
|
||||||
|
<artifactId>jta</artifactId>
|
||||||
|
<version>${jta.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>mysql</groupId>
|
||||||
|
<artifactId>mysql-connector-java</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.google.guava</groupId>
|
||||||
|
<artifactId>guava</artifactId>
|
||||||
|
<version>${guava.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.tomcat</groupId>
|
||||||
|
<artifactId>tomcat-dbcp</artifactId>
|
||||||
|
<version>${tomcat-dbcp.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.hibernate</groupId>
|
||||||
|
<artifactId>hibernate-core</artifactId>
|
||||||
|
<version>${hibernate.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.hibernate</groupId>
|
||||||
|
<artifactId>hibernate-envers</artifactId>
|
||||||
|
<version>${hibernate.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework</groupId>
|
||||||
|
<artifactId>spring-test</artifactId>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.security</groupId>
|
||||||
|
<artifactId>spring-security-test</artifactId>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.hsqldb</groupId>
|
||||||
|
<artifactId>hsqldb</artifactId>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
|
@ -35,5 +88,10 @@
|
||||||
<maven-surefire-plugin.version>2.22.2</maven-surefire-plugin.version>
|
<maven-surefire-plugin.version>2.22.2</maven-surefire-plugin.version>
|
||||||
<junit-jupiter.version>5.6.2</junit-jupiter.version>
|
<junit-jupiter.version>5.6.2</junit-jupiter.version>
|
||||||
<junit.version>4.13</junit.version>
|
<junit.version>4.13</junit.version>
|
||||||
|
<tomcat-dbcp.version>9.0.0.M26</tomcat-dbcp.version>
|
||||||
|
<jta.version>1.1</jta.version>
|
||||||
|
<guava.version>21.0</guava.version>
|
||||||
|
<!-- persistence -->
|
||||||
|
<hibernate.version>5.2.10.Final</hibernate.version>
|
||||||
</properties>
|
</properties>
|
||||||
</project>
|
</project>
|
|
@ -1,4 +1,4 @@
|
||||||
package com.baeldung.spring;
|
package com.baeldung.config;
|
||||||
|
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
|
|
||||||
|
@ -15,8 +15,8 @@ import org.springframework.dao.annotation.PersistenceExceptionTranslationPostPro
|
||||||
import org.springframework.data.domain.AuditorAware;
|
import org.springframework.data.domain.AuditorAware;
|
||||||
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
|
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
|
||||||
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
|
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
|
||||||
import org.springframework.orm.hibernate4.HibernateTransactionManager;
|
import org.springframework.orm.hibernate5.HibernateTransactionManager;
|
||||||
import org.springframework.orm.hibernate4.LocalSessionFactoryBean;
|
import org.springframework.orm.hibernate5.LocalSessionFactoryBean;
|
||||||
import org.springframework.orm.jpa.JpaTransactionManager;
|
import org.springframework.orm.jpa.JpaTransactionManager;
|
||||||
import org.springframework.orm.jpa.JpaVendorAdapter;
|
import org.springframework.orm.jpa.JpaVendorAdapter;
|
||||||
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
|
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
|
||||||
|
@ -47,7 +47,7 @@ import com.google.common.base.Preconditions;
|
||||||
|
|
||||||
@Configuration
|
@Configuration
|
||||||
@EnableTransactionManagement
|
@EnableTransactionManagement
|
||||||
@EnableJpaRepositories(basePackages = { "com.baeldung.persistence" }, transactionManagerRef = "jpaTransactionManager")
|
@EnableJpaRepositories(basePackages = { "com.baeldung.persistence" }, transactionManagerRef = "jpaTransactionManager", entityManagerFactoryRef = "jpaEntityManager")
|
||||||
@EnableJpaAuditing(auditorAwareRef = "auditorProvider")
|
@EnableJpaAuditing(auditorAwareRef = "auditorProvider")
|
||||||
@PropertySource({ "classpath:persistence-h2.properties" })
|
@PropertySource({ "classpath:persistence-h2.properties" })
|
||||||
@ComponentScan({ "com.baeldung.persistence" })
|
@ComponentScan({ "com.baeldung.persistence" })
|
||||||
|
@ -75,7 +75,7 @@ public class PersistenceConfig {
|
||||||
return sessionFactory;
|
return sessionFactory;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Bean
|
@Bean("jpaEntityManager")
|
||||||
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
|
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
|
||||||
final LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean();
|
final LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean();
|
||||||
emf.setDataSource(restDataSource());
|
emf.setDataSource(restDataSource());
|
|
@ -1,4 +1,4 @@
|
||||||
package com.baeldung.spring;
|
package com.baeldung.config;
|
||||||
|
|
||||||
import org.springframework.context.annotation.ComponentScan;
|
import org.springframework.context.annotation.ComponentScan;
|
||||||
import org.springframework.context.annotation.Configuration;
|
import org.springframework.context.annotation.Configuration;
|
|
@ -9,11 +9,10 @@ import org.springframework.security.core.context.SecurityContextHolder;
|
||||||
public class AuditorAwareImpl implements AuditorAware<String> {
|
public class AuditorAwareImpl implements AuditorAware<String> {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getCurrentAuditor() {
|
public Optional<String> getCurrentAuditor() {
|
||||||
return Optional.ofNullable(SecurityContextHolder.getContext())
|
return Optional.ofNullable(SecurityContextHolder.getContext())
|
||||||
.map(e -> e.getAuthentication())
|
.map(e -> e.getAuthentication())
|
||||||
.map(Authentication::getName)
|
.map(Authentication::getName);
|
||||||
.orElse(null);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -1,9 +0,0 @@
|
||||||
package com.baeldung.persistence.dao;
|
|
||||||
|
|
||||||
import com.baeldung.persistence.model.Book;
|
|
||||||
import org.springframework.data.jpa.repository.JpaRepository;
|
|
||||||
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
|
|
||||||
|
|
||||||
public interface BookRepository extends JpaRepository<Book, Long>, BookRepositoryCustom, JpaSpecificationExecutor<Book> {
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,11 +0,0 @@
|
||||||
package com.baeldung.persistence.dao;
|
|
||||||
|
|
||||||
import com.baeldung.persistence.model.Book;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
public interface BookRepositoryCustom {
|
|
||||||
|
|
||||||
List<Book> findBooksByAuthorNameAndTitle(String authorName, String title);
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,44 +0,0 @@
|
||||||
package com.baeldung.persistence.dao;
|
|
||||||
|
|
||||||
import com.baeldung.persistence.model.Book;
|
|
||||||
import org.springframework.stereotype.Repository;
|
|
||||||
|
|
||||||
import javax.persistence.EntityManager;
|
|
||||||
import javax.persistence.TypedQuery;
|
|
||||||
import javax.persistence.criteria.CriteriaBuilder;
|
|
||||||
import javax.persistence.criteria.CriteriaQuery;
|
|
||||||
import javax.persistence.criteria.Predicate;
|
|
||||||
import javax.persistence.criteria.Root;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
@Repository
|
|
||||||
public class BookRepositoryImpl implements BookRepositoryCustom {
|
|
||||||
|
|
||||||
private EntityManager em;
|
|
||||||
|
|
||||||
public BookRepositoryImpl(EntityManager em) {
|
|
||||||
this.em = em;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public List<Book> findBooksByAuthorNameAndTitle(String authorName, String title) {
|
|
||||||
CriteriaBuilder cb = em.getCriteriaBuilder();
|
|
||||||
CriteriaQuery<Book> cq = cb.createQuery(Book.class);
|
|
||||||
|
|
||||||
Root<Book> book = cq.from(Book.class);
|
|
||||||
List<Predicate> predicates = new ArrayList<>();
|
|
||||||
|
|
||||||
if (authorName != null) {
|
|
||||||
predicates.add(cb.equal(book.get("author"), authorName));
|
|
||||||
}
|
|
||||||
if (title != null) {
|
|
||||||
predicates.add(cb.like(book.get("title"), "%" + title + "%"));
|
|
||||||
}
|
|
||||||
cq.where(predicates.toArray(new Predicate[0]));
|
|
||||||
|
|
||||||
TypedQuery<Book> query = em.createQuery(cq);
|
|
||||||
return query.getResultList();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,25 +0,0 @@
|
||||||
package com.baeldung.persistence.dao;
|
|
||||||
|
|
||||||
import com.baeldung.persistence.model.Book;
|
|
||||||
import org.springframework.stereotype.Service;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import static com.baeldung.persistence.dao.BookSpecifications.hasAuthor;
|
|
||||||
import static com.baeldung.persistence.dao.BookSpecifications.titleContains;
|
|
||||||
import static org.springframework.data.jpa.domain.Specification.where;
|
|
||||||
|
|
||||||
@Service
|
|
||||||
public class BookService {
|
|
||||||
|
|
||||||
private BookRepository bookRepository;
|
|
||||||
|
|
||||||
public BookService(BookRepository bookRepository) {
|
|
||||||
this.bookRepository = bookRepository;
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<Book> query(String author, String title) {
|
|
||||||
return bookRepository.findAll(where(hasAuthor(author)).and(titleContains(title)));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,16 +0,0 @@
|
||||||
package com.baeldung.persistence.dao;
|
|
||||||
|
|
||||||
import com.baeldung.persistence.model.Book;
|
|
||||||
import org.springframework.data.jpa.domain.Specification;
|
|
||||||
|
|
||||||
public class BookSpecifications {
|
|
||||||
|
|
||||||
public static Specification<Book> hasAuthor(String author) {
|
|
||||||
return (book, cq, cb) -> cb.equal(book.get("author"), author);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Specification<Book> titleContains(String title) {
|
|
||||||
return (book, cq, cb) -> cb.like(book.get("title"), "%" + title + "%");
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -12,7 +12,7 @@ import javax.persistence.criteria.Root;
|
||||||
|
|
||||||
public class AbstractJpaDao<T extends Serializable> extends AbstractDao<T> implements IOperations<T> {
|
public class AbstractJpaDao<T extends Serializable> extends AbstractDao<T> implements IOperations<T> {
|
||||||
|
|
||||||
@PersistenceContext
|
@PersistenceContext(unitName = "jpaEntityManager")
|
||||||
private EntityManager em;
|
private EntityManager em;
|
||||||
|
|
||||||
// API
|
// API
|
|
@ -1,36 +0,0 @@
|
||||||
package com.baeldung.persistence.model;
|
|
||||||
|
|
||||||
import javax.persistence.Entity;
|
|
||||||
import javax.persistence.Id;
|
|
||||||
|
|
||||||
@Entity
|
|
||||||
public class Book {
|
|
||||||
|
|
||||||
@Id
|
|
||||||
private Long id;
|
|
||||||
|
|
||||||
private String title;
|
|
||||||
|
|
||||||
private String author;
|
|
||||||
|
|
||||||
public Long getId() {
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getTitle() {
|
|
||||||
return title;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setTitle(String title) {
|
|
||||||
this.title = title;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getAuthor() {
|
|
||||||
return author;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setAuthor(String author) {
|
|
||||||
this.author = author;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -0,0 +1,31 @@
|
||||||
|
package com.baeldung.persistence.model;
|
||||||
|
|
||||||
|
import javax.persistence.Entity;
|
||||||
|
import javax.persistence.GeneratedValue;
|
||||||
|
import javax.persistence.Id;
|
||||||
|
|
||||||
|
@Entity
|
||||||
|
public class Person {
|
||||||
|
|
||||||
|
@Id
|
||||||
|
@GeneratedValue
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
public Long getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(Long id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
}
|
|
@ -2,6 +2,7 @@ package com.baeldung.persistence.service.common;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
import com.baeldung.persistence.dao.common.IOperations;
|
import com.baeldung.persistence.dao.common.IOperations;
|
||||||
import org.springframework.data.repository.CrudRepository;
|
import org.springframework.data.repository.CrudRepository;
|
||||||
|
@ -14,7 +15,8 @@ public abstract class AbstractSpringDataJpaService<T extends Serializable> imple
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public T findOne(final long id) {
|
public T findOne(final long id) {
|
||||||
return getDao().findOne(Long.valueOf(id));
|
Optional<T> opt = getDao().findById(Long.valueOf(id));
|
||||||
|
return opt.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -39,7 +41,7 @@ public abstract class AbstractSpringDataJpaService<T extends Serializable> imple
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void deleteById(final long entityId) {
|
public void deleteById(final long entityId) {
|
||||||
getDao().delete(Long.valueOf(entityId));
|
getDao().deleteById(Long.valueOf(entityId));
|
||||||
}
|
}
|
||||||
|
|
||||||
protected abstract CrudRepository<T, Serializable> getDao();
|
protected abstract CrudRepository<T, Serializable> getDao();
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue