From 92a42ee0357a6efcff10827dd25c9413fe4634bf Mon Sep 17 00:00:00 2001 From: Brian Oxley Date: Sat, 25 Apr 2015 08:08:03 -0500 Subject: [PATCH 1/5] Add level module for HATEOAS. --- level/pom.xml | 47 +++++++++++++++++++ level/src/main/java/hello/Greeting.java | 17 +++++++ .../src/main/java/hello/LevelController.java | 42 +++++++++++++++++ level/src/main/java/hello/LevelMain.java | 11 +++++ level/src/main/resources/application.yml | 6 +++ level/src/main/resources/bootstrap.yml | 6 +++ level/src/main/resources/config.properties | 1 + pom.xml | 1 + 8 files changed, 131 insertions(+) create mode 100644 level/pom.xml create mode 100644 level/src/main/java/hello/Greeting.java create mode 100644 level/src/main/java/hello/LevelController.java create mode 100644 level/src/main/java/hello/LevelMain.java create mode 100644 level/src/main/resources/application.yml create mode 100644 level/src/main/resources/bootstrap.yml create mode 100644 level/src/main/resources/config.properties diff --git a/level/pom.xml b/level/pom.xml new file mode 100644 index 0000000..295064c --- /dev/null +++ b/level/pom.xml @@ -0,0 +1,47 @@ + + + 4.0.0 + + + hm.binkley.labs + spring-actuator-demo + 0-SNAPSHOT + + + level + HateoasLevel + REST Nirvana + + + + org.projectlombok + lombok + ${lombok.version} + + + org.springframework.boot + spring-boot-starter-web + + + com.fasterxml.jackson.core + jackson-databind + + + org.springframework.plugin + spring-plugin-core + 1.1.0.RELEASE + + + com.jayway.jsonpath + json-path + 0.9.1 + + + org.springframework.hateoas + spring-hateoas + + + diff --git a/level/src/main/java/hello/Greeting.java b/level/src/main/java/hello/Greeting.java new file mode 100644 index 0000000..8a71247 --- /dev/null +++ b/level/src/main/java/hello/Greeting.java @@ -0,0 +1,17 @@ +package hello; + +import lombok.Data; + +@Data +public class Greeting { + private long id; + private String message; + + public Greeting() { + } + + public Greeting(final long id, final String message) { + this.id = id; + this.message = message; + } +} diff --git a/level/src/main/java/hello/LevelController.java b/level/src/main/java/hello/LevelController.java new file mode 100644 index 0000000..63128af --- /dev/null +++ b/level/src/main/java/hello/LevelController.java @@ -0,0 +1,42 @@ +package hello; + +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.Optional; +import java.util.concurrent.atomic.AtomicLong; + +import static java.lang.String.format; +import static org.springframework.http.HttpStatus.BAD_REQUEST; +import static org.springframework.web.bind.annotation.RequestMethod.GET; + +@RestController +public class LevelController { + private final AtomicLong counter = new AtomicLong(); + + @RequestMapping(value = "/remote-hello", method = GET) + public Greeting remoteHello( + @RequestParam("name") final Optional name) { + // TODO: How to do with with @Valid and ilk? + return new Greeting(counter.incrementAndGet(), + format("Hello, %s!", name. + filter(s -> !s.isEmpty()). + orElseThrow(LevelController::badName))); + } + + @ExceptionHandler + public void badArgs(final IllegalArgumentException e, + final HttpServletResponse response) + throws IOException { + response.sendError(BAD_REQUEST.value(), e.getMessage()); + } + + private static IllegalArgumentException badName() { + return new IllegalArgumentException( + "Required String parameter 'name' is missing or empty"); + } +} diff --git a/level/src/main/java/hello/LevelMain.java b/level/src/main/java/hello/LevelMain.java new file mode 100644 index 0000000..5f5eab8 --- /dev/null +++ b/level/src/main/java/hello/LevelMain.java @@ -0,0 +1,11 @@ +package hello; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class LevelMain { + public static void main(final String... args) { + SpringApplication.run(LevelMain.class, args); + } +} diff --git a/level/src/main/resources/application.yml b/level/src/main/resources/application.yml new file mode 100644 index 0000000..d3d2c15 --- /dev/null +++ b/level/src/main/resources/application.yml @@ -0,0 +1,6 @@ +info: + build: + artifact: @project.artifactId@ + name: @project.name@ + description: @project.description@ + version: @project.version@ diff --git a/level/src/main/resources/bootstrap.yml b/level/src/main/resources/bootstrap.yml new file mode 100644 index 0000000..46d050d --- /dev/null +++ b/level/src/main/resources/bootstrap.yml @@ -0,0 +1,6 @@ +server: + port: 8082 + +spring: + application: + name: level diff --git a/level/src/main/resources/config.properties b/level/src/main/resources/config.properties new file mode 100644 index 0000000..3954f2c --- /dev/null +++ b/level/src/main/resources/config.properties @@ -0,0 +1 @@ +# Quiet Netflix - No URLs will be polled as dynamic configuration sources. diff --git a/pom.xml b/pom.xml index 1dc4f80..9b16012 100644 --- a/pom.xml +++ b/pom.xml @@ -14,6 +14,7 @@ config-server eureka-server remote + level local From 10567dac24f18d6910bcca0e23131cd3bcbbdae5 Mon Sep 17 00:00:00 2001 From: Brian Oxley Date: Sat, 25 Apr 2015 08:44:53 -0500 Subject: [PATCH 2/5] Level runs; why does it need security? --- level/pom.xml | 4 -- level/src/main/java/hello/Greeting.java | 13 +++-- .../src/main/java/hello/LevelController.java | 48 +++++++------------ level/src/main/resources/application.yml | 3 ++ level/src/main/resources/bootstrap.yml | 3 -- 5 files changed, 29 insertions(+), 42 deletions(-) diff --git a/level/pom.xml b/level/pom.xml index 295064c..fb026e0 100644 --- a/level/pom.xml +++ b/level/pom.xml @@ -21,10 +21,6 @@ lombok ${lombok.version} - - org.springframework.boot - spring-boot-starter-web - com.fasterxml.jackson.core jackson-databind diff --git a/level/src/main/java/hello/Greeting.java b/level/src/main/java/hello/Greeting.java index 8a71247..cf51dfc 100644 --- a/level/src/main/java/hello/Greeting.java +++ b/level/src/main/java/hello/Greeting.java @@ -1,17 +1,22 @@ package hello; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.hateoas.ResourceSupport; @Data -public class Greeting { - private long id; +@EqualsAndHashCode(callSuper = false) +public class Greeting + extends ResourceSupport { private String message; public Greeting() { } - public Greeting(final long id, final String message) { - this.id = id; + @JsonCreator + public Greeting(@JsonProperty("content") final String message) { this.message = message; } } diff --git a/level/src/main/java/hello/LevelController.java b/level/src/main/java/hello/LevelController.java index 63128af..2b57125 100644 --- a/level/src/main/java/hello/LevelController.java +++ b/level/src/main/java/hello/LevelController.java @@ -1,42 +1,28 @@ package hello; -import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.http.HttpEntity; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; -import java.util.Optional; -import java.util.concurrent.atomic.AtomicLong; +import org.springframework.web.bind.annotation.ResponseBody; import static java.lang.String.format; -import static org.springframework.http.HttpStatus.BAD_REQUEST; +import static org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo; +import static org.springframework.hateoas.mvc.ControllerLinkBuilder.methodOn; +import static org.springframework.http.HttpStatus.OK; import static org.springframework.web.bind.annotation.RequestMethod.GET; -@RestController +@Controller public class LevelController { - private final AtomicLong counter = new AtomicLong(); - - @RequestMapping(value = "/remote-hello", method = GET) - public Greeting remoteHello( - @RequestParam("name") final Optional name) { - // TODO: How to do with with @Valid and ilk? - return new Greeting(counter.incrementAndGet(), - format("Hello, %s!", name. - filter(s -> !s.isEmpty()). - orElseThrow(LevelController::badName))); - } - - @ExceptionHandler - public void badArgs(final IllegalArgumentException e, - final HttpServletResponse response) - throws IOException { - response.sendError(BAD_REQUEST.value(), e.getMessage()); - } - - private static IllegalArgumentException badName() { - return new IllegalArgumentException( - "Required String parameter 'name' is missing or empty"); + @RequestMapping(value = "/greeting", method = GET) + @ResponseBody + public HttpEntity greet( + @RequestParam(value = "name", required = false, + defaultValue = "World") final String name) { + final Greeting greeting = new Greeting(format("Hello, %s!", name)); + greeting.add(linkTo(methodOn(LevelController.class).greet(name)). + withSelfRel()); + return new ResponseEntity<>(greeting, OK); } } diff --git a/level/src/main/resources/application.yml b/level/src/main/resources/application.yml index d3d2c15..247e140 100644 --- a/level/src/main/resources/application.yml +++ b/level/src/main/resources/application.yml @@ -4,3 +4,6 @@ info: name: @project.name@ description: @project.description@ version: @project.version@ + +server: + port: 8082 diff --git a/level/src/main/resources/bootstrap.yml b/level/src/main/resources/bootstrap.yml index 46d050d..4a322b8 100644 --- a/level/src/main/resources/bootstrap.yml +++ b/level/src/main/resources/bootstrap.yml @@ -1,6 +1,3 @@ -server: - port: 8082 - spring: application: name: level From 8ff53c27daddcd1feec3814f92ce9b4b54ca4396 Mon Sep 17 00:00:00 2001 From: Brian Oxley Date: Sat, 25 Apr 2015 08:51:20 -0500 Subject: [PATCH 3/5] Explicitly config uri. --- eureka-server/src/main/resources/bootstrap.yml | 3 +++ local/src/main/resources/bootstrap.yml | 3 +++ remote/src/main/resources/bootstrap.yml | 3 +++ 3 files changed, 9 insertions(+) diff --git a/eureka-server/src/main/resources/bootstrap.yml b/eureka-server/src/main/resources/bootstrap.yml index c06b156..11d51f2 100644 --- a/eureka-server/src/main/resources/bootstrap.yml +++ b/eureka-server/src/main/resources/bootstrap.yml @@ -20,3 +20,6 @@ server: spring: application: name: eureka + cloud: + config: + uri: http://localhost:8888 diff --git a/local/src/main/resources/bootstrap.yml b/local/src/main/resources/bootstrap.yml index ebb4f87..0765486 100644 --- a/local/src/main/resources/bootstrap.yml +++ b/local/src/main/resources/bootstrap.yml @@ -4,3 +4,6 @@ server: spring: application: name: hello-world + cloud: + config: + uri: http://localhost:8888 diff --git a/remote/src/main/resources/bootstrap.yml b/remote/src/main/resources/bootstrap.yml index 0fe47ef..47f1918 100644 --- a/remote/src/main/resources/bootstrap.yml +++ b/remote/src/main/resources/bootstrap.yml @@ -4,3 +4,6 @@ server: spring: application: name: remote-hello + cloud: + config: + uri: http://localhost:8888 From 28eb96013febca8b2d38079d7454f1e0360764ee Mon Sep 17 00:00:00 2001 From: Brian Oxley Date: Sat, 25 Apr 2015 09:04:26 -0500 Subject: [PATCH 4/5] Explicitly config uri. --- level/src/main/resources/bootstrap.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/level/src/main/resources/bootstrap.yml b/level/src/main/resources/bootstrap.yml index 4a322b8..a6c6532 100644 --- a/level/src/main/resources/bootstrap.yml +++ b/level/src/main/resources/bootstrap.yml @@ -1,3 +1,6 @@ spring: application: name: level + cloud: + config: + uri: http://localhost:8888 From fca22141faf710e215dd9feaf1047c8db8fdaa72 Mon Sep 17 00:00:00 2001 From: Brian Oxley Date: Sat, 25 Apr 2015 09:21:02 -0500 Subject: [PATCH 5/5] Hateoas example runs. --- level/pom.xml | 16 ++++++++++++++++ level/src/main/java/hello/LevelMain.java | 2 ++ 2 files changed, 18 insertions(+) diff --git a/level/pom.xml b/level/pom.xml index fb026e0..ab0db71 100644 --- a/level/pom.xml +++ b/level/pom.xml @@ -15,7 +15,23 @@ HateoasLevel REST Nirvana + + + + org.springframework.cloud + spring-cloud-starter-parent + ${spring-cloud.version} + pom + import + + + + + + org.springframework.cloud + spring-cloud-starter-eureka + org.projectlombok lombok diff --git a/level/src/main/java/hello/LevelMain.java b/level/src/main/java/hello/LevelMain.java index 5f5eab8..c0ac659 100644 --- a/level/src/main/java/hello/LevelMain.java +++ b/level/src/main/java/hello/LevelMain.java @@ -2,7 +2,9 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.netflix.eureka.EnableEurekaClient; +@EnableEurekaClient @SpringBootApplication public class LevelMain { public static void main(final String... args) {