From 8a5eb3767cdd91b0d4d0cfd5fd1d690a1511184e Mon Sep 17 00:00:00 2001 From: def327 Date: Mon, 26 Jun 2017 23:31:37 +0300 Subject: [PATCH 01/12] 26 JUNE 2017 1)Rename package structure for controllers --- .../java/{app => com/tutorial}/controllers/MainController.java | 2 +- .../java/{app => com/tutorial}/controllers/UserController.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename src/main/java/{app => com/tutorial}/controllers/MainController.java (93%) rename src/main/java/{app => com/tutorial}/controllers/UserController.java (94%) diff --git a/src/main/java/app/controllers/MainController.java b/src/main/java/com/tutorial/controllers/MainController.java similarity index 93% rename from src/main/java/app/controllers/MainController.java rename to src/main/java/com/tutorial/controllers/MainController.java index 10cf339..107ff62 100644 --- a/src/main/java/app/controllers/MainController.java +++ b/src/main/java/com/tutorial/controllers/MainController.java @@ -1,4 +1,4 @@ -package app.controllers; +package com.tutorial.controllers; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; diff --git a/src/main/java/app/controllers/UserController.java b/src/main/java/com/tutorial/controllers/UserController.java similarity index 94% rename from src/main/java/app/controllers/UserController.java rename to src/main/java/com/tutorial/controllers/UserController.java index 12d19ae..35ebd52 100644 --- a/src/main/java/app/controllers/UserController.java +++ b/src/main/java/com/tutorial/controllers/UserController.java @@ -1,4 +1,4 @@ -package app.controllers; +package com.tutorial.controllers; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; From af9f09e2fb56b3a4aa6853578a7866ffd3b2aa51 Mon Sep 17 00:00:00 2001 From: def327 Date: Mon, 26 Jun 2017 23:52:16 +0300 Subject: [PATCH 02/12] 26 JUNE 2017 1) Add new name LoginController for UserController class 2) Fix dispatcher-servlet.xml for controllers scanning --- .../controllers/{UserController.java => LoginController.java} | 2 +- src/main/webapp/WEB-INF/dispatcher-servlet.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename src/main/java/com/tutorial/controllers/{UserController.java => LoginController.java} (95%) diff --git a/src/main/java/com/tutorial/controllers/UserController.java b/src/main/java/com/tutorial/controllers/LoginController.java similarity index 95% rename from src/main/java/com/tutorial/controllers/UserController.java rename to src/main/java/com/tutorial/controllers/LoginController.java index 35ebd52..158dcb1 100644 --- a/src/main/java/com/tutorial/controllers/UserController.java +++ b/src/main/java/com/tutorial/controllers/LoginController.java @@ -6,7 +6,7 @@ import org.springframework.web.servlet.ModelAndView; @Controller -public class UserController { +public class LoginController { @RequestMapping( method = {RequestMethod.GET}, diff --git a/src/main/webapp/WEB-INF/dispatcher-servlet.xml b/src/main/webapp/WEB-INF/dispatcher-servlet.xml index 9684ea0..dd45d84 100644 --- a/src/main/webapp/WEB-INF/dispatcher-servlet.xml +++ b/src/main/webapp/WEB-INF/dispatcher-servlet.xml @@ -5,7 +5,7 @@ xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> - + From 7255d8ecb2d9889f5decc83ebef839a84b271d27 Mon Sep 17 00:00:00 2001 From: def327 Date: Tue, 27 Jun 2017 01:37:40 +0300 Subject: [PATCH 03/12] 27 JUNE 2017 1) Add new html form for User to send attributes 2) Remove MainController --- ...ploded.xml => ProjectMVC_war_exploded.xml} | 25 ++++++++-------- .idea/artifacts/SpringFirst_war.xml | 8 ----- .../artifacts/SpringMVC_FirstProject_war.xml | 8 ----- .../SpringMVC_FirstProject_war_exploded.xml | 28 ----------------- pom.xml | 6 ++++ .../tutorial/controllers/LoginController.java | 19 ++++++++++-- .../tutorial/controllers/MainController.java | 19 ------------ src/main/java/com/tutorial/entities/User.java | 20 +++++++++++++ .../webapp/WEB-INF/dispatcher-servlet.xml | 4 +-- src/main/webapp/WEB-INF/views/main.jsp | 30 +++++++++++++------ src/main/webapp/WEB-INF/views/menu.jsp | 5 ++-- 11 files changed, 80 insertions(+), 92 deletions(-) rename .idea/artifacts/{SpringFirst_war_exploded.xml => ProjectMVC_war_exploded.xml} (61%) delete mode 100644 .idea/artifacts/SpringFirst_war.xml delete mode 100644 .idea/artifacts/SpringMVC_FirstProject_war.xml delete mode 100644 .idea/artifacts/SpringMVC_FirstProject_war_exploded.xml delete mode 100644 src/main/java/com/tutorial/controllers/MainController.java create mode 100644 src/main/java/com/tutorial/entities/User.java diff --git a/.idea/artifacts/SpringFirst_war_exploded.xml b/.idea/artifacts/ProjectMVC_war_exploded.xml similarity index 61% rename from .idea/artifacts/SpringFirst_war_exploded.xml rename to .idea/artifacts/ProjectMVC_war_exploded.xml index bec8269..155e9a1 100644 --- a/.idea/artifacts/SpringFirst_war_exploded.xml +++ b/.idea/artifacts/ProjectMVC_war_exploded.xml @@ -1,27 +1,26 @@ - - $PROJECT_DIR$/target/SpringFirst-1.0-SNAPSHOT + + $PROJECT_DIR$/out/artifacts/ProjectMVC_war_exploded - + + + - - - - - - - + + + + + + + - - - diff --git a/.idea/artifacts/SpringFirst_war.xml b/.idea/artifacts/SpringFirst_war.xml deleted file mode 100644 index 0002a93..0000000 --- a/.idea/artifacts/SpringFirst_war.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - $PROJECT_DIR$/target - - - - - \ No newline at end of file diff --git a/.idea/artifacts/SpringMVC_FirstProject_war.xml b/.idea/artifacts/SpringMVC_FirstProject_war.xml deleted file mode 100644 index 866001f..0000000 --- a/.idea/artifacts/SpringMVC_FirstProject_war.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - $PROJECT_DIR$/target - - - - - \ No newline at end of file diff --git a/.idea/artifacts/SpringMVC_FirstProject_war_exploded.xml b/.idea/artifacts/SpringMVC_FirstProject_war_exploded.xml deleted file mode 100644 index 5475d55..0000000 --- a/.idea/artifacts/SpringMVC_FirstProject_war_exploded.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - $PROJECT_DIR$/target/SpringBasicProjectMVC-1.0-SNAPSHOT - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/pom.xml b/pom.xml index 547d99c..a8c9060 100644 --- a/pom.xml +++ b/pom.xml @@ -46,6 +46,12 @@ jstl 1.2 + + org.projectlombok + lombok + 1.16.16 + provided + diff --git a/src/main/java/com/tutorial/controllers/LoginController.java b/src/main/java/com/tutorial/controllers/LoginController.java index 158dcb1..53833da 100644 --- a/src/main/java/com/tutorial/controllers/LoginController.java +++ b/src/main/java/com/tutorial/controllers/LoginController.java @@ -1,6 +1,8 @@ package com.tutorial.controllers; +import com.tutorial.entities.User; import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.servlet.ModelAndView; @@ -8,13 +10,24 @@ @Controller public class LoginController { + @RequestMapping( method = {RequestMethod.GET}, - value = {"/password/restore"} + value = {"/"} + ) + public ModelAndView showMainPage() { + ModelAndView model = new ModelAndView("main", "user", new User()); + return model; + } + + @RequestMapping( + method = {RequestMethod.POST}, + value = {"/check-user"} ) - public ModelAndView showPasswordRecoveryPage(ModelAndView model) { + public ModelAndView checkUser(@ModelAttribute User user) { + ModelAndView model = new ModelAndView(); model.setViewName("menu"); - model.addObject("message", "This page is used for password recovery"); + model.addObject(user); return model; } } diff --git a/src/main/java/com/tutorial/controllers/MainController.java b/src/main/java/com/tutorial/controllers/MainController.java deleted file mode 100644 index 107ff62..0000000 --- a/src/main/java/com/tutorial/controllers/MainController.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.tutorial.controllers; - -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.servlet.ModelAndView; - -@Controller -public class MainController { - - @RequestMapping( - method = {RequestMethod.GET}, - value = {"/main"} - ) - public ModelAndView showLoginPage(ModelAndView model) { - model.setViewName("main"); - return model; - } -} diff --git a/src/main/java/com/tutorial/entities/User.java b/src/main/java/com/tutorial/entities/User.java new file mode 100644 index 0000000..b676aa5 --- /dev/null +++ b/src/main/java/com/tutorial/entities/User.java @@ -0,0 +1,20 @@ +package com.tutorial.entities; + + +import lombok.Getter; +import lombok.Setter; + +public class User { + + @Getter + @Setter + private String login; + + @Getter + @Setter + private String password; + + @Getter + @Setter + private boolean keepLoggedIn; +} diff --git a/src/main/webapp/WEB-INF/dispatcher-servlet.xml b/src/main/webapp/WEB-INF/dispatcher-servlet.xml index dd45d84..57eee8e 100644 --- a/src/main/webapp/WEB-INF/dispatcher-servlet.xml +++ b/src/main/webapp/WEB-INF/dispatcher-servlet.xml @@ -11,8 +11,8 @@ - - + + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/views/main.jsp b/src/main/webapp/WEB-INF/views/main.jsp index f18c8b2..854ad22 100644 --- a/src/main/webapp/WEB-INF/views/main.jsp +++ b/src/main/webapp/WEB-INF/views/main.jsp @@ -1,27 +1,39 @@ <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%> Main page " rel="stylesheet"> " rel="stylesheet"> - - + + diff --git a/src/main/webapp/WEB-INF/views/menu.jsp b/src/main/webapp/WEB-INF/views/menu.jsp index cc36074..15e1351 100644 --- a/src/main/webapp/WEB-INF/views/menu.jsp +++ b/src/main/webapp/WEB-INF/views/menu.jsp @@ -4,7 +4,8 @@ Title -

Password recovery

-${message} +
Hello ${user.login}
+
Your password is ${user.password}
+
Keep user to be logged is ${user.keepLoggedIn}
From fa8d9dbc79c8a4cc0f451d6fff02e519dbd4721f Mon Sep 17 00:00:00 2001 From: def327 Date: Sat, 5 Aug 2017 13:31:40 +0300 Subject: [PATCH 04/12] Add bean validation --- .idea/artifacts/ProjectMVC_war_exploded.xml | 11 ++++++++--- pom.xml | 6 ++++++ .../com/tutorial/controllers/LoginController.java | 12 +++++++++++- src/main/java/com/tutorial/entities/User.java | 7 +++++++ src/main/webapp/WEB-INF/applicationContext.xml | 7 +++++++ src/main/webapp/WEB-INF/dispatcher-servlet.xml | 5 +++++ src/main/webapp/WEB-INF/views/main.jsp | 5 ++--- src/main/webapp/WEB-INF/views/menu.jsp | 7 +++++++ src/main/webapp/WEB-INF/web.xml | 8 +++++++- src/main/webapp/resources/structure.css | 5 +++++ 10 files changed, 65 insertions(+), 8 deletions(-) diff --git a/.idea/artifacts/ProjectMVC_war_exploded.xml b/.idea/artifacts/ProjectMVC_war_exploded.xml index 155e9a1..b2a78f0 100644 --- a/.idea/artifacts/ProjectMVC_war_exploded.xml +++ b/.idea/artifacts/ProjectMVC_war_exploded.xml @@ -1,14 +1,12 @@ - $PROJECT_DIR$/out/artifacts/ProjectMVC_war_exploded + $PROJECT_DIR$/target/SpringBasicProjectMVC-1.0-SNAPSHOT - - @@ -19,8 +17,15 @@ + + + + + + + diff --git a/pom.xml b/pom.xml index a8c9060..6088158 100644 --- a/pom.xml +++ b/pom.xml @@ -52,6 +52,12 @@ 1.16.16 provided + + + org.hibernate.validator + hibernate-validator + 6.0.0.CR3 + diff --git a/src/main/java/com/tutorial/controllers/LoginController.java b/src/main/java/com/tutorial/controllers/LoginController.java index 53833da..1d07b2f 100644 --- a/src/main/java/com/tutorial/controllers/LoginController.java +++ b/src/main/java/com/tutorial/controllers/LoginController.java @@ -2,11 +2,15 @@ import com.tutorial.entities.User; import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.servlet.ModelAndView; +import javax.validation.Valid; + @Controller public class LoginController { @@ -24,8 +28,14 @@ public ModelAndView showMainPage() { method = {RequestMethod.POST}, value = {"/check-user"} ) - public ModelAndView checkUser(@ModelAttribute User user) { + public ModelAndView checkUser(@Valid @ModelAttribute("user") User user, BindingResult bindingResult, Model modelFromView) { + ModelAndView model = new ModelAndView(); + if (bindingResult.hasErrors()) { + model.setViewName("/main"); + return model; + } + model.setViewName("menu"); model.addObject(user); return model; diff --git a/src/main/java/com/tutorial/entities/User.java b/src/main/java/com/tutorial/entities/User.java index b676aa5..a9755e3 100644 --- a/src/main/java/com/tutorial/entities/User.java +++ b/src/main/java/com/tutorial/entities/User.java @@ -4,14 +4,21 @@ import lombok.Getter; import lombok.Setter; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; + public class User { @Getter @Setter + @NotNull + @Size(min = 3, message = "Please use enter the login using more than 3 symbols ") private String login; @Getter @Setter + @NotNull + @Size(min = 4, max = 7, message = "Please enter the password in range from 4 to 7 symbols") private String password; @Getter diff --git a/src/main/webapp/WEB-INF/applicationContext.xml b/src/main/webapp/WEB-INF/applicationContext.xml index 142def2..66eb5bb 100644 --- a/src/main/webapp/WEB-INF/applicationContext.xml +++ b/src/main/webapp/WEB-INF/applicationContext.xml @@ -3,4 +3,11 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> + + + + + + + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/dispatcher-servlet.xml b/src/main/webapp/WEB-INF/dispatcher-servlet.xml index 57eee8e..2cdc6a5 100644 --- a/src/main/webapp/WEB-INF/dispatcher-servlet.xml +++ b/src/main/webapp/WEB-INF/dispatcher-servlet.xml @@ -9,10 +9,15 @@ + + + + + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/views/main.jsp b/src/main/webapp/WEB-INF/views/main.jsp index 854ad22..9272b71 100644 --- a/src/main/webapp/WEB-INF/views/main.jsp +++ b/src/main/webapp/WEB-INF/views/main.jsp @@ -16,10 +16,11 @@ Username: + Password: - +
@@ -31,8 +32,6 @@
- - diff --git a/src/main/webapp/WEB-INF/views/menu.jsp b/src/main/webapp/WEB-INF/views/menu.jsp index 15e1351..8450015 100644 --- a/src/main/webapp/WEB-INF/views/menu.jsp +++ b/src/main/webapp/WEB-INF/views/menu.jsp @@ -7,5 +7,12 @@
Hello ${user.login}
Your password is ${user.password}
Keep user to be logged is ${user.keepLoggedIn}
+ +

To check the bean defenition

+ +Name : ${complexUser2.login}
+Password : ${complexUser2.password}
+Be logged: ${complexUser2.keepLoggedIn}
+ diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml index f29e95e..123d326 100644 --- a/src/main/webapp/WEB-INF/web.xml +++ b/src/main/webapp/WEB-INF/web.xml @@ -3,17 +3,23 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> + contextConfigLocation - /WEB-INF/dispatcher-servlet.xml + /WEB-INF/applicationContext.xml org.springframework.web.context.ContextLoaderListener + dispatcher org.springframework.web.servlet.DispatcherServlet 1 + + contextConfigLocation + WEB-INF/dispatcher-servlet.xml + dispatcher diff --git a/src/main/webapp/resources/structure.css b/src/main/webapp/resources/structure.css index 559b219..de45d23 100755 --- a/src/main/webapp/resources/structure.css +++ b/src/main/webapp/resources/structure.css @@ -152,3 +152,8 @@ footer#main{ font:normal 11px/16px Arial, Helvetica, sans-serif; width:100%; } + +.errorClass { + font: normal 10px/12px Arial, Helvetica, sans-serif; + color: red; +} From 228db6fcadb8871ce2f7b529b5a50087200c6793 Mon Sep 17 00:00:00 2001 From: def327 Date: Sun, 6 Aug 2017 13:35:45 +0300 Subject: [PATCH 05/12] 1) Create a DataSources DataBaseMock to store Users Objects 2) Create RESTful API --- .idea/artifacts/ProjectMVC_war_exploded.xml | 3 ++ pom.xml | 6 ++++ .../tutorial/controllers/LoginController.java | 35 ++++++++++++++++--- .../java/com/tutorial/dao/DataSource.java | 16 +++++++++ .../java/com/tutorial/dao/DataSourceImpl.java | 28 +++++++++++++++ src/main/java/com/tutorial/entities/User.java | 11 +++--- .../webapp/WEB-INF/applicationContext.xml | 13 +++++++ .../webapp/WEB-INF/dispatcher-servlet.xml | 1 - 8 files changed, 102 insertions(+), 11 deletions(-) create mode 100644 src/main/java/com/tutorial/dao/DataSource.java create mode 100644 src/main/java/com/tutorial/dao/DataSourceImpl.java diff --git a/.idea/artifacts/ProjectMVC_war_exploded.xml b/.idea/artifacts/ProjectMVC_war_exploded.xml index b2a78f0..7c0f59c 100644 --- a/.idea/artifacts/ProjectMVC_war_exploded.xml +++ b/.idea/artifacts/ProjectMVC_war_exploded.xml @@ -21,6 +21,9 @@ + + + diff --git a/pom.xml b/pom.xml index 6088158..6b66da0 100644 --- a/pom.xml +++ b/pom.xml @@ -58,6 +58,12 @@ hibernate-validator 6.0.0.CR3 + + + com.fasterxml.jackson.core + jackson-databind + 2.7.5 + diff --git a/src/main/java/com/tutorial/controllers/LoginController.java b/src/main/java/com/tutorial/controllers/LoginController.java index 1d07b2f..a15d10b 100644 --- a/src/main/java/com/tutorial/controllers/LoginController.java +++ b/src/main/java/com/tutorial/controllers/LoginController.java @@ -1,19 +1,25 @@ package com.tutorial.controllers; +import com.tutorial.dao.DataSource; import com.tutorial.entities.User; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.validation.BindingResult; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.*; import org.springframework.web.servlet.ModelAndView; import javax.validation.Valid; +import java.math.BigInteger; +import java.util.List; @Controller public class LoginController { + @Autowired + DataSource dataSource; @RequestMapping( method = {RequestMethod.GET}, @@ -29,7 +35,6 @@ public ModelAndView showMainPage() { value = {"/check-user"} ) public ModelAndView checkUser(@Valid @ModelAttribute("user") User user, BindingResult bindingResult, Model modelFromView) { - ModelAndView model = new ModelAndView(); if (bindingResult.hasErrors()) { model.setViewName("/main"); @@ -40,4 +45,26 @@ public ModelAndView checkUser(@Valid @ModelAttribute("user") User user, BindingR model.addObject(user); return model; } + + + //REST WEB-SERVICES + + @RequestMapping(value = "/user/{id}", method = RequestMethod.GET, produces = "application/json") + @ResponseBody + public User getUser(@PathVariable("id") BigInteger userId) { + return dataSource.getUserById(userId); + } + + @RequestMapping(value = "/users", method = RequestMethod.GET, produces = "application/json") + @ResponseBody + public List getUsers() { + return dataSource.getUsers(); + } + + @RequestMapping(value = "/user", method = RequestMethod.POST, consumes = "application/json") + public ResponseEntity addUser(@RequestBody User user) { + dataSource.addUser(user); + return new ResponseEntity(HttpStatus.ACCEPTED); + } + } diff --git a/src/main/java/com/tutorial/dao/DataSource.java b/src/main/java/com/tutorial/dao/DataSource.java new file mode 100644 index 0000000..fb7f617 --- /dev/null +++ b/src/main/java/com/tutorial/dao/DataSource.java @@ -0,0 +1,16 @@ +package com.tutorial.dao; + +import com.tutorial.entities.User; + +import java.math.BigInteger; +import java.util.List; + +public interface DataSource { + + List getUsers(); + + void addUser(User user); + + User getUserById(BigInteger userIdToFind); + +} diff --git a/src/main/java/com/tutorial/dao/DataSourceImpl.java b/src/main/java/com/tutorial/dao/DataSourceImpl.java new file mode 100644 index 0000000..379d515 --- /dev/null +++ b/src/main/java/com/tutorial/dao/DataSourceImpl.java @@ -0,0 +1,28 @@ +package com.tutorial.dao; + +import com.tutorial.entities.User; +import org.springframework.stereotype.Repository; + +import java.math.BigInteger; +import java.util.List; + +@Repository +public class DataSourceImpl implements DataSource { + + List users; + + @Override + public List getUsers() { + return users; + } + + @Override + public void addUser(User user) { + users.add(user); + } + + @Override + public User getUserById(BigInteger userIdToFind) { + return users.stream().filter(user -> user.getUserId().equals(userIdToFind)).findFirst().orElseGet(null); + } +} diff --git a/src/main/java/com/tutorial/entities/User.java b/src/main/java/com/tutorial/entities/User.java index a9755e3..a8bfe4c 100644 --- a/src/main/java/com/tutorial/entities/User.java +++ b/src/main/java/com/tutorial/entities/User.java @@ -4,21 +4,20 @@ import lombok.Getter; import lombok.Setter; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Size; +import java.math.BigInteger; public class User { @Getter @Setter - @NotNull - @Size(min = 3, message = "Please use enter the login using more than 3 symbols ") + private BigInteger userId; + + @Getter + @Setter private String login; @Getter @Setter - @NotNull - @Size(min = 4, max = 7, message = "Please enter the password in range from 4 to 7 symbols") private String password; @Getter diff --git a/src/main/webapp/WEB-INF/applicationContext.xml b/src/main/webapp/WEB-INF/applicationContext.xml index 66eb5bb..63ad32f 100644 --- a/src/main/webapp/WEB-INF/applicationContext.xml +++ b/src/main/webapp/WEB-INF/applicationContext.xml @@ -10,4 +10,17 @@
+ + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/dispatcher-servlet.xml b/src/main/webapp/WEB-INF/dispatcher-servlet.xml index 2cdc6a5..bb3e562 100644 --- a/src/main/webapp/WEB-INF/dispatcher-servlet.xml +++ b/src/main/webapp/WEB-INF/dispatcher-servlet.xml @@ -19,5 +19,4 @@ - \ No newline at end of file From ee8015452f0296b9881bd0ebdbcbe4d81746c196 Mon Sep 17 00:00:00 2001 From: def327 Date: Sun, 6 Aug 2017 16:52:03 +0300 Subject: [PATCH 06/12] 1) Add IdUserGenerator --- .idea/artifacts/ProjectMVC_war_exploded.xml | 4 ++ pom.xml | 31 ++++++++++++- ...ginController.java => UserController.java} | 13 +++--- .../java/com/tutorial/dao/DataSourceImpl.java | 8 +++- .../com/tutorial/utils/IdUserGenerator.java | 25 +++++++++++ .../webapp/WEB-INF/applicationContext.xml | 45 ++++++++++++------- .../tutorial/utils/IdUserGeneratorTest.java | 30 +++++++++++++ 7 files changed, 133 insertions(+), 23 deletions(-) rename src/main/java/com/tutorial/controllers/{LoginController.java => UserController.java} (88%) create mode 100644 src/main/java/com/tutorial/utils/IdUserGenerator.java create mode 100644 src/test/java/com/tutorial/utils/IdUserGeneratorTest.java diff --git a/.idea/artifacts/ProjectMVC_war_exploded.xml b/.idea/artifacts/ProjectMVC_war_exploded.xml index 7c0f59c..964a8c3 100644 --- a/.idea/artifacts/ProjectMVC_war_exploded.xml +++ b/.idea/artifacts/ProjectMVC_war_exploded.xml @@ -17,6 +17,8 @@ + + @@ -24,6 +26,8 @@ + + diff --git a/pom.xml b/pom.xml index 6b66da0..ee67f1c 100644 --- a/pom.xml +++ b/pom.xml @@ -12,6 +12,7 @@ 1.8 4.3.9.RELEASE 4.2.3.RELEASE + 4.12 UTF-8 @@ -52,18 +53,46 @@ 1.16.16 provided + + javax.inject + javax.inject + 1 + + + + junit + junit + ${junit.version} + test + + + org.springframework + spring-test + ${spring.version} + org.hibernate.validator hibernate-validator 6.0.0.CR3 - + com.fasterxml.jackson.core jackson-databind 2.7.5 + + + org.apache.logging.log4j + log4j-api + 2.8.2 + + + org.apache.logging.log4j + log4j-core + 2.8.2 + diff --git a/src/main/java/com/tutorial/controllers/LoginController.java b/src/main/java/com/tutorial/controllers/UserController.java similarity index 88% rename from src/main/java/com/tutorial/controllers/LoginController.java rename to src/main/java/com/tutorial/controllers/UserController.java index a15d10b..578cf3d 100644 --- a/src/main/java/com/tutorial/controllers/LoginController.java +++ b/src/main/java/com/tutorial/controllers/UserController.java @@ -2,7 +2,6 @@ import com.tutorial.dao.DataSource; import com.tutorial.entities.User; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; @@ -11,15 +10,16 @@ import org.springframework.web.bind.annotation.*; import org.springframework.web.servlet.ModelAndView; +import javax.inject.Inject; import javax.validation.Valid; import java.math.BigInteger; import java.util.List; @Controller -public class LoginController { +public class UserController { - @Autowired - DataSource dataSource; + @Inject + private DataSource dataSource; @RequestMapping( method = {RequestMethod.GET}, @@ -64,7 +64,10 @@ public List getUsers() { @RequestMapping(value = "/user", method = RequestMethod.POST, consumes = "application/json") public ResponseEntity addUser(@RequestBody User user) { dataSource.addUser(user); - return new ResponseEntity(HttpStatus.ACCEPTED); + return new ResponseEntity(HttpStatus.ACCEPTED); } + public void setDataSource(DataSource dataSource) { + this.dataSource = dataSource; + } } diff --git a/src/main/java/com/tutorial/dao/DataSourceImpl.java b/src/main/java/com/tutorial/dao/DataSourceImpl.java index 379d515..c3ab17a 100644 --- a/src/main/java/com/tutorial/dao/DataSourceImpl.java +++ b/src/main/java/com/tutorial/dao/DataSourceImpl.java @@ -3,13 +3,15 @@ import com.tutorial.entities.User; import org.springframework.stereotype.Repository; +import javax.annotation.Resource; import java.math.BigInteger; import java.util.List; @Repository public class DataSourceImpl implements DataSource { - List users; + @Resource(name = "userInitDBMock") + private List users; @Override public List getUsers() { @@ -25,4 +27,8 @@ public void addUser(User user) { public User getUserById(BigInteger userIdToFind) { return users.stream().filter(user -> user.getUserId().equals(userIdToFind)).findFirst().orElseGet(null); } + + public void setUsers(List users) { + this.users = users; + } } diff --git a/src/main/java/com/tutorial/utils/IdUserGenerator.java b/src/main/java/com/tutorial/utils/IdUserGenerator.java new file mode 100644 index 0000000..b34d58b --- /dev/null +++ b/src/main/java/com/tutorial/utils/IdUserGenerator.java @@ -0,0 +1,25 @@ +package com.tutorial.utils; + +import org.springframework.stereotype.Service; + +import java.math.BigInteger; +import java.nio.ByteBuffer; +import java.util.UUID; + +@Service("idGenerator") +public class IdUserGenerator { + + public BigInteger getUniqueUserID() { + long val = -1; + do { + final UUID uid = UUID.randomUUID(); + final ByteBuffer buffer = ByteBuffer.wrap(new byte[16]); + buffer.putLong(uid.getLeastSignificantBits()); + buffer.putLong(uid.getMostSignificantBits()); + final BigInteger bi = new BigInteger(buffer.array()); + val = bi.longValue(); + } while (val < 0); + + return BigInteger.valueOf(val); + } +} diff --git a/src/main/webapp/WEB-INF/applicationContext.xml b/src/main/webapp/WEB-INF/applicationContext.xml index 63ad32f..98c947e 100644 --- a/src/main/webapp/WEB-INF/applicationContext.xml +++ b/src/main/webapp/WEB-INF/applicationContext.xml @@ -1,26 +1,39 @@ + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:utils="http://www.springframework.org/schema/util" + xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"> - - - - - - - - - + + - + - - - - + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/test/java/com/tutorial/utils/IdUserGeneratorTest.java b/src/test/java/com/tutorial/utils/IdUserGeneratorTest.java new file mode 100644 index 0000000..c104b05 --- /dev/null +++ b/src/test/java/com/tutorial/utils/IdUserGeneratorTest.java @@ -0,0 +1,30 @@ +package com.tutorial.utils; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.web.WebAppConfiguration; + +import javax.inject.Inject; + + +@RunWith(SpringJUnit4ClassRunner.class) +@WebAppConfiguration +@ContextConfiguration({ + "file:src/main/webapp/WEB-INF/applicationContext.xml", + "file:src/main/webapp/WEB-INF/dispatcher-servlet.xml" +}) +public class IdUserGeneratorTest { + + @Inject + @Qualifier(value = "idGenerator") + private IdUserGenerator idGenerator; + + @Test + public void getUniqueUserID() throws Exception { + System.out.println("GENERATE ID : " + idGenerator.getUniqueUserID()); + } + +} \ No newline at end of file From 2205378923729e39e6d47a43fc2fefd9e364102a Mon Sep 17 00:00:00 2001 From: def327 Date: Sun, 6 Aug 2017 17:23:05 +0300 Subject: [PATCH 07/12] 1) Add Logging support --- pom.xml | 13 +++++++++++-- .../java/com/tutorial/utils/IdUserGenerator.java | 8 +++++++- src/main/resources/log4j2.xml | 16 ++++++++++++++++ .../com/tutorial/utils/IdUserGeneratorTest.java | 6 +++++- 4 files changed, 39 insertions(+), 4 deletions(-) create mode 100644 src/main/resources/log4j2.xml diff --git a/pom.xml b/pom.xml index ee67f1c..8cb9cd0 100644 --- a/pom.xml +++ b/pom.xml @@ -13,6 +13,7 @@ 4.3.9.RELEASE 4.2.3.RELEASE 4.12 + 2.8.2 UTF-8 @@ -58,6 +59,8 @@ javax.inject 1 + + junit @@ -70,28 +73,34 @@ spring-test ${spring.version} + + org.hibernate.validator hibernate-validator 6.0.0.CR3 + + com.fasterxml.jackson.core jackson-databind 2.7.5 + + org.apache.logging.log4j log4j-api - 2.8.2 + ${log4j.version} org.apache.logging.log4j log4j-core - 2.8.2 + ${log4j.version} diff --git a/src/main/java/com/tutorial/utils/IdUserGenerator.java b/src/main/java/com/tutorial/utils/IdUserGenerator.java index b34d58b..189dd42 100644 --- a/src/main/java/com/tutorial/utils/IdUserGenerator.java +++ b/src/main/java/com/tutorial/utils/IdUserGenerator.java @@ -1,5 +1,7 @@ package com.tutorial.utils; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.springframework.stereotype.Service; import java.math.BigInteger; @@ -9,6 +11,8 @@ @Service("idGenerator") public class IdUserGenerator { + private static final Logger LOGGER = LogManager.getLogger(IdUserGenerator.class); + public BigInteger getUniqueUserID() { long val = -1; do { @@ -20,6 +24,8 @@ public BigInteger getUniqueUserID() { val = bi.longValue(); } while (val < 0); - return BigInteger.valueOf(val); + BigInteger uniqueId = BigInteger.valueOf(val); + LOGGER.debug("GENERATE Unique User ID = " + uniqueId); + return uniqueId; } } diff --git a/src/main/resources/log4j2.xml b/src/main/resources/log4j2.xml new file mode 100644 index 0000000..df0007f --- /dev/null +++ b/src/main/resources/log4j2.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/test/java/com/tutorial/utils/IdUserGeneratorTest.java b/src/test/java/com/tutorial/utils/IdUserGeneratorTest.java index c104b05..94f79b8 100644 --- a/src/test/java/com/tutorial/utils/IdUserGeneratorTest.java +++ b/src/test/java/com/tutorial/utils/IdUserGeneratorTest.java @@ -1,5 +1,7 @@ package com.tutorial.utils; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Qualifier; @@ -18,13 +20,15 @@ }) public class IdUserGeneratorTest { + private static final Logger LOGGER = LogManager.getLogger(IdUserGenerator.class); + @Inject @Qualifier(value = "idGenerator") private IdUserGenerator idGenerator; @Test public void getUniqueUserID() throws Exception { - System.out.println("GENERATE ID : " + idGenerator.getUniqueUserID()); + LOGGER.debug("GENERATE ID : " + idGenerator.getUniqueUserID()); } } \ No newline at end of file From 3f46223535cced82075516fc36ccc84fd6ceb8d1 Mon Sep 17 00:00:00 2001 From: def327 Date: Sun, 6 Aug 2017 18:23:28 +0300 Subject: [PATCH 08/12] Fix IdUserGeneratorSupport --- pom.xml | 5 ++ .../com/tutorial/utils/IdUserGenerator.java | 10 +++- .../webapp/WEB-INF/applicationContext.xml | 57 +++++++++---------- .../tutorial/utils/IdUserGeneratorTest.java | 2 +- 4 files changed, 41 insertions(+), 33 deletions(-) diff --git a/pom.xml b/pom.xml index 8cb9cd0..d030e03 100644 --- a/pom.xml +++ b/pom.xml @@ -37,6 +37,11 @@ spring-webmvc ${spring.version} + + org.springframework + spring-expression + ${spring.version} + javax.servlet javax.servlet-api diff --git a/src/main/java/com/tutorial/utils/IdUserGenerator.java b/src/main/java/com/tutorial/utils/IdUserGenerator.java index 189dd42..c67d940 100644 --- a/src/main/java/com/tutorial/utils/IdUserGenerator.java +++ b/src/main/java/com/tutorial/utils/IdUserGenerator.java @@ -11,18 +11,22 @@ @Service("idGenerator") public class IdUserGenerator { + public static final int RANDOM_START_VALUE = -1; + public static final int BUFFER_SIZE = 16; + public static final int ZERO_VALUE = 0; + private static final Logger LOGGER = LogManager.getLogger(IdUserGenerator.class); public BigInteger getUniqueUserID() { - long val = -1; + long val = RANDOM_START_VALUE; do { final UUID uid = UUID.randomUUID(); - final ByteBuffer buffer = ByteBuffer.wrap(new byte[16]); + final ByteBuffer buffer = ByteBuffer.wrap(new byte[BUFFER_SIZE]); buffer.putLong(uid.getLeastSignificantBits()); buffer.putLong(uid.getMostSignificantBits()); final BigInteger bi = new BigInteger(buffer.array()); val = bi.longValue(); - } while (val < 0); + } while (val < ZERO_VALUE); BigInteger uniqueId = BigInteger.valueOf(val); LOGGER.debug("GENERATE Unique User ID = " + uniqueId); diff --git a/src/main/webapp/WEB-INF/applicationContext.xml b/src/main/webapp/WEB-INF/applicationContext.xml index 98c947e..1daa5b9 100644 --- a/src/main/webapp/WEB-INF/applicationContext.xml +++ b/src/main/webapp/WEB-INF/applicationContext.xml @@ -1,39 +1,38 @@ + xmlns:context="http://www.springframework.org/schema/context" + xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/test/java/com/tutorial/utils/IdUserGeneratorTest.java b/src/test/java/com/tutorial/utils/IdUserGeneratorTest.java index 94f79b8..fdf3a2c 100644 --- a/src/test/java/com/tutorial/utils/IdUserGeneratorTest.java +++ b/src/test/java/com/tutorial/utils/IdUserGeneratorTest.java @@ -27,7 +27,7 @@ public class IdUserGeneratorTest { private IdUserGenerator idGenerator; @Test - public void getUniqueUserID() throws Exception { + public void testGetUniqueUserID() throws Exception { LOGGER.debug("GENERATE ID : " + idGenerator.getUniqueUserID()); } From 38bb74bd3de2b97cef5d64399f3f5336cb445329 Mon Sep 17 00:00:00 2001 From: def327 Date: Sun, 6 Aug 2017 18:57:53 +0300 Subject: [PATCH 09/12] Fix UserController --- .../java/com/tutorial/controllers/UserController.java | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/tutorial/controllers/UserController.java b/src/main/java/com/tutorial/controllers/UserController.java index 578cf3d..955607d 100644 --- a/src/main/java/com/tutorial/controllers/UserController.java +++ b/src/main/java/com/tutorial/controllers/UserController.java @@ -2,6 +2,8 @@ import com.tutorial.dao.DataSource; import com.tutorial.entities.User; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; @@ -18,6 +20,8 @@ @Controller public class UserController { + private static final Logger LOGGER = LogManager.getLogger(UserController.class); + @Inject private DataSource dataSource; @@ -47,24 +51,27 @@ public ModelAndView checkUser(@Valid @ModelAttribute("user") User user, BindingR } - //REST WEB-SERVICES + //REST-ful WEB-SERVICES @RequestMapping(value = "/user/{id}", method = RequestMethod.GET, produces = "application/json") @ResponseBody public User getUser(@PathVariable("id") BigInteger userId) { + LOGGER.debug("GET : /user/{}", userId); return dataSource.getUserById(userId); } @RequestMapping(value = "/users", method = RequestMethod.GET, produces = "application/json") @ResponseBody public List getUsers() { + LOGGER.debug("GET : /users"); return dataSource.getUsers(); } @RequestMapping(value = "/user", method = RequestMethod.POST, consumes = "application/json") public ResponseEntity addUser(@RequestBody User user) { + LOGGER.debug("POST : /user"); dataSource.addUser(user); - return new ResponseEntity(HttpStatus.ACCEPTED); + return ResponseEntity.status(HttpStatus.CREATED).build(); } public void setDataSource(DataSource dataSource) { From 760c5fc8eba3828c343b4f6bc5813f0d1845a06f Mon Sep 17 00:00:00 2001 From: def327 Date: Mon, 7 Aug 2017 00:57:42 +0300 Subject: [PATCH 10/12] 1) Add JAXB annotations for User 2) Fix REST API Web-services --- .../tutorial/controllers/UserController.java | 37 +++++++++++++------ .../java/com/tutorial/dao/DataSource.java | 2 +- .../java/com/tutorial/dao/DataSourceImpl.java | 11 +++--- src/main/java/com/tutorial/entities/User.java | 26 ------------- .../java/com/tutorial/entities/user/User.java | 26 +++++++++++++ .../tutorial/entities/user/UserListJAXB.java | 21 +++++++++++ .../tutorial/utils/UsersListJAXBCreator.java | 16 ++++++++ .../webapp/WEB-INF/applicationContext.xml | 10 ++--- 8 files changed, 99 insertions(+), 50 deletions(-) delete mode 100644 src/main/java/com/tutorial/entities/User.java create mode 100644 src/main/java/com/tutorial/entities/user/User.java create mode 100644 src/main/java/com/tutorial/entities/user/UserListJAXB.java create mode 100644 src/main/java/com/tutorial/utils/UsersListJAXBCreator.java diff --git a/src/main/java/com/tutorial/controllers/UserController.java b/src/main/java/com/tutorial/controllers/UserController.java index 955607d..bbfaa4b 100644 --- a/src/main/java/com/tutorial/controllers/UserController.java +++ b/src/main/java/com/tutorial/controllers/UserController.java @@ -1,7 +1,10 @@ package com.tutorial.controllers; import com.tutorial.dao.DataSource; -import com.tutorial.entities.User; +import com.tutorial.entities.user.User; +import com.tutorial.entities.user.UserListJAXB; +import com.tutorial.utils.UsersListJAXBCreator; +import lombok.Setter; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.springframework.http.HttpStatus; @@ -22,6 +25,7 @@ public class UserController { private static final Logger LOGGER = LogManager.getLogger(UserController.class); + @Setter @Inject private DataSource dataSource; @@ -52,29 +56,38 @@ public ModelAndView checkUser(@Valid @ModelAttribute("user") User user, BindingR //REST-ful WEB-SERVICES - - @RequestMapping(value = "/user/{id}", method = RequestMethod.GET, produces = "application/json") + @RequestMapping(value = "json/user/{id}", method = RequestMethod.GET, produces = "application/json") @ResponseBody - public User getUser(@PathVariable("id") BigInteger userId) { - LOGGER.debug("GET : /user/{}", userId); + public User getJsonUser(@PathVariable("id") BigInteger userId) { + LOGGER.debug("GET : json/user/{}", userId); return dataSource.getUserById(userId); } - @RequestMapping(value = "/users", method = RequestMethod.GET, produces = "application/json") + @RequestMapping(value = "json/users", method = RequestMethod.GET, produces = "application/json") @ResponseBody - public List getUsers() { - LOGGER.debug("GET : /users"); + public List getJsonUsers() { + LOGGER.debug("GET : json/users"); return dataSource.getUsers(); } + @RequestMapping(value = "xml/user/{id}", method = RequestMethod.GET, produces = "application/xml") + @ResponseBody + public User getXmlUser(@PathVariable("id") BigInteger userId) { + LOGGER.debug("GET : xml/user/{}", userId); + return dataSource.getUserById(userId); + } + + @RequestMapping(value = "xml/users", method = RequestMethod.GET, produces = "application/xml") + @ResponseBody + public UserListJAXB getXmlUsers() { + LOGGER.debug("GET : xml/users"); + return UsersListJAXBCreator.createUserList(dataSource.getUsers()); + } + @RequestMapping(value = "/user", method = RequestMethod.POST, consumes = "application/json") public ResponseEntity addUser(@RequestBody User user) { LOGGER.debug("POST : /user"); dataSource.addUser(user); return ResponseEntity.status(HttpStatus.CREATED).build(); } - - public void setDataSource(DataSource dataSource) { - this.dataSource = dataSource; - } } diff --git a/src/main/java/com/tutorial/dao/DataSource.java b/src/main/java/com/tutorial/dao/DataSource.java index fb7f617..d1944c8 100644 --- a/src/main/java/com/tutorial/dao/DataSource.java +++ b/src/main/java/com/tutorial/dao/DataSource.java @@ -1,6 +1,6 @@ package com.tutorial.dao; -import com.tutorial.entities.User; +import com.tutorial.entities.user.User; import java.math.BigInteger; import java.util.List; diff --git a/src/main/java/com/tutorial/dao/DataSourceImpl.java b/src/main/java/com/tutorial/dao/DataSourceImpl.java index c3ab17a..3759a3a 100644 --- a/src/main/java/com/tutorial/dao/DataSourceImpl.java +++ b/src/main/java/com/tutorial/dao/DataSourceImpl.java @@ -1,6 +1,7 @@ package com.tutorial.dao; -import com.tutorial.entities.User; +import com.tutorial.entities.user.User; +import lombok.Setter; import org.springframework.stereotype.Repository; import javax.annotation.Resource; @@ -10,6 +11,7 @@ @Repository public class DataSourceImpl implements DataSource { + @Setter @Resource(name = "userInitDBMock") private List users; @@ -25,10 +27,7 @@ public void addUser(User user) { @Override public User getUserById(BigInteger userIdToFind) { - return users.stream().filter(user -> user.getUserId().equals(userIdToFind)).findFirst().orElseGet(null); - } - - public void setUsers(List users) { - this.users = users; + User user = users.stream().filter(o -> o.getUserId().equals(userIdToFind)).findFirst().get(); + return user; } } diff --git a/src/main/java/com/tutorial/entities/User.java b/src/main/java/com/tutorial/entities/User.java deleted file mode 100644 index a8bfe4c..0000000 --- a/src/main/java/com/tutorial/entities/User.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.tutorial.entities; - - -import lombok.Getter; -import lombok.Setter; - -import java.math.BigInteger; - -public class User { - - @Getter - @Setter - private BigInteger userId; - - @Getter - @Setter - private String login; - - @Getter - @Setter - private String password; - - @Getter - @Setter - private boolean keepLoggedIn; -} diff --git a/src/main/java/com/tutorial/entities/user/User.java b/src/main/java/com/tutorial/entities/user/User.java new file mode 100644 index 0000000..e2ca0f7 --- /dev/null +++ b/src/main/java/com/tutorial/entities/user/User.java @@ -0,0 +1,26 @@ +package com.tutorial.entities.user; + + +import lombok.Data; + +import javax.xml.bind.annotation.*; +import java.io.Serializable; +import java.math.BigInteger; + +@XmlRootElement(name = "user") +@XmlType(propOrder = {"userId", "login", "password"}) +@XmlAccessorType(XmlAccessType.FIELD) +@Data +public class User implements Serializable { + + @XmlElement(name = "id") + private BigInteger userId; + + private String login; + + @XmlElement + private String password; + + @XmlAttribute + private boolean keepLoggedIn; +} diff --git a/src/main/java/com/tutorial/entities/user/UserListJAXB.java b/src/main/java/com/tutorial/entities/user/UserListJAXB.java new file mode 100644 index 0000000..8298391 --- /dev/null +++ b/src/main/java/com/tutorial/entities/user/UserListJAXB.java @@ -0,0 +1,21 @@ +package com.tutorial.entities.user; + + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlSeeAlso; +import java.io.Serializable; +import java.util.List; + +@XmlRootElement(name = "users") +@XmlSeeAlso(User.class) +@Data +@NoArgsConstructor(force = true) +@AllArgsConstructor +public class UserListJAXB implements Serializable { + + private List users; +} diff --git a/src/main/java/com/tutorial/utils/UsersListJAXBCreator.java b/src/main/java/com/tutorial/utils/UsersListJAXBCreator.java new file mode 100644 index 0000000..7a68039 --- /dev/null +++ b/src/main/java/com/tutorial/utils/UsersListJAXBCreator.java @@ -0,0 +1,16 @@ +package com.tutorial.utils; + +import com.tutorial.entities.user.User; +import com.tutorial.entities.user.UserListJAXB; + +import java.util.List; + +/** + * Created def327 on 8/7/17. + */ +public class UsersListJAXBCreator { + + public static UserListJAXB createUserList(List users) { + return new UserListJAXB(users); + } +} diff --git a/src/main/webapp/WEB-INF/applicationContext.xml b/src/main/webapp/WEB-INF/applicationContext.xml index 1daa5b9..b1bd28b 100644 --- a/src/main/webapp/WEB-INF/applicationContext.xml +++ b/src/main/webapp/WEB-INF/applicationContext.xml @@ -8,26 +8,26 @@ - - + + - + - + - + From a796678906dc0fb84020fb567142cc21a5ba7128 Mon Sep 17 00:00:00 2001 From: def327 Date: Mon, 7 Aug 2017 01:41:51 +0300 Subject: [PATCH 11/12] Fix NullPointerException while DataSourceImpl#getUserById execute --- src/main/java/com/tutorial/dao/DataSourceImpl.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/tutorial/dao/DataSourceImpl.java b/src/main/java/com/tutorial/dao/DataSourceImpl.java index 3759a3a..98a795e 100644 --- a/src/main/java/com/tutorial/dao/DataSourceImpl.java +++ b/src/main/java/com/tutorial/dao/DataSourceImpl.java @@ -27,7 +27,11 @@ public void addUser(User user) { @Override public User getUserById(BigInteger userIdToFind) { - User user = users.stream().filter(o -> o.getUserId().equals(userIdToFind)).findFirst().get(); - return user; + try { + User user = users.stream().filter(o -> o.getUserId().equals(userIdToFind)).findFirst().get(); + return user; + } catch (Exception e) { + return null; + } } } From a58b4e48bd61fdd535c08dc0e3c9d5059e4cc371 Mon Sep 17 00:00:00 2001 From: def327 Date: Thu, 10 Aug 2017 00:56:25 +0300 Subject: [PATCH 12/12] Add Util to generate unique id for new User using AOP on REST /user --- pom.xml | 12 ++++++++++++ .../com/tutorial/controllers/UserController.java | 2 +- .../java/com/tutorial/utils/IdUserGenerator.java | 14 ++++++++++++++ src/main/webapp/WEB-INF/applicationContext.xml | 6 +++--- src/main/webapp/WEB-INF/dispatcher-servlet.xml | 15 +++++++++++++-- 5 files changed, 43 insertions(+), 6 deletions(-) diff --git a/pom.xml b/pom.xml index d030e03..d8e1291 100644 --- a/pom.xml +++ b/pom.xml @@ -65,6 +65,18 @@ 1 + + + org.springframework + spring-aop + ${spring.version} + + + org.aspectj + aspectjweaver + 1.8.10 + + diff --git a/src/main/java/com/tutorial/controllers/UserController.java b/src/main/java/com/tutorial/controllers/UserController.java index bbfaa4b..7585c9f 100644 --- a/src/main/java/com/tutorial/controllers/UserController.java +++ b/src/main/java/com/tutorial/controllers/UserController.java @@ -20,7 +20,7 @@ import java.math.BigInteger; import java.util.List; -@Controller +@Controller("userController") public class UserController { private static final Logger LOGGER = LogManager.getLogger(UserController.class); diff --git a/src/main/java/com/tutorial/utils/IdUserGenerator.java b/src/main/java/com/tutorial/utils/IdUserGenerator.java index c67d940..96ee236 100644 --- a/src/main/java/com/tutorial/utils/IdUserGenerator.java +++ b/src/main/java/com/tutorial/utils/IdUserGenerator.java @@ -1,7 +1,9 @@ package com.tutorial.utils; +import com.tutorial.entities.user.User; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.aspectj.lang.ProceedingJoinPoint; import org.springframework.stereotype.Service; import java.math.BigInteger; @@ -16,6 +18,7 @@ public class IdUserGenerator { public static final int ZERO_VALUE = 0; private static final Logger LOGGER = LogManager.getLogger(IdUserGenerator.class); + public static final int USER_ARG = 0; public BigInteger getUniqueUserID() { long val = RANDOM_START_VALUE; @@ -32,4 +35,15 @@ public BigInteger getUniqueUserID() { LOGGER.debug("GENERATE Unique User ID = " + uniqueId); return uniqueId; } + + public Object fillUniqueId(ProceedingJoinPoint joinPoint) throws Throwable { + Object[] args = joinPoint.getArgs(); + User user = (User) args[USER_ARG]; + BigInteger uniqueId = getUniqueUserID(); + user.setUserId(uniqueId); + LOGGER.debug("Generate id = {} for user with login : {}", uniqueId, user.getLogin()); + Object output = joinPoint.proceed(); + return output; + } + } diff --git a/src/main/webapp/WEB-INF/applicationContext.xml b/src/main/webapp/WEB-INF/applicationContext.xml index b1bd28b..cf9f257 100644 --- a/src/main/webapp/WEB-INF/applicationContext.xml +++ b/src/main/webapp/WEB-INF/applicationContext.xml @@ -2,11 +2,12 @@ + xmlns:aop="http://www.springframework.org/schema/aop" + xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> - + @@ -34,5 +35,4 @@ - \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/dispatcher-servlet.xml b/src/main/webapp/WEB-INF/dispatcher-servlet.xml index bb3e562..eb38f37 100644 --- a/src/main/webapp/WEB-INF/dispatcher-servlet.xml +++ b/src/main/webapp/WEB-INF/dispatcher-servlet.xml @@ -2,8 +2,8 @@ + xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:aop="http://www.springframework.org/schema/aop" + xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> @@ -19,4 +19,15 @@ + + + + + + + + + + \ No newline at end of file