Merge branch 'master' into thombergs-patch-31-1

This commit is contained in:
Tom Hombergs 2018-10-08 20:28:07 +02:00 committed by GitHub
commit 1a51c01c9f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
65 changed files with 1898 additions and 190 deletions

View File

@ -2,41 +2,22 @@
The "REST with Spring" Classes The "REST with Spring" Classes
============================== ==============================
Here's the Master Class of REST With Spring (price changes permanently next Friday): <br/> Here's the Master Class of REST With Spring (along with the newly announced Boot 2 material): <br/>
**[>> THE REST WITH SPRING MASTER CLASS](http://www.baeldung.com/rest-with-spring-course?utm_source=github&utm_medium=social&utm_content=tutorials&utm_campaign=rws#master-class)** **[>> THE REST WITH SPRING - MASTER CLASS](http://www.baeldung.com/rest-with-spring-course?utm_source=github&utm_medium=social&utm_content=tutorials&utm_campaign=rws#master-class)**
And here's the Master Class of Learn Spring Security: <br/> And here's the Master Class of Learn Spring Security: <br/>
**[>> LEARN SPRING SECURITY MASTER CLASS](http://www.baeldung.com/learn-spring-security-course?utm_source=github&utm_medium=social&utm_content=tutorials&utm_campaign=lss#master-class)** **[>> LEARN SPRING SECURITY - MASTER CLASS](http://www.baeldung.com/learn-spring-security-course?utm_source=github&utm_medium=social&utm_content=tutorials&utm_campaign=lss#master-class)**
Spring Tutorials Java and Spring Tutorials
================ ================
This project is **a collection of small and focused tutorials** each covering a single and well defined area of development. This project is **a collection of small and focused tutorials** - each covering a single and well defined area of development in the Java ecosystem.
Most of the tutorial projects are focused on the `Spring Framework` (and `Spring Security`). A strong focus of these is, of course, the Spring Framework - Spring, Spring Boot and Spring Securiyt.
In additional to Spring, the following technologies are in focus: `core Java`, `Jackson`, `HttpClient`, `Guava`. In additional to Spring, the following technologies are in focus: `core Java`, `Jackson`, `HttpClient`, `Guava`.
Building the project Building the project
==================== ====================
To do the full build, do: `mvn install -Pdefault -Dgib.enabled=false` To do the full build, do: `mvn install -Pdefault -Dgib.enabled=false`
Working with the code in Eclipse
================================
Any IDE can be used to work with the projects, but if you're using Eclipse, consider the following.
- import the included **formatter** in Eclipse:
`https://github.com/eugenp/tutorials/tree/master/eclipse`
CI - Jenkins
================================
This tutorials project is being built **[>> HERE](https://rest-security.ci.cloudbees.com/job/tutorials-unit/)**
### Relevant Articles:
================================
- [Apache Maven Standard Directory Layout](http://www.baeldung.com/maven-directory-structure)
- [Apache Maven Tutorial](http://www.baeldung.com/maven)
- [Designing a User Friendly Java Library](http://www.baeldung.com/design-a-user-friendly-java-library)

View File

@ -98,7 +98,7 @@ public class FindKthLargest {
private int randomPartition(Integer arr[], int left, int right) { private int randomPartition(Integer arr[], int left, int right) {
int n = right - left + 1; int n = right - left + 1;
int pivot = (int) (Math.random()) % n; int pivot = (int) (Math.random() * n);
swap(arr, left + pivot, right); swap(arr, left + pivot, right);
return partition(arr, left, right); return partition(arr, left, right);
} }

View File

@ -1,16 +1,18 @@
package com.baeldung.java8; package com.baeldung.java8;
import com.baeldung.java8.entity.Human; import static org.hamcrest.Matchers.equalTo;
import com.google.common.collect.Lists;
import com.google.common.primitives.Ints;
import org.junit.Assert;
import org.junit.Test;
import java.util.Collections; import java.util.Collections;
import java.util.Comparator; import java.util.Comparator;
import java.util.List; import java.util.List;
import java.util.stream.Collectors;
import static org.hamcrest.Matchers.equalTo; import org.junit.Assert;
import org.junit.Test;
import com.baeldung.java8.entity.Human;
import com.google.common.collect.Lists;
import com.google.common.primitives.Ints;
public class Java8SortUnitTest { public class Java8SortUnitTest {
@ -111,5 +113,22 @@ public class Java8SortUnitTest {
humans.sort(Comparator.comparing(Human::getName)); humans.sort(Comparator.comparing(Human::getName));
Assert.assertThat(humans.get(0), equalTo(new Human("Jack", 12))); Assert.assertThat(humans.get(0), equalTo(new Human("Jack", 12)));
} }
@Test
public final void givenStreamNaturalOrdering_whenSortingEntitiesByName_thenCorrectlySorted() {
final List<String> letters = Lists.newArrayList("B", "A", "C");
final List<String> sortedLetters = letters.stream().sorted().collect(Collectors.toList());
Assert.assertThat(sortedLetters.get(0), equalTo("A"));
}
@Test
public final void givenStreamCustomOrdering_whenSortingEntitiesByName_thenCorrectlySorted() {
final List<Human> humans = Lists.newArrayList(new Human("Sarah", 10), new Human("Jack", 12));
final Comparator<Human> nameComparator = (h1, h2) -> h1.getName().compareTo(h2.getName());
final List<Human> sortedHumans = humans.stream().sorted(nameComparator).collect(Collectors.toList());
Assert.assertThat(sortedHumans.get(0), equalTo(new Human("Jack", 12)));
}
} }

View File

@ -48,6 +48,7 @@
- [Thread Safe LIFO Data Structure Implementations](https://www.baeldung.com/java-lifo-thread-safe) - [Thread Safe LIFO Data Structure Implementations](https://www.baeldung.com/java-lifo-thread-safe)
- [Collections.emptyList() vs. New List Instance](https://www.baeldung.com/java-collections-emptylist-new-list) - [Collections.emptyList() vs. New List Instance](https://www.baeldung.com/java-collections-emptylist-new-list)
- [Initialize a HashMap in Java](https://www.baeldung.com/java-initialize-hashmap) - [Initialize a HashMap in Java](https://www.baeldung.com/java-initialize-hashmap)
- [Differences Between Collection.clear() and Collection.removeAll()](https://www.baeldung.com/java-collection-clear-vs-removeall)
- [Performance of contains() in a HashSet vs ArrayList](https://www.baeldung.com/java-hashset-arraylist-contains-performance) - [Performance of contains() in a HashSet vs ArrayList](https://www.baeldung.com/java-hashset-arraylist-contains-performance)
- [Get the Key for a Value from a Java Map](https://www.baeldung.com/java-map-key-from-value) - [Get the Key for a Value from a Java Map](https://www.baeldung.com/java-map-key-from-value)
- [Time Complexity of Java Collections](https://www.baeldung.com/java-collections-complexity) - [Time Complexity of Java Collections](https://www.baeldung.com/java-collections-complexity)

View File

@ -68,6 +68,11 @@
<artifactId>commons-exec</artifactId> <artifactId>commons-exec</artifactId>
<version>1.3</version> <version>1.3</version>
</dependency> </dependency>
<dependency>
<groupId>one.util</groupId>
<artifactId>streamex</artifactId>
<version>0.6.5</version>
</dependency>
</dependencies> </dependencies>

View File

@ -0,0 +1,105 @@
package com.baeldung.map.java_8;
import com.baeldung.sort.Employee;
import one.util.streamex.EntryStream;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class MergeMaps {
private static Map<String, Employee> map1 = new HashMap<>();
private static Map<String, Employee> map2 = new HashMap<>();
public static void main(String[] args) {
initialize();
mergeFunction();
streamConcat();
streamOf();
streamEx();
streamMerge();
}
private static void streamMerge() {
Map<String, Employee> map3 = map2.entrySet()
.stream()
.collect(
Collectors.toMap(
Map.Entry::getKey,
Map.Entry::getValue,
(v1, v2) -> new Employee(v1.getId(), v2.getName()),
() -> new HashMap<>(map1)
)
);
System.out.println(map3);
}
private static void streamEx() {
Map<String, Employee> map3 = EntryStream.of(map1)
.append(EntryStream.of(map2))
.toMap((e1, e2) -> e1);
System.out.println(map3);
}
private static void streamOf() {
Map<String, Employee> map3 = Stream.of(map1, map2)
.flatMap(map -> map.entrySet().stream())
.collect(
Collectors.toMap(
Map.Entry::getKey,
Map.Entry::getValue,
(v1, v2) -> new Employee(v1.getId(), v2.getName())
)
);
map3.entrySet().forEach(System.out::println);
}
private static void streamConcat() {
Map<String, Employee> result = Stream.concat(map1.entrySet().stream(), map2.entrySet().stream()).collect(Collectors.toMap(
Map.Entry::getKey,
Map.Entry::getValue,
(value1, value2) -> new Employee(value2.getId(), value1.getName())
));
result.entrySet().forEach(System.out::println);
}
private static void mergeFunction() {
Map<String, Employee> map3 = new HashMap<>(map1);
map2.forEach(
(key, value) -> map3.merge(key, value, (v1, v2) ->
new Employee(v1.getId(), v2.getName()))
);
map3.entrySet().forEach(System.out::println);
}
private static void initialize() {
Employee employee1 = new Employee(1L, "Henry");
map1.put(employee1.getName(), employee1);
Employee employee2 = new Employee(22L, "Annie");
map1.put(employee2.getName(), employee2);
Employee employee3 = new Employee(8L, "John");
map1.put(employee3.getName(), employee3);
Employee employee4 = new Employee(2L, "George");
map2.put(employee4.getName(), employee4);
Employee employee5 = new Employee(3L, "Henry");
map2.put(employee5.getName(), employee5);
}
}

View File

@ -0,0 +1,44 @@
package com.baeldung.java.map;
import static org.assertj.core.api.Assertions.assertThat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.collections4.MultiMap;
import org.apache.commons.collections4.MultiMapUtils;
import org.apache.commons.collections4.MultiValuedMap;
import org.apache.commons.collections4.map.MultiValueMap;
import org.apache.commons.collections4.multimap.ArrayListValuedHashMap;
import org.apache.commons.collections4.multimap.HashSetValuedHashMap;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.LinkedHashMultimap;
import com.google.common.collect.Multimap;
import com.google.common.collect.TreeMultimap;
public class KeyCheckTest {
@Test
public void whenKeyIsPresent_thenContainsKeyReturnsTrue() {
Map<String, String> map = Collections.singletonMap("key", "value");
assertTrue(map.containsKey("key"));
assertFalse(map.containsKey("missing"));
}
@Test
public void whenKeyHasNullValue_thenGetStillWorks() {
Map<String, String> map = Collections.singletonMap("nothing", null);
assertTrue(map.containsKey("nothing"));
assertNull(map.get("nothing"));
}
}

View File

@ -0,0 +1,48 @@
package com.baeldung.stream;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
public class OutputStreamExamples {
public void fileOutputStreamByteSequence(String file, String data) throws IOException {
byte[] bytes = data.getBytes();
try (OutputStream out = new FileOutputStream(file)) {
out.write(bytes);
}
}
public void fileOutputStreamByteSubSequence(String file, String data) throws IOException {
byte[] bytes = data.getBytes();
try (OutputStream out = new FileOutputStream(file)) {
out.write(bytes, 6, 5);
}
}
public void fileOutputStreamByteSingle(String file, String data) throws IOException {
byte[] bytes = data.getBytes();
try (OutputStream out = new FileOutputStream(file)) {
out.write(bytes[6]);
}
}
public void bufferedOutputStream(String file, String... data) throws IOException {
try (BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(file))) {
for (String s : data) {
out.write(s.getBytes());
out.write(" ".getBytes());
}
}
}
public void outputStreamWriter(String file, String data) throws IOException {
try (OutputStream out = new FileOutputStream(file); Writer writer = new OutputStreamWriter(out, "UTF-8")) {
writer.write(data);
}
}
}

View File

@ -0,0 +1,76 @@
package com.baeldung.stream;
import static org.junit.Assert.assertTrue;
import java.io.File;
import java.io.IOException;
import org.junit.Before;
import org.junit.Test;
public class OutputStreamExamplesTest {
StringBuilder filePath = new StringBuilder();
@Before
public void init() {
filePath.append("src");
filePath.append(File.separator);
filePath.append("test");
filePath.append(File.separator);
filePath.append("resources");
filePath.append(File.separator);
filePath.append("output_file.txt");
}
@Test
public void givenOutputStream_whenWriteSingleByteCalled_thenOutputCreated() throws IOException {
final File file = new File(filePath.toString());
OutputStreamExamples examples = new OutputStreamExamples();
examples.fileOutputStreamByteSingle(filePath.toString(), "Hello World!");
assertTrue(file.exists());
file.delete();
}
@Test
public void givenOutputStream_whenWriteByteSequenceCalled_thenOutputCreated() throws IOException {
final File file = new File(filePath.toString());
OutputStreamExamples examples = new OutputStreamExamples();
examples.fileOutputStreamByteSequence(filePath.toString(), "Hello World!");
assertTrue(file.exists());
file.delete();
}
@Test
public void givenOutputStream_whenWriteByteSubSequenceCalled_thenOutputCreated() throws IOException {
final File file = new File(filePath.toString());
OutputStreamExamples examples = new OutputStreamExamples();
examples.fileOutputStreamByteSubSequence(filePath.toString(), "Hello World!");
assertTrue(file.exists());
file.delete();
}
@Test
public void givenBufferedOutputStream_whenCalled_thenOutputCreated() throws IOException {
final File file = new File(filePath.toString());
OutputStreamExamples examples = new OutputStreamExamples();
examples.bufferedOutputStream(filePath.toString(), "Hello", "World!");
assertTrue(file.exists());
file.delete();
}
@Test
public void givenOutputStreamWriter_whenCalled_thenOutputCreated() throws IOException {
final File file = new File(filePath.toString());
OutputStreamExamples examples = new OutputStreamExamples();
examples.outputStreamWriter(filePath.toString(), "Hello World!");
assertTrue(file.exists());
file.delete();
}
}

View File

@ -25,7 +25,6 @@
- [The Traveling Salesman Problem in Java](http://www.baeldung.com/java-simulated-annealing-for-traveling-salesman) - [The Traveling Salesman Problem in Java](http://www.baeldung.com/java-simulated-annealing-for-traveling-salesman)
- [How to Create an Executable JAR with Maven](http://www.baeldung.com/executable-jar-with-maven) - [How to Create an Executable JAR with Maven](http://www.baeldung.com/executable-jar-with-maven)
- [How to Design a Genetic Algorithm in Java](http://www.baeldung.com/java-genetic-algorithm) - [How to Design a Genetic Algorithm in Java](http://www.baeldung.com/java-genetic-algorithm)
- [Spring Security Cache Control Headers](http://www.baeldung.com/spring-security-cache-control-headers)
- [Basic Introduction to JMX](http://www.baeldung.com/java-management-extensions) - [Basic Introduction to JMX](http://www.baeldung.com/java-management-extensions)
- [AWS Lambda With Java](http://www.baeldung.com/java-aws-lambda) - [AWS Lambda With Java](http://www.baeldung.com/java-aws-lambda)
- [Introduction to Nashorn](http://www.baeldung.com/java-nashorn) - [Introduction to Nashorn](http://www.baeldung.com/java-nashorn)
@ -37,7 +36,6 @@
- [Guide to sun.misc.Unsafe](http://www.baeldung.com/java-unsafe) - [Guide to sun.misc.Unsafe](http://www.baeldung.com/java-unsafe)
- [How to Perform a Simple HTTP Request in Java](http://www.baeldung.com/java-http-request) - [How to Perform a Simple HTTP Request in Java](http://www.baeldung.com/java-http-request)
- [Call Methods at Runtime Using Java Reflection](http://www.baeldung.com/java-method-reflection) - [Call Methods at Runtime Using Java Reflection](http://www.baeldung.com/java-method-reflection)
- [Guide to UUID in JAVA](http://www.baeldung.com/guide-to-uuid-in-java)
- [How to Add a Single Element to a Stream](http://www.baeldung.com/java-stream-append-prepend) - [How to Add a Single Element to a Stream](http://www.baeldung.com/java-stream-append-prepend)
- [Iterating Over Enum Values in Java](http://www.baeldung.com/java-enum-iteration) - [Iterating Over Enum Values in Java](http://www.baeldung.com/java-enum-iteration)
- [Kotlin Java Interoperability](http://www.baeldung.com/kotlin-java-interoperability) - [Kotlin Java Interoperability](http://www.baeldung.com/kotlin-java-interoperability)

View File

@ -0,0 +1,121 @@
package com.baeldung.kotlin
import org.junit.Test
import kotlin.test.assertEquals
import kotlin.test.assertFalse
class StructuralJumpUnitTest {
@Test
fun givenLoop_whenBreak_thenComplete() {
var value = ""
for (i in "hello_world") {
if (i == '_')
break
value += i.toString()
}
assertEquals("hello", value)
}
@Test
fun givenLoop_whenBreakWithLabel_thenComplete() {
var value = ""
outer_loop@ for (i in 'a'..'d') {
for (j in 1..3) {
value += "" + i + j
if (i == 'b' && j == 1)
break@outer_loop
}
}
assertEquals("a1a2a3b1", value)
}
@Test
fun givenLoop_whenContinue_thenComplete() {
var result = ""
for (i in "hello_world") {
if (i == '_')
continue
result += i
}
assertEquals("helloworld", result)
}
@Test
fun givenLoop_whenContinueWithLabel_thenComplete() {
var result = ""
outer_loop@ for (i in 'a'..'c') {
for (j in 1..3) {
if (i == 'b')
continue@outer_loop
result += "" + i + j
}
}
assertEquals("a1a2a3c1c2c3", result)
}
@Test
fun givenLambda_whenReturn_thenComplete() {
var result = returnInLambda();
assertEquals("hello", result)
}
private fun returnInLambda(): String {
var result = ""
"hello_world".forEach {
// non-local return directly to the caller
if (it == '_') return result
result += it.toString()
}
//this line won't be reached
return result;
}
@Test
fun givenLambda_whenReturnWithExplicitLabel_thenComplete() {
var result = ""
"hello_world".forEach lit@{
if (it == '_') {
// local return to the caller of the lambda, i.e. the forEach loop
return@lit
}
result += it.toString()
}
assertEquals("helloworld", result)
}
@Test
fun givenLambda_whenReturnWithImplicitLabel_thenComplete() {
var result = ""
"hello_world".forEach {
if (it == '_') {
// local return to the caller of the lambda, i.e. the forEach loop
return@forEach
}
result += it.toString()
}
assertEquals("helloworld", result)
}
@Test
fun givenAnonymousFunction_return_thenComplete() {
var result = ""
"hello_world".forEach(fun(element) {
// local return to the caller of the anonymous fun, i.e. the forEach loop
if (element == '_') return
result += element.toString()
})
assertEquals("helloworld", result)
}
@Test
fun givenAnonymousFunction_returnToLabel_thenComplete() {
var result = ""
run loop@{
"hello_world".forEach {
// non-local return from the lambda passed to run
if (it == '_') return@loop
result += it.toString()
}
}
assertEquals("hello", result)
}
}

View File

@ -14,4 +14,5 @@
- [Bootstrapping JPA Programmatically in Java](http://www.baeldung.com/java-bootstrap-jpa) - [Bootstrapping JPA Programmatically in Java](http://www.baeldung.com/java-bootstrap-jpa)
- [Optimistic Locking in JPA](http://www.baeldung.com/jpa-optimistic-locking) - [Optimistic Locking in JPA](http://www.baeldung.com/jpa-optimistic-locking)
- [Hibernate Entity Lifecycle](https://www.baeldung.com/hibernate-entity-lifecycle) - [Hibernate Entity Lifecycle](https://www.baeldung.com/hibernate-entity-lifecycle)
- [Mapping A Hibernate Query to a Custom Class](https://www.baeldung.com/hibernate-query-to-custom-class)
- [@JoinColumn Annotation Explained](https://www.baeldung.com/jpa-join-column) - [@JoinColumn Annotation Explained](https://www.baeldung.com/jpa-join-column)

View File

@ -0,0 +1,47 @@
package com.baeldung.hibernate.namingstrategy;
import org.hibernate.boot.model.naming.Identifier;
import org.hibernate.boot.model.naming.PhysicalNamingStrategy;
import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment;
public class CustomPhysicalNamingStrategy implements PhysicalNamingStrategy {
@Override
public Identifier toPhysicalCatalogName(final Identifier identifier, final JdbcEnvironment jdbcEnv) {
return convertToSnakeCase(identifier);
}
@Override
public Identifier toPhysicalColumnName(final Identifier identifier, final JdbcEnvironment jdbcEnv) {
return convertToSnakeCase(identifier);
}
@Override
public Identifier toPhysicalSchemaName(final Identifier identifier, final JdbcEnvironment jdbcEnv) {
return convertToSnakeCase(identifier);
}
@Override
public Identifier toPhysicalSequenceName(final Identifier identifier, final JdbcEnvironment jdbcEnv) {
return convertToSnakeCase(identifier);
}
@Override
public Identifier toPhysicalTableName(final Identifier identifier, final JdbcEnvironment jdbcEnv) {
return convertToSnakeCase(identifier);
}
private Identifier convertToSnakeCase(final Identifier identifier) {
if (identifier == null) {
return identifier;
}
final String regex = "([a-z])([A-Z])";
final String replacement = "$1_$2";
final String newName = identifier.getText()
.replaceAll(regex, replacement)
.toLowerCase();
return Identifier.toIdentifier(newName);
}
}

View File

@ -0,0 +1,56 @@
package com.baeldung.hibernate.namingstrategy;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "Customers")
public class Customer {
@Id
@GeneratedValue
private Long id;
private String firstName;
private String lastName;
@Column(name = "email")
private String emailAddress;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getEmailAddress() {
return emailAddress;
}
public void setEmailAddress(String emailAddress) {
this.emailAddress = emailAddress;
}
}

View File

@ -0,0 +1,75 @@
package com.baeldung.hibernate.namingstrategy;
import static org.junit.Assert.fail;
import java.io.IOException;
import java.util.Properties;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class NamingStrategyLiveTest {
private Session session;
@Before
public void init() {
try {
Configuration configuration = new Configuration();
Properties properties = new Properties();
properties.load(Thread.currentThread()
.getContextClassLoader()
.getResourceAsStream("hibernate-namingstrategy.properties"));
configuration.setProperties(properties);
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties())
.build();
MetadataSources metadataSources = new MetadataSources(serviceRegistry);
metadataSources.addAnnotatedClass(Customer.class);
SessionFactory factory = metadataSources.buildMetadata()
.buildSessionFactory();
session = factory.openSession();
} catch (HibernateException | IOException e) {
fail("Failed to initiate Hibernate Session [Exception:" + e.toString() + "]");
}
}
@After
public void close() {
if (session != null)
session.close();
}
@Test
public void testCustomPhysicalNamingStrategy() {
Customer customer = new Customer();
customer.setFirstName("first name");
customer.setLastName("last name");
customer.setEmailAddress("customer@example.com");
session.beginTransaction();
Long id = (Long) session.save(customer);
session.flush();
session.clear();
Object[] result = (Object[]) session.createNativeQuery("select c.first_name, c.last_name, c.email from customers c where c.id = :id")
.setParameter("id", id)
.getSingleResult();
}
}

View File

@ -0,0 +1,10 @@
hibernate.connection.driver_class=org.h2.Driver
hibernate.connection.url=jdbc:h2:mem:mydb1;DB_CLOSE_DELAY=-1
hibernate.connection.username=sa
hibernate.dialect=org.hibernate.dialect.H2Dialect
hibernate.show_sql=true
hibernate.hbm2ddl.auto=create-drop
hibernate.physical_naming_strategy=com.baeldung.hibernate.namingstrategy.CustomPhysicalNamingStrategy
hibernate.implicit_naming_strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyJpaCompliantImpl

View File

@ -118,7 +118,7 @@
<properties> <properties>
<!-- marshalling --> <!-- marshalling -->
<jackson.version>2.9.6</jackson.version> <jackson.version>2.9.7</jackson.version>
<!-- util --> <!-- util -->
<commons-lang3.version>3.8</commons-lang3.version> <commons-lang3.version>3.8</commons-lang3.version>
<joda-time.version>2.10</joda-time.version> <joda-time.version>2.10</joda-time.version>

View File

@ -0,0 +1,5 @@
package com.baeldung.jackson.xmlToJson;
public enum Color {
PINK, BLUE, YELLOW, RED;
}

View File

@ -0,0 +1,42 @@
package com.baeldung.jackson.xmlToJson;
public class Flower {
private String name;
private Color color;
private Integer petals;
public Flower() { }
public Flower(String name, Color color, Integer petals) {
this.name = name;
this.color = color;
this.petals = petals;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Color getColor() {
return color;
}
public void setColor(Color color) {
this.color = color;
}
public Integer getPetals() {
return petals;
}
public void setPetals(Integer petals) {
this.petals = petals;
}
}

View File

@ -0,0 +1,56 @@
package com.baeldung.jackson.xmlToJson;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import org.junit.Test;
import static org.junit.Assert.*;
import java.io.IOException;
public class XmlToJsonUnitTest {
@Test
public void givenAnXML_whenUseDataBidingToConvertToJSON_thenReturnDataOK() {
String flowerXML = "<Flower><name>Poppy</name><color>RED</color><petals>9</petals></Flower>";
try {
XmlMapper xmlMapper = new XmlMapper();
Flower poppy = xmlMapper.readValue(flowerXML, Flower.class);
assertEquals(poppy.getName(), "Poppy");
assertEquals(poppy.getColor(), Color.RED);
assertEquals(poppy.getPetals(), new Integer(9));
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(poppy);
assertEquals(json, "{\"name\":\"Poppy\",\"color\":\"RED\",\"petals\":9}");
System.out.println(json);
} catch(IOException e) {
e.printStackTrace();
}
}
@Test
public void givenAnXML_whenUseATreeConvertToJSON_thenReturnDataOK() {
String flowerXML = "<Flower><name>Poppy</name><color>RED</color><petals>9</petals></Flower>";
try {
XmlMapper xmlMapper = new XmlMapper();
JsonNode node = xmlMapper.readTree(flowerXML.getBytes());
ObjectMapper jsonMapper = new ObjectMapper();
String json = jsonMapper.writeValueAsString(node);
System.out.println(json);
assertEquals(json, "{\"name\":\"Poppy\",\"color\":\"RED\",\"petals\":\"9\"}");
} catch(IOException e) {
e.printStackTrace();
}
}
}

View File

@ -0,0 +1,20 @@
package com.baeldung.maths;
import static org.junit.Assert.assertTrue;
import org.junit.jupiter.api.Test;
public class MathSinUnitTest {
@Test
public void givenAnAngleInDegrees_whenUsingToRadians_thenResultIsInRadians() {
double angleInDegrees = 30;
double sinForDegrees = Math.sin(Math.toRadians(angleInDegrees)); // 0.5
double thirtyDegreesInRadians = 1/6 * Math.PI;
double sinForRadians = Math.sin(thirtyDegreesInRadians); // 0.5
assertTrue(sinForDegrees == sinForRadians);
}
}

View File

@ -28,6 +28,7 @@
- [Java Check a String for Lowercase/Uppercase Letter, Special Character and Digit](https://www.baeldung.com/java-lowercase-uppercase-special-character-digit-regex) - [Java Check a String for Lowercase/Uppercase Letter, Special Character and Digit](https://www.baeldung.com/java-lowercase-uppercase-special-character-digit-regex)
- [Convert java.util.Date to String](https://www.baeldung.com/java-util-date-to-string) - [Convert java.util.Date to String](https://www.baeldung.com/java-util-date-to-string)
- [String Not Empty Test Assertions in Java](https://www.baeldung.com/java-assert-string-not-empty) - [String Not Empty Test Assertions in Java](https://www.baeldung.com/java-assert-string-not-empty)
- [Get Substring from String in Java](https://www.baeldung.com/java-substring)
- [Converting a Stack Trace to a String in Java](https://www.baeldung.com/java-stacktrace-to-string) - [Converting a Stack Trace to a String in Java](https://www.baeldung.com/java-stacktrace-to-string)
- [Sorting a String Alphabetically in Java](https://www.baeldung.com/java-sort-string-alphabetically) - [Sorting a String Alphabetically in Java](https://www.baeldung.com/java-sort-string-alphabetically)
- [Remove Emojis from a Java String](https://www.baeldung.com/java-string-remove-emojis) - [Remove Emojis from a Java String](https://www.baeldung.com/java-string-remove-emojis)

View File

@ -1,3 +1,4 @@
- [Jersey Filters and Interceptors](http://www.baeldung.com/jersey-filters-interceptors) - [Jersey Filters and Interceptors](http://www.baeldung.com/jersey-filters-interceptors)
- [Jersey MVC Support](https://www.baeldung.com/jersey-mvc) - [Jersey MVC Support](https://www.baeldung.com/jersey-mvc)
- [Bean Validation in Jersey](https://www.baeldung.com/jersey-bean-validation)
- [Set a Response Body in JAX-RS](https://www.baeldung.com/jax-rs-response) - [Set a Response Body in JAX-RS](https://www.baeldung.com/jax-rs-response)

View File

@ -11,3 +11,4 @@
- [Apache Ignite with Spring Data](http://www.baeldung.com/apache-ignite-spring-data) - [Apache Ignite with Spring Data](http://www.baeldung.com/apache-ignite-spring-data)
- [Guide to JMapper](https://www.baeldung.com/jmapper) - [Guide to JMapper](https://www.baeldung.com/jmapper)
- [A Guide to Apache Crunch](https://www.baeldung.com/apache-crunch) - [A Guide to Apache Crunch](https://www.baeldung.com/apache-crunch)
- [Building a Data Pipeline with Flink and Kafka](https://www.baeldung.com/kafka-flink-data-pipeline)

3
maven-polyglot/README.md Normal file
View File

@ -0,0 +1,3 @@
To run the maven-polyglot-json-app successfully, you first have to build the maven-polyglot-json-extension module using: mvn clean install.
Related Articles:

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<extensions>
<extension>
<groupId>com.baeldung.maven.polyglot</groupId>
<artifactId>maven-polyglot-json-extension</artifactId>
<version>1.0-SNAPSHOT</version>
</extension>
</extensions>

View File

@ -0,0 +1,34 @@
{
"modelVersion": "4.0.0",
"groupId": "com.baeldung.maven.polyglot",
"artifactId": "maven-polyglot-json-app",
"version": "1.0-SNAPSHOT",
"name": "Json Maven Polyglot",
"parent": {
"groupId": "org.springframework.boot",
"artifactId": "spring-boot-starter-parent",
"version": "2.0.5.RELEASE",
"relativePath": null
},
"properties": {
"project.build.sourceEncoding": "UTF-8",
"project.reporting.outputEncoding": "UTF-8",
"maven.compiler.source": "1.8",
"maven.compiler.target": "1.8",
"java.version": "1.8"
},
"dependencies": [
{
"groupId": "org.springframework.boot",
"artifactId": "spring-boot-starter-web"
}
],
"build": {
"plugins": [
{
"groupId": "org.springframework.boot",
"artifactId": "spring-boot-maven-plugin"
}
]
}
}

View File

@ -0,0 +1,19 @@
package com.baeldung.maven.polyglot;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.GetMapping;
@RestController
@SpringBootApplication
public class MavenPolyglotApplication {
public static void main(String[] args) {
SpringApplication.run(MavenPolyglotApplication.class, args);
}
@GetMapping("/")
public String home(){
return "Hello JSON Maven Model !";
}
}

View File

@ -0,0 +1,109 @@
{
"modules": [],
"distributionManagement": null,
"properties": {
"project.reporting.outputEncoding": "UTF-8",
"java.version": "1.8",
"maven.compiler.source": "1.8",
"project.build.sourceEncoding": "UTF-8",
"maven.compiler.target": "1.8"
},
"dependencyManagement": null,
"dependencies": [
{
"groupId": "org.springframework.boot",
"artifactId": "spring-boot-starter-web",
"version": null,
"type": "jar",
"classifier": null,
"scope": null,
"systemPath": null,
"exclusions": [],
"optional": null,
"managementKey": "org.springframework.boot:spring-boot-starter-web:jar"
}
],
"repositories": [],
"pluginRepositories": [],
"reports": null,
"reporting": null,
"modelVersion": "4.0.0",
"parent": {
"groupId": "org.springframework.boot",
"artifactId": "spring-boot-starter-parent",
"version": "2.0.5.RELEASE",
"relativePath": "",
"id": "org.springframework.boot:spring-boot-starter-parent:pom:2.0.5.RELEASE"
},
"groupId": "com.demo.polyglot",
"artifactId": "maven-polyglot-app",
"version": "1.0.1",
"packaging": "jar",
"name": "Json Maven Polyglot",
"description": null,
"url": null,
"inceptionYear": null,
"organization": null,
"licenses": [],
"developers": [],
"contributors": [],
"mailingLists": [],
"prerequisites": null,
"scm": null,
"issueManagement": null,
"ciManagement": null,
"build": {
"plugins": [
{
"inherited": null,
"configuration": null,
"inheritanceApplied": true,
"groupId": "org.liquibase",
"artifactId": "liquibase-maven-plugin",
"version": "3.0.5",
"extensions": null,
"executions": [],
"dependencies": [],
"goals": null,
"key": "org.liquibase:liquibase-maven-plugin",
"id": "org.liquibase:liquibase-maven-plugin:3.0.5",
"executionsAsMap": {}
}
],
"pluginManagement": null,
"defaultGoal": null,
"resources": [],
"testResources": [],
"directory": null,
"finalName": null,
"filters": [],
"sourceDirectory": null,
"scriptSourceDirectory": null,
"testSourceDirectory": null,
"outputDirectory": null,
"testOutputDirectory": null,
"extensions": [],
"pluginsAsMap": {
"org.liquibase:liquibase-maven-plugin": {
"inherited": null,
"configuration": null,
"inheritanceApplied": true,
"groupId": "org.liquibase",
"artifactId": "liquibase-maven-plugin",
"version": "3.0.5",
"extensions": null,
"executions": [],
"dependencies": [],
"goals": null,
"key": "org.liquibase:liquibase-maven-plugin",
"id": "org.liquibase:liquibase-maven-plugin:3.0.5",
"executionsAsMap": {}
}
}
},
"profiles": [],
"modelEncoding": "UTF-8",
"pomFile": null,
"id": "com.demo.polyglot:maven-polyglot-app:jar:1.0.1",
"projectDirectory": null
}

View File

@ -0,0 +1,47 @@
<?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>
<groupId>com.baeldung.maven.polyglot</groupId>
<artifactId>maven-polyglot-json-extension</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-core</artifactId>
<version>3.5.4</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.6</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.plexus</groupId>
<artifactId>plexus-component-metadata</artifactId>
<version>1.7.1</version>
<executions>
<execution>
<goals>
<goal>generate-metadata</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

View File

@ -0,0 +1,62 @@
package com.demo.polyglot;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.maven.model.Model;
import org.apache.maven.model.building.FileModelSource;
import org.apache.maven.model.building.ModelProcessor;
import org.apache.maven.model.io.ModelParseException;
import org.apache.maven.model.io.ModelReader;
import org.codehaus.plexus.component.annotations.Component;
import org.codehaus.plexus.component.annotations.Requirement;
import org.codehaus.plexus.util.ReaderFactory;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
import java.util.Map;
@Component(role = ModelProcessor.class)
public class CustomModelProcessor implements ModelProcessor {
private static final String XML_POM = "pom.xml";
private static final String JSON_POM = "pom.json";
private static final String JSON_EXT = ".json";
ObjectMapper objectMapper = new ObjectMapper();
@Requirement
private ModelReader modelReader;
@Override
public File locatePom(File projectDirectory) {
File pomFile = new File(projectDirectory, JSON_POM);
if (!pomFile.exists()) {
pomFile = new File(projectDirectory, XML_POM);
}
return pomFile;
}
@Override
public Model read(InputStream input, Map<String, ?> options) throws IOException, ModelParseException {
try (final Reader in = ReaderFactory.newPlatformReader(input)) {
return read(in, options);
}
}
@Override
public Model read(Reader reader, Map<String, ?> options) throws IOException, ModelParseException {
FileModelSource source = (options != null) ? (FileModelSource) options.get(SOURCE) : null;
if (source != null && source.getLocation().endsWith(JSON_EXT)) {
Model model = objectMapper.readValue(reader, Model.class);
return model;
}
//It's a normal maven project with a pom.xml file
return modelReader.read(reader, options);
}
@Override
public Model read(File input, Map<String, ?> options) throws IOException, ModelParseException {
return null;
}
}

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<extensions>
<extension>
<groupId>io.takari.polyglot</groupId>
<artifactId>polyglot-yaml</artifactId>
<version>0.3.1</version>
</extension>
</extensions>

View File

@ -0,0 +1,7 @@
modelVersion: 4.0.0
groupId: com.baeldung.maven.polyglot
artifactId: maven-polyglot-yml-app
version: 1.0-SNAPSHOT
name: 'YAML Demo'
properties: {maven.compiler.source: 1.8, maven.compiler.target: 1.8}

View File

@ -0,0 +1,7 @@
package com.baeldung.maven.polyglot;
public class YamlDemoApplication {
public static void main(String[] args) {
System.out.println("Hello Maven Polyglot YAML !");
}
}

View File

@ -0,0 +1,109 @@
{
"modules": [],
"distributionManagement": null,
"properties": {
"project.reporting.outputEncoding": "UTF-8",
"java.version": "1.8",
"maven.compiler.source": "1.8",
"project.build.sourceEncoding": "UTF-8",
"maven.compiler.target": "1.8"
},
"dependencyManagement": null,
"dependencies": [
{
"groupId": "org.springframework.boot",
"artifactId": "spring-boot-starter-web",
"version": null,
"type": "jar",
"classifier": null,
"scope": null,
"systemPath": null,
"exclusions": [],
"optional": null,
"managementKey": "org.springframework.boot:spring-boot-starter-web:jar"
}
],
"repositories": [],
"pluginRepositories": [],
"reports": null,
"reporting": null,
"modelVersion": "4.0.0",
"parent": {
"groupId": "org.springframework.boot",
"artifactId": "spring-boot-starter-parent",
"version": "2.0.5.RELEASE",
"relativePath": "",
"id": "org.springframework.boot:spring-boot-starter-parent:pom:2.0.5.RELEASE"
},
"groupId": "com.demo.polyglot",
"artifactId": "maven-polyglot-app",
"version": "1.0.1",
"packaging": "jar",
"name": "Json Maven Polyglot",
"description": null,
"url": null,
"inceptionYear": null,
"organization": null,
"licenses": [],
"developers": [],
"contributors": [],
"mailingLists": [],
"prerequisites": null,
"scm": null,
"issueManagement": null,
"ciManagement": null,
"build": {
"plugins": [
{
"inherited": null,
"configuration": null,
"inheritanceApplied": true,
"groupId": "org.liquibase",
"artifactId": "liquibase-maven-plugin",
"version": "3.0.5",
"extensions": null,
"executions": [],
"dependencies": [],
"goals": null,
"key": "org.liquibase:liquibase-maven-plugin",
"id": "org.liquibase:liquibase-maven-plugin:3.0.5",
"executionsAsMap": {}
}
],
"pluginManagement": null,
"defaultGoal": null,
"resources": [],
"testResources": [],
"directory": null,
"finalName": null,
"filters": [],
"sourceDirectory": null,
"scriptSourceDirectory": null,
"testSourceDirectory": null,
"outputDirectory": null,
"testOutputDirectory": null,
"extensions": [],
"pluginsAsMap": {
"org.liquibase:liquibase-maven-plugin": {
"inherited": null,
"configuration": null,
"inheritanceApplied": true,
"groupId": "org.liquibase",
"artifactId": "liquibase-maven-plugin",
"version": "3.0.5",
"extensions": null,
"executions": [],
"dependencies": [],
"goals": null,
"key": "org.liquibase:liquibase-maven-plugin",
"id": "org.liquibase:liquibase-maven-plugin:3.0.5",
"executionsAsMap": {}
}
}
},
"profiles": [],
"modelEncoding": "UTF-8",
"pomFile": null,
"id": "com.demo.polyglot:maven-polyglot-app:jar:1.0.1",
"projectDirectory": null
}

24
pom.xml
View File

@ -551,18 +551,6 @@
<module>spring-security-rest</module> <module>spring-security-rest</module>
<module>spring-security-sso</module> <module>spring-security-sso</module>
<module>spring-security-x509</module> <module>spring-security-x509</module>
<module>spring-session</module>
<module>spring-sleuth</module>
<module>spring-social-login</module>
<module>spring-spel</module>
<module>spring-state-machine</module>
<module>spring-thymeleaf</module>
<module>spring-userservice</module>
<module>spring-zuul</module>
<module>spring-remoting</module>
<module>spring-reactor</module>
<module>spring-vertx</module>
<module>spring-jinq</module>
</modules> </modules>
</profile> </profile>
@ -601,6 +589,18 @@
<module>parent-java</module> <module>parent-java</module>
<module>parent-kotlin</module> <module>parent-kotlin</module>
<module>spring-session</module>
<module>spring-sleuth</module>
<module>spring-social-login</module>
<module>spring-spel</module>
<module>spring-state-machine</module>
<module>spring-thymeleaf</module>
<module>spring-userservice</module>
<module>spring-zuul</module>
<module>spring-remoting</module>
<module>spring-reactor</module>
<module>spring-vertx</module>
<module>spring-jinq</module>
<module>spring-rest-embedded-tomcat</module> <module>spring-rest-embedded-tomcat</module>
<module>testing-modules/testing</module> <module>testing-modules/testing</module>
<module>testing-modules/testng</module> <module>testing-modules/testng</module>

View File

@ -0,0 +1,9 @@
# Overview
This is an example of a ETL stream pipeline, mixing a starter application with custom transform and sink.
# Applications
JDBC Source - Application Starter distributed by default
customer-transform - Custom application to transform the data
customer-mongodb-sink - Custom application to sink the data

View File

@ -0,0 +1,75 @@
<?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>
<groupId>com.customer</groupId>
<artifactId>customer-mongodb-sink</artifactId>
<packaging>jar</packaging>
<name>customer-mongodb-sink</name>
<description>Example ETL Load Project</description>
<parent>
<artifactId>parent-boot-2</artifactId>
<groupId>com.baeldung</groupId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../../../parent-boot-2</relativePath>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Finchley.SR1</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-stream</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-stream-binder-rabbit</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-stream-test-support</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

View File

@ -0,0 +1,27 @@
package com.customer.customermongodbsink;
import org.springframework.data.mongodb.core.mapping.Document;
@Document(collection = "customer")
public class Customer {
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;
}
}

View File

@ -0,0 +1,18 @@
package com.customer.customermongodbsink;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.stream.annotation.EnableBinding;
import org.springframework.cloud.stream.annotation.StreamListener;
import org.springframework.cloud.stream.messaging.Sink;
@EnableBinding(Sink.class)
public class CustomerListener {
@Autowired
private CustomerRepository repository;
@StreamListener(Sink.INPUT)
public void save(Customer customer) {
repository.save(customer);
}
}

View File

@ -0,0 +1,12 @@
package com.customer.customermongodbsink;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class CustomerMongodbSinkApplication {
public static void main(String[] args) {
SpringApplication.run(CustomerMongodbSinkApplication.class, args);
}
}

View File

@ -0,0 +1,9 @@
package com.customer.customermongodbsink;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface CustomerRepository extends MongoRepository<Customer, Long> {
}

View File

@ -0,0 +1,68 @@
<?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>
<groupId>com.customer</groupId>
<artifactId>customer-transform</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>customer-transform</name>
<description>Example transform ETL step</description>
<parent>
<artifactId>parent-boot-2</artifactId>
<groupId>com.baeldung</groupId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../../../parent-boot-2</relativePath>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Finchley.SR1</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-stream-binder-rabbit</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-stream-test-support</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

View File

@ -0,0 +1,29 @@
package com.customer.customertransform;
import com.fasterxml.jackson.annotation.JsonProperty;
public class Customer {
private Long id;
private String name;
@JsonProperty("customer_name")
public void setName(String name) {
this.name = name;
}
@JsonProperty("name")
public String getName() {
return name;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
}

View File

@ -0,0 +1,16 @@
package com.customer.customertransform;
import org.springframework.cloud.stream.annotation.EnableBinding;
import org.springframework.cloud.stream.messaging.Processor;
import org.springframework.integration.annotation.Transformer;
@EnableBinding(Processor.class)
public class CustomerProcessorConfiguration {
@Transformer(inputChannel = Processor.INPUT, outputChannel = Processor.OUTPUT)
public Customer convertToPojo(Customer payload) {
return payload;
}
}

View File

@ -0,0 +1,12 @@
package com.customer.customertransform;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class CustomerTransformApplication {
public static void main(String[] args) {
SpringApplication.run(CustomerTransformApplication.class, args);
}
}

View File

@ -0,0 +1,20 @@
<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>
<groupId>org.baeldung.spring.cloud</groupId>
<artifactId>etl-spring-cloud-data-flow</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<parent>
<groupId>org.baeldung.spring.cloud</groupId>
<artifactId>spring-cloud-data-flow</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modules>
<module>customer-mongodb-sink</module>
<module>customer-transform</module>
</modules>
</project>

View File

@ -19,6 +19,7 @@
<module>time-processor</module> <module>time-processor</module>
<module>log-sink</module> <module>log-sink</module>
<module>batch-job</module> <module>batch-job</module>
<module>etl</module>
</modules> </modules>
</project> </project>

View File

@ -8,9 +8,9 @@
<parent> <parent>
<groupId>com.baeldung</groupId> <groupId>com.baeldung</groupId>
<artifactId>parent-spring-4</artifactId> <artifactId>parent-spring-5</artifactId>
<version>0.0.1-SNAPSHOT</version> <version>0.0.1-SNAPSHOT</version>
<relativePath>../parent-spring-4</relativePath> <relativePath>../parent-spring-5</relativePath>
</parent> </parent>
<dependencies> <dependencies>
@ -19,6 +19,28 @@
<artifactId>spring-data-mongodb</artifactId> <artifactId>spring-data-mongodb</artifactId>
<version>${org.springframework.data.version}</version> <version>${org.springframework.data.version}</version>
</dependency> </dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-releasetrain</artifactId>
<version>Lovelace-M3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongodb-driver-reactivestreams</artifactId>
<version>${mongodb-reactivestreams.version}</version>
</dependency>
<dependency>
<groupId>io.projectreactor</groupId>
<artifactId>reactor-test</artifactId>
<version>${projectreactor.version}</version>
<scope>test</scope>
</dependency>
<dependency> <dependency>
<groupId>org.springframework</groupId> <groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId> <artifactId>spring-core</artifactId>
@ -48,6 +70,17 @@
</dependency> </dependency>
</dependencies> </dependencies>
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<build> <build>
<plugins> <plugins>
<plugin> <plugin>
@ -70,10 +103,12 @@
</build> </build>
<properties> <properties>
<org.springframework.data.version>1.10.4.RELEASE</org.springframework.data.version> <org.springframework.data.version>2.1.0.RELEASE</org.springframework.data.version>
<rest-assured.version>2.9.0</rest-assured.version>
<querydsl.version>4.1.4</querydsl.version> <querydsl.version>4.1.4</querydsl.version>
<mysema.maven.version>1.1.3</mysema.maven.version> <mysema.maven.version>1.1.3</mysema.maven.version>
<spring.version>5.1.0.RELEASE</spring.version>
<mongodb-reactivestreams.version>1.9.2</mongodb-reactivestreams.version>
<projectreactor.version>3.2.0.RELEASE</projectreactor.version>
</properties> </properties>
</project> </project>

View File

@ -1,21 +1,23 @@
package com.baeldung.config; package com.baeldung.config;
import com.mongodb.Mongo;
import com.mongodb.MongoClient;
import com.baeldung.converter.UserWriterConverter;
import com.baeldung.event.CascadeSaveMongoEventListener;
import com.baeldung.event.UserCascadeSaveMongoEventListener;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.convert.converter.Converter;
import org.springframework.data.mongodb.config.AbstractMongoConfiguration;
import org.springframework.data.mongodb.core.convert.CustomConversions;
import org.springframework.data.mongodb.gridfs.GridFsTemplate;
import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.convert.converter.Converter;
import org.springframework.data.mongodb.MongoDbFactory;
import org.springframework.data.mongodb.MongoTransactionManager;
import org.springframework.data.mongodb.config.AbstractMongoConfiguration;
import org.springframework.data.mongodb.core.convert.MongoCustomConversions;
import org.springframework.data.mongodb.gridfs.GridFsTemplate;
import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;
import com.baeldung.converter.UserWriterConverter;
import com.baeldung.event.CascadeSaveMongoEventListener;
import com.baeldung.event.UserCascadeSaveMongoEventListener;
import com.mongodb.MongoClient;
@Configuration @Configuration
@EnableMongoRepositories(basePackages = "com.baeldung.repository") @EnableMongoRepositories(basePackages = "com.baeldung.repository")
public class MongoConfig extends AbstractMongoConfiguration { public class MongoConfig extends AbstractMongoConfiguration {
@ -28,7 +30,7 @@ public class MongoConfig extends AbstractMongoConfiguration {
} }
@Override @Override
public Mongo mongo() throws Exception { public MongoClient mongoClient() {
return new MongoClient("127.0.0.1", 27017); return new MongoClient("127.0.0.1", 27017);
} }
@ -48,13 +50,19 @@ public class MongoConfig extends AbstractMongoConfiguration {
} }
@Override @Override
public CustomConversions customConversions() { public MongoCustomConversions customConversions() {
converters.add(new UserWriterConverter()); converters.add(new UserWriterConverter());
return new CustomConversions(converters); return new MongoCustomConversions(converters);
} }
@Bean @Bean
public GridFsTemplate gridFsTemplate() throws Exception { public GridFsTemplate gridFsTemplate() throws Exception {
return new GridFsTemplate(mongoDbFactory(), mappingMongoConverter()); return new GridFsTemplate(mongoDbFactory(), mappingMongoConverter());
} }
@Bean
MongoTransactionManager transactionManager(MongoDbFactory dbFactory) {
return new MongoTransactionManager(dbFactory);
}
} }

View File

@ -0,0 +1,23 @@
package com.baeldung.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.config.AbstractReactiveMongoConfiguration;
import org.springframework.data.mongodb.repository.config.EnableReactiveMongoRepositories;
import com.mongodb.reactivestreams.client.MongoClient;
import com.mongodb.reactivestreams.client.MongoClients;
@Configuration
@EnableReactiveMongoRepositories(basePackages = "com.baeldung.reactive.repository")
public class MongoReactiveConfig extends AbstractReactiveMongoConfiguration {
@Override
public MongoClient reactiveMongoClient() {
return MongoClients.create();
}
@Override
protected String getDatabaseName() {
return "reactive";
}
}

View File

@ -1,18 +1,18 @@
package com.baeldung.config; package com.baeldung.config;
import com.mongodb.Mongo;
import com.mongodb.MongoClient;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.repository.config.EnableMongoRepositories; import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;
import com.mongodb.MongoClient;
@Configuration @Configuration
@EnableMongoRepositories(basePackages = "com.baeldung.repository") @EnableMongoRepositories(basePackages = "com.baeldung.repository")
public class SimpleMongoConfig { public class SimpleMongoConfig {
@Bean @Bean
public Mongo mongo() throws Exception { public MongoClient mongo() throws Exception {
return new MongoClient("localhost"); return new MongoClient("localhost");
} }

View File

@ -0,0 +1,9 @@
package com.baeldung.reactive.repository;
import org.springframework.data.mongodb.repository.ReactiveMongoRepository;
import com.baeldung.model.User;
public interface UserRepository extends ReactiveMongoRepository<User, String> {
}

View File

@ -1,13 +1,14 @@
package com.baeldung.repository; package com.baeldung.repository;
import com.baeldung.model.User;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.data.mongodb.repository.Query;
import org.springframework.data.querydsl.QueryDslPredicateExecutor;
import java.util.List; import java.util.List;
public interface UserRepository extends MongoRepository<User, String>, QueryDslPredicateExecutor<User> { import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.data.mongodb.repository.Query;
import org.springframework.data.querydsl.QuerydslPredicateExecutor;
import com.baeldung.model.User;
public interface UserRepository extends MongoRepository<User, String>, QuerydslPredicateExecutor<User> {
@Query("{ 'name' : ?0 }") @Query("{ 'name' : ?0 }")
List<User> findUsersByName(String name); List<User> findUsersByName(String name);

View File

@ -3,17 +3,17 @@
xmlns:p="http://www.springframework.org/schema/p" xmlns:mongo="http://www.springframework.org/schema/data/mongo" xmlns:p="http://www.springframework.org/schema/p" xmlns:mongo="http://www.springframework.org/schema/data/mongo"
xsi:schemaLocation=" xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/data/mongo http://www.springframework.org/schema/data/mongo
http://www.springframework.org/schema/data/mongo/spring-mongo-1.0.xsd http://www.springframework.org/schema/data/mongo/spring-mongo.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd" http://www.springframework.org/schema/context/spring-context.xsd"
> >
<context:annotation-config/> <context:annotation-config/>
<mongo:mongo id="mongo" host="localhost" /> <mongo:mongo-client id="mongoClient" host="localhost" />
<mongo:db-factory id="mongoDbFactory" dbname="test" mongo-ref="mongo" /> <mongo:db-factory id="mongoDbFactory" dbname="test" mongo-ref="mongoClient" />
<bean id="gridFsTemplate" class="org.springframework.data.mongodb.gridfs.GridFsTemplate"> <bean id="gridFsTemplate" class="org.springframework.data.mongodb.gridfs.GridFsTemplate">
<constructor-arg ref="mongoDbFactory" /> <constructor-arg ref="mongoDbFactory" />
@ -27,12 +27,12 @@
<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/> <bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>
<mongo:repositories base-package="org.baeldung.repository" mongo-template-ref="mongoTemplate"/> <mongo:repositories base-package="com.baeldung.repository" mongo-template-ref="mongoTemplate"/>
<bean class="org.baeldung.event.CascadeSaveMongoEventListener"> <bean class="com.baeldung.event.CascadeSaveMongoEventListener">
</bean> </bean>
<mongo:mapping-converter id="mongoConverter" base-package="org.baeldung.converter"> <mongo:mapping-converter id="mongoConverter" base-package="com.baeldung.converter">
<mongo:custom-converters base-package="org.baeldung.converter"/> <mongo:custom-converters base-package="org.baeldung.converter"/>
</mongo:mapping-converter> </mongo:mapping-converter>

View File

@ -1,12 +1,24 @@
package com.baeldung.aggregation; package com.baeldung.aggregation;
import com.mongodb.DB; import static org.junit.Assert.assertEquals;
import com.mongodb.DBCollection; import static org.junit.Assert.assertTrue;
import com.mongodb.DBObject; import static org.springframework.data.mongodb.core.aggregation.Aggregation.group;
import com.mongodb.MongoClient; import static org.springframework.data.mongodb.core.aggregation.Aggregation.limit;
import com.mongodb.util.JSON; import static org.springframework.data.mongodb.core.aggregation.Aggregation.match;
import com.baeldung.aggregation.model.StatePopulation; import static org.springframework.data.mongodb.core.aggregation.Aggregation.newAggregation;
import com.baeldung.config.MongoConfig; import static org.springframework.data.mongodb.core.aggregation.Aggregation.project;
import static org.springframework.data.mongodb.core.aggregation.Aggregation.sort;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.StreamSupport;
import org.bson.Document;
import org.junit.AfterClass; import org.junit.AfterClass;
import org.junit.BeforeClass; import org.junit.BeforeClass;
import org.junit.Test; import org.junit.Test;
@ -26,23 +38,11 @@ import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import java.io.BufferedReader; import com.baeldung.aggregation.model.StatePopulation;
import java.io.InputStream; import com.baeldung.config.MongoConfig;
import java.io.InputStreamReader; import com.mongodb.MongoClient;
import java.util.ArrayList; import com.mongodb.client.MongoCollection;
import java.util.Collections; import com.mongodb.client.MongoDatabase;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.StreamSupport;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.springframework.data.mongodb.core.aggregation.Aggregation.group;
import static org.springframework.data.mongodb.core.aggregation.Aggregation.limit;
import static org.springframework.data.mongodb.core.aggregation.Aggregation.match;
import static org.springframework.data.mongodb.core.aggregation.Aggregation.newAggregation;
import static org.springframework.data.mongodb.core.aggregation.Aggregation.project;
import static org.springframework.data.mongodb.core.aggregation.Aggregation.sort;
@RunWith(SpringJUnit4ClassRunner.class) @RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = MongoConfig.class) @ContextConfiguration(classes = MongoConfig.class)
@ -56,23 +56,22 @@ public class ZipsAggregationLiveTest {
@BeforeClass @BeforeClass
public static void setupTests() throws Exception { public static void setupTests() throws Exception {
client = new MongoClient(); client = new MongoClient();
DB testDB = client.getDB("test"); MongoDatabase testDB = client.getDatabase("test");
DBCollection zipsCollection = testDB.getCollection("zips"); MongoCollection<Document> zipsCollection = testDB.getCollection("zips");
zipsCollection.drop(); zipsCollection.drop();
InputStream zipsJsonStream = ZipsAggregationLiveTest.class.getResourceAsStream("/zips.json"); InputStream zipsJsonStream = ZipsAggregationLiveTest.class.getResourceAsStream("/zips.json");
BufferedReader reader = new BufferedReader(new InputStreamReader(zipsJsonStream)); BufferedReader reader = new BufferedReader(new InputStreamReader(zipsJsonStream));
reader.lines() reader.lines()
.forEach(line -> zipsCollection.insert((DBObject) JSON.parse(line))); .forEach(line -> zipsCollection.insertOne(Document.parse(line)));
reader.close(); reader.close();
} }
@AfterClass @AfterClass
public static void tearDown() throws Exception { public static void tearDown() throws Exception {
client = new MongoClient(); client = new MongoClient();
DB testDB = client.getDB("test"); MongoDatabase testDB = client.getDatabase("test");
DBCollection zipsCollection = testDB.getCollection("zips"); MongoCollection<Document> zipsCollection = testDB.getCollection("zips");
zipsCollection.drop(); zipsCollection.drop();
client.close(); client.close();
} }
@ -140,13 +139,13 @@ public class ZipsAggregationLiveTest {
Aggregation aggregation = newAggregation(sumZips, sortByCount, groupFirstAndLast); Aggregation aggregation = newAggregation(sumZips, sortByCount, groupFirstAndLast);
AggregationResults<DBObject> result = mongoTemplate.aggregate(aggregation, "zips", DBObject.class); AggregationResults<Document> result = mongoTemplate.aggregate(aggregation, "zips", Document.class);
DBObject dbObject = result.getUniqueMappedResult(); Document document = result.getUniqueMappedResult();
assertEquals("DC", dbObject.get("minZipState")); assertEquals("DC", document.get("minZipState"));
assertEquals(24, dbObject.get("minZipCount")); assertEquals(24, document.get("minZipCount"));
assertEquals("TX", dbObject.get("maxZipState")); assertEquals("TX", document.get("maxZipState"));
assertEquals(1671, dbObject.get("maxZipCount")); assertEquals(1671, document.get("maxZipCount"));
} }
} }

View File

@ -1,8 +1,19 @@
package com.baeldung.gridfs; package com.baeldung.gridfs;
import com.mongodb.BasicDBObject; import static org.hamcrest.CoreMatchers.is;
import com.mongodb.DBObject; import static org.hamcrest.Matchers.nullValue;
import com.mongodb.gridfs.GridFSDBFile; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertThat;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import org.bson.types.ObjectId;
import org.junit.After; import org.junit.After;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
@ -16,18 +27,9 @@ import org.springframework.data.mongodb.gridfs.GridFsTemplate;
import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import java.io.FileInputStream; import com.mongodb.BasicDBObject;
import java.io.FileNotFoundException; import com.mongodb.DBObject;
import java.io.IOException; import com.mongodb.client.gridfs.model.GridFSFile;
import java.io.InputStream;
import java.util.List;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.Matchers.nullValue;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertThat;
@ContextConfiguration("file:src/main/resources/mongoConfig.xml") @ContextConfiguration("file:src/main/resources/mongoConfig.xml")
@RunWith(SpringJUnit4ClassRunner.class) @RunWith(SpringJUnit4ClassRunner.class)
@ -40,8 +42,9 @@ public class GridFSLiveTest {
@After @After
public void tearDown() { public void tearDown() {
List<GridFSDBFile> fileList = gridFsTemplate.find(null); List<GridFSFile> fileList = new ArrayList<GridFSFile>();
for (GridFSDBFile file : fileList) { gridFsTemplate.find(new Query()).into(fileList);
for (GridFSFile file : fileList) {
gridFsTemplate.delete(new Query(Criteria.where("filename").is(file.getFilename()))); gridFsTemplate.delete(new Query(Criteria.where("filename").is(file.getFilename())));
} }
} }
@ -54,7 +57,7 @@ public class GridFSLiveTest {
String id = ""; String id = "";
try { try {
inputStream = new FileInputStream("src/main/resources/test.png"); inputStream = new FileInputStream("src/main/resources/test.png");
id = gridFsTemplate.store(inputStream, "test.png", "image/png", metaData).getId().toString(); id = gridFsTemplate.store(inputStream, "test.png", "image/png", metaData).toString();
} catch (FileNotFoundException ex) { } catch (FileNotFoundException ex) {
logger.error("File not found", ex); logger.error("File not found", ex);
} finally { } finally {
@ -75,10 +78,10 @@ public class GridFSLiveTest {
DBObject metaData = new BasicDBObject(); DBObject metaData = new BasicDBObject();
metaData.put("user", "alex"); metaData.put("user", "alex");
InputStream inputStream = null; InputStream inputStream = null;
String id = ""; ObjectId id = null;
try { try {
inputStream = new FileInputStream("src/main/resources/test.png"); inputStream = new FileInputStream("src/main/resources/test.png");
id = gridFsTemplate.store(inputStream, "test.png", "image/png", metaData).getId().toString(); id = gridFsTemplate.store(inputStream, "test.png", "image/png", metaData);
} catch (FileNotFoundException ex) { } catch (FileNotFoundException ex) {
logger.error("File not found", ex); logger.error("File not found", ex);
} finally { } finally {
@ -91,22 +94,22 @@ public class GridFSLiveTest {
} }
} }
GridFSDBFile gridFSDBFile = gridFsTemplate.findOne(new Query(Criteria.where("_id").is(id))); GridFSFile gridFSFile = gridFsTemplate.findOne(new Query(Criteria.where("_id").is(id)));
assertNotNull(gridFSDBFile); assertNotNull(gridFSFile);
assertNotNull(gridFSDBFile.getInputStream()); // assertNotNull(gridFSFile.getInputStream());
assertThat(gridFSDBFile.numChunks(), is(1)); // assertThat(gridFSFile.numChunks(), is(1));
assertThat(gridFSDBFile.containsField("filename"), is(true)); // assertThat(gridFSFile.containsField("filename"), is(true));
assertThat(gridFSDBFile.get("filename"), is("test.png")); assertThat(gridFSFile.getFilename(), is("test.png"));
assertThat(gridFSDBFile.getId(), is(id)); assertThat(gridFSFile.getObjectId(), is(id));
assertThat(gridFSDBFile.keySet().size(), is(9)); // assertThat(gridFSFile.keySet().size(), is(9));
assertNotNull(gridFSDBFile.getMD5()); // assertNotNull(gridFSFile.getMD5());
assertNotNull(gridFSDBFile.getUploadDate()); assertNotNull(gridFSFile.getUploadDate());
assertNull(gridFSDBFile.getAliases()); // assertNull(gridFSFile.getAliases());
assertNotNull(gridFSDBFile.getChunkSize()); assertNotNull(gridFSFile.getChunkSize());
assertThat(gridFSDBFile.getContentType(), is("image/png")); assertThat(gridFSFile.getMetadata().get("_contentType"), is("image/png"));
assertThat(gridFSDBFile.getFilename(), is("test.png")); assertThat(gridFSFile.getFilename(), is("test.png"));
assertThat(gridFSDBFile.getMetaData().get("user"), is("alex")); assertThat(gridFSFile.getMetadata().get("user"), is("alex"));
} }
@Test @Test
@ -133,10 +136,11 @@ public class GridFSLiveTest {
} }
} }
List<GridFSDBFile> gridFSDBFiles = gridFsTemplate.find(null); List<GridFSFile> gridFSFiles = new ArrayList<GridFSFile>();
gridFsTemplate.find(new Query()).into(gridFSFiles);
assertNotNull(gridFSDBFiles); assertNotNull(gridFSFiles);
assertThat(gridFSDBFiles.size(), is(2)); assertThat(gridFSFiles.size(), is(2));
} }
@Test @Test
@ -163,10 +167,11 @@ public class GridFSLiveTest {
} }
} }
List<GridFSDBFile> gridFSDBFiles = gridFsTemplate.find(new Query(Criteria.where("metadata.user").is("alex"))); List<GridFSFile> gridFSFiles = new ArrayList<GridFSFile>();
gridFsTemplate.find(new Query(Criteria.where("metadata.user").is("alex"))).into(gridFSFiles);
assertNotNull(gridFSDBFiles); assertNotNull(gridFSFiles);
assertThat(gridFSDBFiles.size(), is(1)); assertThat(gridFSFiles.size(), is(1));
} }
@Test @Test
@ -177,7 +182,7 @@ public class GridFSLiveTest {
String id = ""; String id = "";
try { try {
inputStream = new FileInputStream("src/main/resources/test.png"); inputStream = new FileInputStream("src/main/resources/test.png");
id = gridFsTemplate.store(inputStream, "test.png", "image/png", metaData).getId().toString(); id = gridFsTemplate.store(inputStream, "test.png", "image/png", metaData).toString();
} catch (FileNotFoundException ex) { } catch (FileNotFoundException ex) {
logger.error("File not found", ex); logger.error("File not found", ex);
} finally { } finally {
@ -200,10 +205,9 @@ public class GridFSLiveTest {
DBObject metaData = new BasicDBObject(); DBObject metaData = new BasicDBObject();
metaData.put("user", "alex"); metaData.put("user", "alex");
InputStream inputStream = null; InputStream inputStream = null;
String id = "";
try { try {
inputStream = new FileInputStream("src/main/resources/test.png"); inputStream = new FileInputStream("src/main/resources/test.png");
id = gridFsTemplate.store(inputStream, "test.png", "image/png", metaData).getId().toString(); gridFsTemplate.store(inputStream, "test.png", "image/png", metaData).toString();
} catch (FileNotFoundException ex) { } catch (FileNotFoundException ex) {
logger.error("File not found", ex); logger.error("File not found", ex);
} finally { } finally {

View File

@ -1,8 +1,11 @@
package com.baeldung.mongotemplate; package com.baeldung.mongotemplate;
import com.baeldung.config.MongoConfig; import static org.hamcrest.CoreMatchers.is;
import com.baeldung.model.EmailAddress; import static org.junit.Assert.assertThat;
import com.baeldung.model.User;
import java.util.Iterator;
import java.util.List;
import org.junit.After; import org.junit.After;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
@ -17,11 +20,9 @@ import org.springframework.data.mongodb.core.query.Query;
import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import java.util.Iterator; import com.baeldung.config.MongoConfig;
import java.util.List; import com.baeldung.model.EmailAddress;
import com.baeldung.model.User;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
@RunWith(SpringJUnit4ClassRunner.class) @RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = MongoConfig.class) @ContextConfiguration(classes = MongoConfig.class)
@ -152,7 +153,7 @@ public class DocumentQueryLiveTest {
user.setAge(35); user.setAge(35);
mongoTemplate.insert(user); mongoTemplate.insert(user);
final Pageable pageableRequest = new PageRequest(0, 2); final Pageable pageableRequest = PageRequest.of(0, 2);
Query query = new Query(); Query query = new Query();
query.with(pageableRequest); query.with(pageableRequest);

View File

@ -1,8 +1,11 @@
package com.baeldung.mongotemplate; package com.baeldung.mongotemplate;
import com.baeldung.config.MongoConfig; import static org.hamcrest.CoreMatchers.is;
import com.baeldung.model.EmailAddress; import static org.hamcrest.Matchers.nullValue;
import com.baeldung.model.User; import static org.junit.Assert.assertThat;
import java.util.List;
import org.junit.After; import org.junit.After;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
@ -20,11 +23,9 @@ import org.springframework.data.mongodb.core.query.Query;
import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import java.util.List; import com.baeldung.config.MongoConfig;
import com.baeldung.model.EmailAddress;
import static org.hamcrest.CoreMatchers.is; import com.baeldung.model.User;
import static org.hamcrest.Matchers.nullValue;
import static org.junit.Assert.assertThat;
@RunWith(SpringJUnit4ClassRunner.class) @RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = MongoConfig.class) @ContextConfiguration(classes = MongoConfig.class)
@ -104,7 +105,7 @@ public class MongoTemplateQueryLiveTest {
user.setAge(35); user.setAge(35);
mongoTemplate.insert(user); mongoTemplate.insert(user);
final Pageable pageableRequest = new PageRequest(0, 2); final Pageable pageableRequest = PageRequest.of(0, 2);
Query query = new Query(); Query query = new Query();
query.with(pageableRequest); query.with(pageableRequest);

View File

@ -5,8 +5,6 @@ import static org.junit.Assert.assertThat;
import java.util.List; import java.util.List;
import com.baeldung.config.MongoConfig;
import com.baeldung.model.User;
import org.junit.After; import org.junit.After;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
@ -22,6 +20,9 @@ import org.springframework.data.mongodb.core.query.Query;
import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.baeldung.config.MongoConfig;
import com.baeldung.model.User;
@RunWith(SpringJUnit4ClassRunner.class) @RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = MongoConfig.class) @ContextConfiguration(classes = MongoConfig.class)
public class UserRepositoryLiveTest { public class UserRepositoryLiveTest {
@ -72,8 +73,7 @@ public class UserRepositoryLiveTest {
user.setName("Jim"); user.setName("Jim");
userRepository.save(user); userRepository.save(user);
assertThat(mongoOps.findAll(User.class).size(), is(1));
assertThat(mongoOps.findAll(User.class).size(), is(2));
} }
@Test @Test
@ -94,7 +94,7 @@ public class UserRepositoryLiveTest {
mongoOps.insert(user); mongoOps.insert(user);
user = mongoOps.findOne(Query.query(Criteria.where("name").is("Chris")), User.class); user = mongoOps.findOne(Query.query(Criteria.where("name").is("Chris")), User.class);
final User foundUser = userRepository.findOne(user.getId()); final User foundUser = userRepository.findById(user.getId()).get();
assertThat(user.getName(), is(foundUser.getName())); assertThat(user.getName(), is(foundUser.getName()));
} }
@ -106,7 +106,7 @@ public class UserRepositoryLiveTest {
mongoOps.insert(user); mongoOps.insert(user);
user = mongoOps.findOne(Query.query(Criteria.where("name").is("Harris")), User.class); user = mongoOps.findOne(Query.query(Criteria.where("name").is("Harris")), User.class);
final boolean isExists = userRepository.exists(user.getId()); final boolean isExists = userRepository.existsById(user.getId());
assertThat(isExists, is(true)); assertThat(isExists, is(true));
} }
@ -138,7 +138,7 @@ public class UserRepositoryLiveTest {
user.setName("Adam"); user.setName("Adam");
mongoOps.insert(user); mongoOps.insert(user);
final Pageable pageableRequest = new PageRequest(0, 1); final Pageable pageableRequest = PageRequest.of(0, 1);
final Page<User> page = userRepository.findAll(pageableRequest); final Page<User> page = userRepository.findAll(pageableRequest);
List<User> users = page.getContent(); List<User> users = page.getContent();

View File

@ -0,0 +1,47 @@
package com.baeldung.transaction;
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.data.mongodb.core.ReactiveMongoOperations;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.baeldung.config.MongoReactiveConfig;
import com.baeldung.model.User;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = MongoReactiveConfig.class)
public class MongoTransactionReactiveIntegrationTest {
@Autowired
private ReactiveMongoOperations reactiveOps;
@Before
public void testSetup() {
if (!reactiveOps.collectionExists(User.class)
.block()) {
reactiveOps.createCollection(User.class);
}
}
@After
public void tearDown() {
System.out.println(reactiveOps.findAll(User.class)
.count()
.block());
reactiveOps.dropCollection(User.class);
}
@Test
public void whenPerformTransaction_thenSuccess() {
User user1 = new User("Jane", 23);
User user2 = new User("John", 34);
reactiveOps.inTransaction()
.execute(action -> action.insert(user1)
.then(action.insert(user2)));
}
}

View File

@ -0,0 +1,68 @@
package com.baeldung.transaction;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import java.util.List;
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.data.mongodb.MongoTransactionManager;
import org.springframework.data.mongodb.SessionSynchronization;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.TransactionCallbackWithoutResult;
import org.springframework.transaction.support.TransactionTemplate;
import com.baeldung.config.MongoConfig;
import com.baeldung.model.User;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = MongoConfig.class)
public class MongoTransactionTemplateIntegrationTest {
@Autowired
private MongoTemplate mongoTemplate;
@Autowired
private MongoTransactionManager mongoTransactionManager;
@Before
public void testSetup() {
if (!mongoTemplate.collectionExists(User.class)) {
mongoTemplate.createCollection(User.class);
}
}
@After
public void tearDown() {
mongoTemplate.dropCollection(User.class);
}
@Test
public void givenTransactionTemplate_whenPerformTransaction_thenSuccess() {
mongoTemplate.setSessionSynchronization(SessionSynchronization.ALWAYS);
TransactionTemplate transactionTemplate = new TransactionTemplate(mongoTransactionManager);
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(TransactionStatus status) {
mongoTemplate.insert(new User("Kim", 20));
mongoTemplate.insert(new User("Jack", 45));
};
});
Query query = new Query().addCriteria(Criteria.where("name")
.is("Jack"));
List<User> users = mongoTemplate.find(query, User.class);
assertThat(users.size(), is(1));
}
}

View File

@ -0,0 +1,90 @@
package com.baeldung.transaction;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import java.util.List;
import org.junit.FixMethodOrder;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.MethodSorters;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.MongoTransactionException;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.annotation.Transactional;
import com.baeldung.config.MongoConfig;
import com.baeldung.model.User;
import com.baeldung.repository.UserRepository;
import com.mongodb.MongoCommandException;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = MongoConfig.class)
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class MongoTransactionalIntegrationTest {
@Autowired
private MongoTemplate mongoTemplate;
@Autowired
private UserRepository userRepository;
@Test
@Transactional
public void whenPerformMongoTransaction_thenSuccess() {
userRepository.save(new User("John", 30));
userRepository.save(new User("Ringo", 35));
Query query = new Query().addCriteria(Criteria.where("name")
.is("John"));
List<User> users = mongoTemplate.find(query, User.class);
assertThat(users.size(), is(1));
}
@Test(expected = MongoTransactionException.class)
@Transactional
public void whenListCollectionDuringMongoTransaction_thenException() {
if (mongoTemplate.collectionExists(User.class)) {
mongoTemplate.save(new User("John", 30));
mongoTemplate.save(new User("Ringo", 35));
}
}
@Test(expected = MongoCommandException.class)
@Transactional
public void whenCountDuringMongoTransaction_thenException() {
userRepository.save(new User("John", 30));
userRepository.save(new User("Ringo", 35));
userRepository.count();
}
@Test
@Transactional
public void whenQueryDuringMongoTransaction_thenSuccess() {
userRepository.save(new User("Jane", 20));
userRepository.save(new User("Nick", 33));
List<User> users = mongoTemplate.find(new Query(), User.class);
assertTrue(users.size() > 1);
}
// ==== Using test instead of before and after due to @transactional doesn't allow list collection
@Test
public void setup() {
if (!mongoTemplate.collectionExists(User.class)) {
mongoTemplate.createCollection(User.class);
}
}
@Test
public void ztearDown() {
mongoTemplate.dropCollection(User.class);
}
}