Java で JSON 戻しサンプル (GET)

Jersey および Jackson ベースによるシンプルサンプル。

import java.net.URI;
import javax.ws.rs.DefaultValue;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
import javax.ws.rs.core.UriBuilder;
import org.glassfish.jersey.jdkhttp.JdkHttpServerFactory;
import org.glassfish.jersey.server.ResourceConfig;
import com.fasterxml.jackson.databind.ObjectMapper;

public class Main {
	public static void main(final String[] args) {
		final URI uri = UriBuilder.fromUri("http://localhost/").port(8080).build();
		final ResourceConfig config = new ResourceConfig();
		config.register(Hello.class);
		JdkHttpServerFactory.createHttpServer(uri, config);

		for (;;) {
			System.out.print('.');
			try {
				Thread.sleep(10000);
			} catch (InterruptedException e) {
			}
		}
	}

	@Path("/")
	public static class Hello {
		// http://localhost:8080/person?name=Taro&age=54
		@Path("person")
		@GET
		@Produces(MediaType.APPLICATION_JSON)
		public Response person(@QueryParam("name") @DefaultValue("TaroYamada") String name,
				@QueryParam("age") @DefaultValue("17") int age) {
			Person person = new Person();
			{
				person.age = age;
				person.name = name;

				Job job = new Job();
				job.title = "leader";
				person.jobs.add(job);
			}

			try {
				return Response.ok(new ObjectMapper().writeValueAsString(person), MediaType.APPLICATION_JSON).build();
			} catch (Exception ex) {
				ex.printStackTrace();
			} catch (Error ex) {
				ex.printStackTrace();
			}

			return Response.status(Status.BAD_REQUEST).build();
		}
	}
}

色々調べてみましたが、結局のところは自力で Response をハンドリングするのが最も安全で応用力も高いことがわかりました。