Sample Java no-frameworks-other-than-servlets microservice.
Run it with
./gradlew build
java -cp build/libs/yourproject-all.jar com.thoughtworks.eg.AnyMicroService 8080
package com.thoughtworks.eg; | |
import java.io.IOException; | |
import javax.servlet.ServletException; | |
import javax.servlet.http.HttpServlet; | |
import javax.servlet.http.HttpServletRequest; | |
import javax.servlet.http.HttpServletResponse; | |
import org.eclipse.jetty.server.Server; | |
import org.eclipse.jetty.servlet.ServletContextHandler; | |
import org.eclipse.jetty.servlet.ServletHolder; | |
import com.google.gson.JsonObject; | |
import com.google.gson.JsonPrimitive; | |
public class AnyMicroService extends HttpServlet { | |
private static Server server; | |
@Override | |
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { | |
if (request.getRequestURI().startsWith("/hello")) { | |
response.setStatus(200); | |
response.setContentType("application/json"); | |
JsonObject json = new JsonObject(); | |
json.add("hello", new JsonPrimitive("world!")); | |
response.getWriter().write(json.toString()); | |
return; | |
} | |
response.setStatus(404); | |
} | |
public static void main(String[] args) throws Exception { | |
server = new Server(Integer.parseInt(args[0])); | |
ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS); | |
context.setContextPath("/"); | |
context.addServlet(new ServletHolder(new AnyMicroService()),"/*"); | |
server.setHandler(context); | |
server.start(); | |
} | |
public static void stop() throws Exception { | |
server.stop(); | |
server.join(); | |
} | |
} |
package com.thoughtworks.eg; | |
import static java.util.stream.Collectors.joining; | |
import static org.hamcrest.CoreMatchers.is; | |
import static org.hamcrest.CoreMatchers.startsWith; | |
import static org.junit.Assert.assertThat; | |
import java.io.BufferedReader; | |
import java.io.FileNotFoundException; | |
import java.io.InputStreamReader; | |
import java.net.HttpURLConnection; | |
import java.net.URL; | |
import org.junit.After; | |
import org.junit.Before; | |
import org.junit.Test; | |
public class AnyMicroServiceTest { | |
@Before | |
public void setUp() throws Exception { | |
AnyMicroService.main(new String[] {"9292"}); | |
} | |
@After | |
public void tearDown() throws Exception { | |
AnyMicroService.stop(); | |
} | |
@Test | |
public void hello() throws Exception { | |
URL url = new URL("http://127.0.0.1:9292/hello"); | |
HttpURLConnection connection = (HttpURLConnection) url.openConnection(); | |
String result = new BufferedReader(new InputStreamReader(connection.getInputStream())) | |
.lines().collect(joining("\n")); | |
assertThat(connection.getResponseCode(), is(200)); | |
assertThat(connection.getContentType(), startsWith("application/json")); | |
assertThat(result, is("{\"hello\":\"world!\"}")); | |
} | |
@Test(expected=FileNotFoundException.class) | |
public void notFound() throws Exception { | |
URL url = new URL("http://127.0.0.1:9292/something-else"); | |
HttpURLConnection connection = (HttpURLConnection) url.openConnection(); | |
connection.getInputStream(); | |
} | |
} |
apply plugin: 'java' | |
apply plugin: 'war' | |
sourceCompatibility = 1.8 | |
targetCompatibility = 1.8 | |
repositories { | |
mavenCentral() | |
} | |
dependencies { | |
compile "com.google.code.gson:gson:2.3.1" | |
compile 'org.eclipse.jetty:jetty-server:9.4.3.v20170317' | |
compile 'org.eclipse.jetty:jetty-webapp:9.4.3.v20170317' | |
providedCompile 'javax.servlet:servlet-api:2.5' | |
testCompile "junit:junit:4.12" | |
} | |
task fatJar(type: Jar) { | |
baseName = project.name + '-all' | |
from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } } | |
with jar | |
} | |
artifacts { | |
archives fatJar | |
} |