diff --git a/pom.xml b/pom.xml index bb714c39be..20994d0c86 100644 --- a/pom.xml +++ b/pom.xml @@ -1,5 +1,6 @@ - + 4.0.0 com.baeldung parent-modules @@ -11,19 +12,20 @@ UTF-8 refs/heads/master - + 4.12 - 1.3 + 1.3 1.10.19 1.7.21 1.1.7 - 2.19.1 - 3.6.0 + 2.19.1 + 3.6.0 + spring-vertx aws akka-streams algorithms @@ -70,7 +72,7 @@ immutables jackson - + vavr javax-servlets javaxval @@ -122,8 +124,8 @@ selenium-junit-testng solr spark-java - spring-5 - spring-5-mvc + spring-5 + spring-5-mvc spring-akka spring-amqp spring-all @@ -175,7 +177,7 @@ spring-rest-angular spring-rest-docs spring-rest - spring-rest-simple + spring-rest-simple spring-security-cache-control spring-security-client/spring-security-jsp-authentication spring-security-client/spring-security-jsp-authorize @@ -242,12 +244,12 @@ ch.qos.logback logback-core ${logback.version} - + org.slf4j jcl-over-slf4j ${org.slf4j.version} - + @@ -267,8 +269,8 @@ hamcrest-library ${org.hamcrest.version} test - - + + org.hamcrest hamcrest-all ${org.hamcrest.version} @@ -280,7 +282,7 @@ ${mockito.version} test - + @@ -295,7 +297,7 @@ org.apache.maven.plugins maven-surefire-plugin - ${maven-surefire-plugin.version} + ${maven-surefire-plugin.version} 3 true @@ -312,12 +314,12 @@ org.apache.maven.plugins maven-compiler-plugin - ${maven-compiler-plugin.version} + ${maven-compiler-plugin.version} 1.8 1.8 - + + + + + UTF-8 + UTF-8 + 1.8 + 3.4.1 + + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-tomcat + + + + + io.vertx + vertx-core + ${vertx.version} + + + io.vertx + vertx-web + ${vertx.version} + + + + com.h2database + h2 + runtime + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + diff --git a/spring-vertx/src/main/java/com/baeldung/vertxspring/VertxSpringApplication.java b/spring-vertx/src/main/java/com/baeldung/vertxspring/VertxSpringApplication.java new file mode 100644 index 0000000000..880984986e --- /dev/null +++ b/spring-vertx/src/main/java/com/baeldung/vertxspring/VertxSpringApplication.java @@ -0,0 +1,41 @@ +package com.baeldung.vertxspring; + +import javax.annotation.PostConstruct; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.domain.EntityScan; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; + +import com.baeldung.vertxspring.verticles.ServerVerticle; +import com.baeldung.vertxspring.verticles.ServiceVerticle; + +import io.vertx.core.Vertx; + +@SpringBootApplication +@Configuration +@EnableJpaRepositories("com.baeldung.vertxspring.repository") +@EntityScan("com.baeldung.vertxspring.entity") +@ComponentScan(basePackages = { "com.baeldung" }) +public class VertxSpringApplication { + + @Autowired + ServerVerticle serverVerticle; + + @Autowired + ServiceVerticle serviceVerticle; + + public static void main(String[] args) { + SpringApplication.run(VertxSpringApplication.class, args); + } + + @PostConstruct + public void deployVerticle() { + final Vertx vertx = Vertx.vertx(); + vertx.deployVerticle(serverVerticle); + vertx.deployVerticle(serviceVerticle); + } +} diff --git a/spring-vertx/src/main/java/com/baeldung/vertxspring/entity/Article.java b/spring-vertx/src/main/java/com/baeldung/vertxspring/entity/Article.java new file mode 100644 index 0000000000..1fcb03c319 --- /dev/null +++ b/spring-vertx/src/main/java/com/baeldung/vertxspring/entity/Article.java @@ -0,0 +1,46 @@ +package com.baeldung.vertxspring.entity; + +import javax.persistence.Entity; +import javax.persistence.Id; + +import org.springframework.data.annotation.PersistenceConstructor; + +@Entity +public class Article { + + @Id + private Long id; + private String article; + + private Article() { + } + + @PersistenceConstructor + public Article(Long id, String article) { + super(); + this.id = id; + this.article = article; + } + + @Override + public String toString() { + return "Article [id=" + id + ", article=" + article + "]"; + } + + public Long getArticleId() { + return id; + } + + public void setArticleId(Long id) { + this.id = id; + } + + public String getArticle() { + return article; + } + + public void setArticle(String article) { + this.article = article; + } + +} diff --git a/spring-vertx/src/main/java/com/baeldung/vertxspring/repository/ArticleRepository.java b/spring-vertx/src/main/java/com/baeldung/vertxspring/repository/ArticleRepository.java new file mode 100644 index 0000000000..843c88b694 --- /dev/null +++ b/spring-vertx/src/main/java/com/baeldung/vertxspring/repository/ArticleRepository.java @@ -0,0 +1,11 @@ +package com.baeldung.vertxspring.repository; + +import org.springframework.data.repository.CrudRepository; +import org.springframework.stereotype.Repository; + +import com.baeldung.vertxspring.entity.Article; + +@Repository +public interface ArticleRepository extends CrudRepository { + +} diff --git a/spring-vertx/src/main/java/com/baeldung/vertxspring/service/ArticleService.java b/spring-vertx/src/main/java/com/baeldung/vertxspring/service/ArticleService.java new file mode 100644 index 0000000000..55cb8bbfcb --- /dev/null +++ b/spring-vertx/src/main/java/com/baeldung/vertxspring/service/ArticleService.java @@ -0,0 +1,25 @@ +package com.baeldung.vertxspring.service; + +import java.util.ArrayList; +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.baeldung.vertxspring.entity.Article; +import com.baeldung.vertxspring.repository.ArticleRepository; + +@Service +public class ArticleService { + + @Autowired + ArticleRepository articleRepository; + + public List
getAllArticle() { + List
articles = new ArrayList<>(); + articleRepository.findAll() + .forEach(articles::add); + return articles; + } + +} diff --git a/spring-vertx/src/main/java/com/baeldung/vertxspring/util/DbBootstrap.java b/spring-vertx/src/main/java/com/baeldung/vertxspring/util/DbBootstrap.java new file mode 100644 index 0000000000..63d1df6485 --- /dev/null +++ b/spring-vertx/src/main/java/com/baeldung/vertxspring/util/DbBootstrap.java @@ -0,0 +1,28 @@ +package com.baeldung.vertxspring.util; + +import java.util.Random; +import java.util.UUID; +import java.util.stream.IntStream; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; +import org.springframework.stereotype.Component; + +import com.baeldung.vertxspring.entity.Article; +import com.baeldung.vertxspring.repository.ArticleRepository; + +@Component +public class DbBootstrap implements CommandLineRunner { + + @Autowired + private ArticleRepository articleRepository; + + @Override + public void run(String... arg0) throws Exception { + + IntStream.range(0, 10) + .forEach(count -> this.articleRepository.save(new Article(new Random().nextLong(), UUID.randomUUID() + .toString()))); + + } +} diff --git a/spring-vertx/src/main/java/com/baeldung/vertxspring/verticles/ServerVerticle.java b/spring-vertx/src/main/java/com/baeldung/vertxspring/verticles/ServerVerticle.java new file mode 100644 index 0000000000..aa2196b53d --- /dev/null +++ b/spring-vertx/src/main/java/com/baeldung/vertxspring/verticles/ServerVerticle.java @@ -0,0 +1,42 @@ +package com.baeldung.vertxspring.verticles; + +import org.springframework.stereotype.Component; + +import io.vertx.core.AbstractVerticle; +import io.vertx.ext.web.Router; +import io.vertx.ext.web.RoutingContext; + +@Component +public class ServerVerticle extends AbstractVerticle { + + private void getAllArticlesHandler(RoutingContext routingContext) { + vertx.eventBus() + .send(ServiceVerticle.GET_ALL_ARTICLES, "", result -> { + if (result.succeeded()) { + routingContext.response() + .putHeader("content-type", "application/json") + .setStatusCode(200) + .end(result.result() + .body()); + } else { + routingContext.response() + .setStatusCode(500) + .end(); + } + }); + } + + @Override + public void start() throws Exception { + super.start(); + + Router router = Router.router(vertx); + router.get("/api/baeldung/articles") + .handler(this::getAllArticlesHandler); + + vertx.createHttpServer() + .requestHandler(router::accept) + .listen(config().getInteger("http.port", 8080)); + } + +} diff --git a/spring-vertx/src/main/java/com/baeldung/vertxspring/verticles/ServiceVerticle.java b/spring-vertx/src/main/java/com/baeldung/vertxspring/verticles/ServiceVerticle.java new file mode 100644 index 0000000000..7c46d4200a --- /dev/null +++ b/spring-vertx/src/main/java/com/baeldung/vertxspring/verticles/ServiceVerticle.java @@ -0,0 +1,48 @@ +package com.baeldung.vertxspring.verticles; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.baeldung.vertxspring.service.ArticleService; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +import io.vertx.core.AbstractVerticle; +import io.vertx.core.Handler; +import io.vertx.core.eventbus.Message; +import io.vertx.core.json.Json; + +@Component +public class ServiceVerticle extends AbstractVerticle { + + public static final String GET_ALL_ARTICLES = "get.artilces.all"; + private final ObjectMapper mapper = Json.mapper; + @Autowired + private ArticleService articleService; + + @Override + public void start() throws Exception { + super.start(); + vertx.eventBus() + .consumer(GET_ALL_ARTICLES) + .handler(getAllArticleService(articleService)); + } + + private Handler> getAllArticleService(ArticleService service) { + return msg -> vertx.executeBlocking(future -> { + try { + future.complete(mapper.writeValueAsString(service.getAllArticle())); + } catch (JsonProcessingException e) { + System.out.println("Failed to serialize result"); + future.fail(e); + } + }, result -> { + if (result.succeeded()) { + msg.reply(result.result()); + } else { + msg.reply(result.cause() + .toString()); + } + }); + } +} diff --git a/spring-vertx/src/main/resources/application.properties b/spring-vertx/src/main/resources/application.properties new file mode 100644 index 0000000000..e69de29bb2 diff --git a/spring-vertx/src/main/resources/conf/conf.json b/spring-vertx/src/main/resources/conf/conf.json new file mode 100644 index 0000000000..4fa43ee648 --- /dev/null +++ b/spring-vertx/src/main/resources/conf/conf.json @@ -0,0 +1,3 @@ +{ + "http.port":8080 +} \ No newline at end of file diff --git a/spring-vertx/src/test/java/com/baeldung/vertxspring/VertxSpringApplicationTests.java b/spring-vertx/src/test/java/com/baeldung/vertxspring/VertxSpringApplicationTests.java new file mode 100644 index 0000000000..1afb14a2ed --- /dev/null +++ b/spring-vertx/src/test/java/com/baeldung/vertxspring/VertxSpringApplicationTests.java @@ -0,0 +1,26 @@ +package com.baeldung.vertxspring; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.web.client.TestRestTemplate; +import org.springframework.http.ResponseEntity; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +@RunWith(SpringJUnit4ClassRunner.class) +@SpringBootTest +public class VertxSpringApplicationTests { + + private TestRestTemplate restTemplate = new TestRestTemplate(); + + @Test + public void givenUrl_whenReceivedArticles_thenSuccess() { + ResponseEntity responseEntity = restTemplate.getForEntity("http://localhost:8080/api/baeldung/articles", String.class); + assertEquals(200, responseEntity.getStatusCodeValue()); + } + +} + +