Directory Structure

build.gradle
plugins {
id 'java'
id 'org.springframework.boot' version '2.0.5.RELEASE'
id 'io.spring.dependency-management' version '1.0.7.RELEASE'
}
repositories {
jcenter()
}
dependencies {
implementation 'com.google.guava:guava:28.0-jre'
testImplementation 'junit:junit:4.12'
implementation 'org.springframework.boot:spring-boot-dependencies:2.0.5.RELEASE'
implementation 'org.springframework.boot:spring-boot-starter-web'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
compile 'javax.validation:validation-api:2.0.1.Final'
components {
withModule('org.springframework:spring-beans') {
allVariants {
withDependencyConstraints {
it.findAll { it.name == 'snakeyaml' }.each { it.version { strictly '1.19' } }
}
}
}
}
}
bootJar {
mainClassName = 'GradleDemo.App'
}
task runJar{
dependsOn 'assemble'
dependsOn 'jar'
doLast{
javaexec {
main="-jar";
args = [
"build/libs/"+rootProject.name+".jar"
]
}
}
}
settings.gradle
rootProject.name = 'SpringBoot'
application.properties
server.port=9090 logging.level.org.springframework=DEBUG
messages.properties
date.connot.future=Date of birth cannot be future dateddddddddddddd
CreateUserGroup.java
package app;
public interface CreateUserGroup { }
User.java
package app;
import java.util.Date;
import javax.validation.constraints.Past;
import javax.validation.constraints.Size;
public class User {
private Integer id;
@Size(min=2,message="Size cannot be less than 2")
private String name;
@Past(message = "{date.connot.future}",groups = {CreateUserGroup.class})
private Date birthDate;
public User() {
}
public User(Integer id, String name, Date birthDate) {
super();
this.id = id;
this.name = name;
this.birthDate = birthDate;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getBirthDate() {
return birthDate;
}
public void setBirthDate(Date birthDate) {
this.birthDate = birthDate;
}
}
HelloGradleController.java
package app;
import java.net.URI;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.support.ServletUriComponentsBuilder;
@RestController
@CrossOrigin
public class HelloGradleController {
@PostMapping("/createUser")
public ResponseEntity<Object> createUser(@Validated({CreateUserGroup.class}) @RequestBody User user){
URI location = ServletUriComponentsBuilder
.fromCurrentRequest()
.path("/{id}")
.buildAndExpand(user.getId()).toUri();
return ResponseEntity.created(location).build();
}
}
App.java
/*
* This Java source file was generated by the Gradle 'init' task.
*/
package app;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.MessageSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;
@SpringBootApplication
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
@Bean
public MessageSource messageSource() {
ReloadableResourceBundleMessageSource messageSource
= new ReloadableResourceBundleMessageSource();
messageSource.setBasename("classpath:messages");
messageSource.setDefaultEncoding("UTF-8");
return messageSource;
}
@Bean
public LocalValidatorFactoryBean getValidator() {
LocalValidatorFactoryBean bean = new LocalValidatorFactoryBean();
bean.setValidationMessageSource(messageSource());
return bean;
}
}
ErrorField.java
package app.exception;
public class ErrorField {
private String errorMessage;
private String field;
public ErrorField(){
}
public ErrorField(String errorMessage, String field) {
super();
this.errorMessage = errorMessage;
this.field = field;
}
public String getErrorMessage() {
return errorMessage;
}
public void setErrorMessage(String errorMessage) {
this.errorMessage = errorMessage;
}
public String getField() {
return field;
}
public void setField(String field) {
this.field = field;
}
}
ExceptionResponse.java
package app.exception;
import java.util.Date;
import java.util.List;
public class ExceptionResponse {
private Date timestamp;
private String message;
private String details;
private List<ErrorField> errorFieldList;
public ExceptionResponse(Date timestamp, String message, String details, List<ErrorField> errorFieldList) {
super();
this.timestamp = timestamp;
this.message = message;
this.details = details;
this.errorFieldList = errorFieldList;
}
public Date getTimestamp() {
return timestamp;
}
public void setTimestamp(Date timestamp) {
this.timestamp = timestamp;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public String getDetails() {
return details;
}
public void setDetails(String details) {
this.details = details;
}
public List<ErrorField> getErrorFieldList() {
return errorFieldList;
}
public void setErrorFieldList(List<ErrorField> errorFieldList) {
this.errorFieldList = errorFieldList;
}
}
AppExceptionHandling.java
package app.exception;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;
@ControllerAdvice
@RestController
public class AppExceptionHandling extends ResponseEntityExceptionHandler {
@Override
protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex,
HttpHeaders headers, HttpStatus status, WebRequest request) {
List<ErrorField> errorFieldList = new ArrayList<>();
for (FieldError fieldError : ex.getBindingResult().getFieldErrors()) {
ErrorField errorField = new ErrorField(fieldError.getDefaultMessage(), fieldError.getField());
errorFieldList.add(errorField);
}
ExceptionResponse exceptionResponse = new ExceptionResponse(new Date(), ex.getMessage(),
ex.getBindingResult().toString(), errorFieldList);
return new ResponseEntity(exceptionResponse, HttpStatus.BAD_REQUEST);
}
}
Output :
