diff --git a/README.md b/README.md index bc99473..e494d71 100644 --- a/README.md +++ b/README.md @@ -8,4 +8,5 @@ Tutorials are available to explain the steps on [Medium](https://medium.com/@cel ##### Getting Started with Spring Boot, Hibernate, Jersey, and MySQL * [Part 1 - Getting Spring Initializr project to run](https://medium.com/@cellularcinema/getting-started-with-spring-boot-hibernate-jersey-and-mysql-part-1-9aea23a9a32d) +* [Part 2 - POST a User](https://medium.com/@adamzink/getting-started-with-spring-boot-hibernate-jersey-and-mysql-part-2-b9f98a1bbbae) diff --git a/src/main/java/com/github/adamzink/springbootmysqldemo/JerseyConfiguration.java b/src/main/java/com/github/adamzink/springbootmysqldemo/JerseyConfiguration.java new file mode 100644 index 0000000..04e3303 --- /dev/null +++ b/src/main/java/com/github/adamzink/springbootmysqldemo/JerseyConfiguration.java @@ -0,0 +1,14 @@ +package com.github.adamzink.springbootmysqldemo; + +import com.github.adamzink.springbootmysqldemo.resource.UserResource; +import org.glassfish.jersey.server.ResourceConfig; +import org.springframework.stereotype.Component; + +@Component +public class JerseyConfiguration extends ResourceConfig { + + public JerseyConfiguration() { + register(UserResource.class); + } + +} diff --git a/src/main/java/com/github/adamzink/springbootmysqldemo/converter/UserConverter.java b/src/main/java/com/github/adamzink/springbootmysqldemo/converter/UserConverter.java new file mode 100644 index 0000000..4274b14 --- /dev/null +++ b/src/main/java/com/github/adamzink/springbootmysqldemo/converter/UserConverter.java @@ -0,0 +1,32 @@ +package com.github.adamzink.springbootmysqldemo.converter; + +import com.github.adamzink.springbootmysqldemo.converter.common.ModelConverter; +import com.github.adamzink.springbootmysqldemo.model.client.User; +import com.github.adamzink.springbootmysqldemo.model.db.UserModel; +import com.github.adamzink.springbootmysqldemo.model.client.UserRequest; +import org.springframework.stereotype.Component; + +import java.text.SimpleDateFormat; + +@Component +public class UserConverter implements ModelConverter { + + @Override + public UserModel requestToModel(UserRequest request) { + UserModel model = new UserModel(); + model.setFirstName(request.getFirstName()); + model.setLastName(request.getLastName()); + return model; + } + + @Override + public User modelToResponse(UserModel model) { + User response = new User(); + response.setId(model.getId()); + response.setFirstName(model.getFirstName()); + response.setLastName(model.getLastName()); + response.setAddDate(new SimpleDateFormat("MMM d, yyyy").format(model.getAddTs())); + return response; + } + +} diff --git a/src/main/java/com/github/adamzink/springbootmysqldemo/converter/common/ModelConverter.java b/src/main/java/com/github/adamzink/springbootmysqldemo/converter/common/ModelConverter.java new file mode 100644 index 0000000..eb25657 --- /dev/null +++ b/src/main/java/com/github/adamzink/springbootmysqldemo/converter/common/ModelConverter.java @@ -0,0 +1,9 @@ +package com.github.adamzink.springbootmysqldemo.converter.common; + +public interface ModelConverter { + + M requestToModel(Q request); + + S modelToResponse (M model); + +} diff --git a/src/main/java/com/github/adamzink/springbootmysqldemo/facade/UserFacade.java b/src/main/java/com/github/adamzink/springbootmysqldemo/facade/UserFacade.java new file mode 100644 index 0000000..359fad6 --- /dev/null +++ b/src/main/java/com/github/adamzink/springbootmysqldemo/facade/UserFacade.java @@ -0,0 +1,27 @@ +package com.github.adamzink.springbootmysqldemo.facade; + +import com.github.adamzink.springbootmysqldemo.converter.UserConverter; +import com.github.adamzink.springbootmysqldemo.model.client.User; +import com.github.adamzink.springbootmysqldemo.model.client.UserRequest; +import com.github.adamzink.springbootmysqldemo.service.UserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@Transactional +public class UserFacade { + + @Autowired + UserConverter userConverter; + + @Autowired + UserService userService; + + public User save(UserRequest userRequest) { + return userConverter.modelToResponse( + userService.save(userConverter.requestToModel(userRequest)) + ); + } + +} diff --git a/src/main/java/com/github/adamzink/springbootmysqldemo/model/client/User.java b/src/main/java/com/github/adamzink/springbootmysqldemo/model/client/User.java new file mode 100644 index 0000000..674be0a --- /dev/null +++ b/src/main/java/com/github/adamzink/springbootmysqldemo/model/client/User.java @@ -0,0 +1,67 @@ +package com.github.adamzink.springbootmysqldemo.model.client; + +public class User { + + private Long id; + private String firstName; + private String lastName; + private String addDate; + + public User() { + } + + 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 getAddDate() { + return addDate; + } + + public void setAddDate(String addDate) { + this.addDate = addDate; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + User user = (User) o; + + if (id != null ? !id.equals(user.id) : user.id != null) return false; + if (firstName != null ? !firstName.equals(user.firstName) : user.firstName != null) return false; + if (lastName != null ? !lastName.equals(user.lastName) : user.lastName != null) return false; + return addDate != null ? addDate.equals(user.addDate) : user.addDate == null; + + } + + @Override + public int hashCode() { + int result = id != null ? id.hashCode() : 0; + result = 31 * result + (firstName != null ? firstName.hashCode() : 0); + result = 31 * result + (lastName != null ? lastName.hashCode() : 0); + result = 31 * result + (addDate != null ? addDate.hashCode() : 0); + return result; + } +} diff --git a/src/main/java/com/github/adamzink/springbootmysqldemo/model/client/UserRequest.java b/src/main/java/com/github/adamzink/springbootmysqldemo/model/client/UserRequest.java new file mode 100644 index 0000000..a0940fa --- /dev/null +++ b/src/main/java/com/github/adamzink/springbootmysqldemo/model/client/UserRequest.java @@ -0,0 +1,45 @@ +package com.github.adamzink.springbootmysqldemo.model.client; + +public class UserRequest { + + private String firstName; + private String lastName; + + public UserRequest() { + } + + 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; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + UserRequest that = (UserRequest) o; + + if (firstName != null ? !firstName.equals(that.firstName) : that.firstName != null) return false; + return lastName != null ? lastName.equals(that.lastName) : that.lastName == null; + } + + @Override + public int hashCode() { + int result = firstName != null ? firstName.hashCode() : 0; + result = 31 * result + (lastName != null ? lastName.hashCode() : 0); + return result; + } +} + diff --git a/src/main/java/com/github/adamzink/springbootmysqldemo/model/db/UserModel.java b/src/main/java/com/github/adamzink/springbootmysqldemo/model/db/UserModel.java new file mode 100644 index 0000000..55786d2 --- /dev/null +++ b/src/main/java/com/github/adamzink/springbootmysqldemo/model/db/UserModel.java @@ -0,0 +1,79 @@ +package com.github.adamzink.springbootmysqldemo.model.db; + +import javax.persistence.*; +import java.util.Date; + +@Entity +@Table(name="USER") +public class UserModel { + @Id + @GeneratedValue(strategy=GenerationType.IDENTITY) + @Column + private Long id; + + @Column + private String firstName; + + @Column + private String lastName; + + @Column + private Date addTs; + + public UserModel() { + } + + 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 Date getAddTs() { + return addTs; + } + + public void setAddTs(Date addTs) { + this.addTs = addTs; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + UserModel userModel = (UserModel) o; + + if (id != null ? !id.equals(userModel.id) : userModel.id != null) return false; + if (firstName != null ? !firstName.equals(userModel.firstName) : userModel.firstName != null) return false; + if (lastName != null ? !lastName.equals(userModel.lastName) : userModel.lastName != null) return false; + return addTs != null ? addTs.equals(userModel.addTs) : userModel.addTs == null; + } + + @Override + public int hashCode() { + int result = id != null ? id.hashCode() : 0; + result = 31 * result + (firstName != null ? firstName.hashCode() : 0); + result = 31 * result + (lastName != null ? lastName.hashCode() : 0); + result = 31 * result + (addTs != null ? addTs.hashCode() : 0); + return result; + } +} diff --git a/src/main/java/com/github/adamzink/springbootmysqldemo/repository/UserRepository.java b/src/main/java/com/github/adamzink/springbootmysqldemo/repository/UserRepository.java new file mode 100644 index 0000000..f40b7b9 --- /dev/null +++ b/src/main/java/com/github/adamzink/springbootmysqldemo/repository/UserRepository.java @@ -0,0 +1,10 @@ +package com.github.adamzink.springbootmysqldemo.repository; + +import com.github.adamzink.springbootmysqldemo.model.db.UserModel; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface UserRepository extends JpaRepository { + +} diff --git a/src/main/java/com/github/adamzink/springbootmysqldemo/resource/UserResource.java b/src/main/java/com/github/adamzink/springbootmysqldemo/resource/UserResource.java new file mode 100644 index 0000000..da59501 --- /dev/null +++ b/src/main/java/com/github/adamzink/springbootmysqldemo/resource/UserResource.java @@ -0,0 +1,27 @@ +package com.github.adamzink.springbootmysqldemo.resource; + +import com.github.adamzink.springbootmysqldemo.facade.UserFacade; +import com.github.adamzink.springbootmysqldemo.model.client.User; +import com.github.adamzink.springbootmysqldemo.model.client.UserRequest; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import javax.ws.rs.*; +import javax.ws.rs.core.MediaType; + +@Path("/users") +@Component +public class UserResource { + + @Autowired + UserFacade userFacade; + + @POST + @Consumes(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON) + public User save(final UserRequest userRequest) { + return userFacade.save(userRequest); + } + +} + diff --git a/src/main/java/com/github/adamzink/springbootmysqldemo/service/UserService.java b/src/main/java/com/github/adamzink/springbootmysqldemo/service/UserService.java new file mode 100644 index 0000000..74bfcc6 --- /dev/null +++ b/src/main/java/com/github/adamzink/springbootmysqldemo/service/UserService.java @@ -0,0 +1,23 @@ +package com.github.adamzink.springbootmysqldemo.service; + +import com.github.adamzink.springbootmysqldemo.model.db.UserModel; +import com.github.adamzink.springbootmysqldemo.repository.UserRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Date; + +@Service +public class UserService { + + @Autowired + UserRepository userRepository; + + public UserModel save(final UserModel userModel) { + userModel.setAddTs(new Date()); + + return userRepository.save(userModel); + } + +} + diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 069f43c..ced950f 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -6,3 +6,6 @@ spring.datasource.driver-class-name=com.mysql.jdbc.Driver # Flyway properties spring.flyway.locations=classpath:db/mysql/migration + +# Path properties +server.servlet.contextPath=/api