this article is copied from いますぐ採用すべきJavaフレームワークDropWizard(その3) - Qiita
maven
edit pom.xml:
% git diff
diff --git a/pom.xml b/pom.xml
index d4b67a8..4bfd736 100644
--- a/pom.xml
+++ b/pom.xml
@@ -27,6 +27,11 @@
<artifactId>dropwizard-core</artifactId>
<version>${dropwizard.version}</version>
</dependency>
+ <dependency>
+ <groupId>io.dropwizard</groupId>
+ <artifactId>dropwizard-hibernate</artifactId>
+ <version>${dropwizard.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>io.dropwizard</groupId>
+ <artifactId>dropwizard-migrations</artifactId>
+ <version>${dropwizard.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>com.h2database</groupId>
+ <artifactId>h2</artifactId>
+ <version>1.4.182</version>
+ </dependency>
</dependencies>
<build>
% git add pom.xml % git commit -m 'add dependency dropwizard-hibernate'
Entitiy
create src/main/java/com/example/helloworld/core/Person.java:
package com.example.helloworld.core;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import java.util.Objects;
@Entity
@Table(name = "people")
@NamedQueries({
@NamedQuery(
name = "com.example.helloworld.core.Person.findAll",
query = "SELECT p FROM Person p"
)
})
public class Person {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@Column(name = "fullName", nullable = false)
private String fullName;
@Column(name = "jobTitle", nullable = false)
private String jobTitle;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getFullName() {
return fullName;
}
public void setFullName(String fullName) {
this.fullName = fullName;
}
public String getJobTitle() {
return jobTitle;
}
public void setJobTitle(String jobTitle) {
this.jobTitle = jobTitle;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Person)) return false;
final Person that = (Person) o;
return Objects.equals(this.id, that.id) &&
Objects.equals(this.fullName, that.fullName) &&
Objects.equals(this.jobTitle, that.jobTitle);
}
@Override
public int hashCode() {
return Objects.hash(id, fullName, jobTitle);
}
}
% git add src/main/java/com/example/helloworld/core/Person.java % git commit -m 'add Person entity'
DAO
create src/main/java/com/example/helloworld/db/PersonDAO.java:
package com.example.helloworld.db;
import com.example.helloworld.core.Person;
import com.google.common.base.Optional;
import io.dropwizard.hibernate.AbstractDAO;
import org.hibernate.SessionFactory;
import java.util.List;
public class PersonDAO extends AbstractDAO<Person> {
public PersonDAO(SessionFactory factory) {
super(factory);
}
public Optional<Person> findById(Long id) {
return Optional.fromNullable(get(id));
}
public Person create(Person person) {
return persist(person);
}
public List<Person> findAll() {
return list(namedQuery("com.example.helloworld.core.Person.findAll"));
}
}
% git add src/main/java/com/example/helloworld/db/PersonDAO.java % git commit -m 'add PersonDAO'
PeopleResource
create src/main/java/com/example/helloworld/resources/PeopleResource.java:
package com.example.helloworld.resources;
import com.example.helloworld.core.Person;
import com.example.helloworld.db.PersonDAO;
import io.dropwizard.hibernate.UnitOfWork;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import java.util.List;
@Path("/people")
@Produces(MediaType.APPLICATION_JSON)
public class PeopleResource {
private final PersonDAO peopleDAO;
public PeopleResource(PersonDAO peopleDAO) {
this.peopleDAO = peopleDAO;
}
@POST
@UnitOfWork
public Person createPerson(Person person) {
return peopleDAO.create(person);
}
@GET
@UnitOfWork
public List<Person> listPeople() {
return peopleDAO.findAll();
}
}
% git add src/main/java/com/example/helloworld/resources/PeopleResource.java % git commit -m 'add PeopleResource'
DB
edit myapp.yml
diff --git a/myapp.yml b/myapp.yml index 89c931f..436e549 100644 --- a/myapp.yml +++ b/myapp.yml @@ -1,2 +1,24 @@ template: Hello, %s! defaultName: Stranger +database: + driverClass: org.h2.Driver + + user: sa + + password: sa + + url: jdbc:h2:~/target/example + + properties: + charSet: UTF-8 + hibernate.dialect: org.hibernate.dialect.H2Dialect + + maxWaitForConnection: 1s + + validationQuery: "/* MyApplication Health Check */ SELECT 1" + + minSize: 8 + + maxSize: 32 + + checkConnectionWhileIdle: false
% git add myapp.yml % git commit -m 'add db configuration'
create schema
create src/main/resources/migrations.xml:
<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd">
<changeSet id="1" author="">
<createTable tableName="people">
<column name="id" type="bigint" autoIncrement="true">
<constraints primaryKey="true" nullable="false" />
</column>
<column name="fullName" type="varchar(255)">
<constraints nullable="false" />
</column>
<column name="jobTitle" type="varchar(255)" />
</createTable>
</changeSet>
</databaseChangeLog>
% git add src/main/resources/migrations.xml % git commit -m 'add schema'
edit src/main/java/com/example/helloworld/HelloWorldConfiguration.java:
diff --git a/src/main/java/com/example/helloworld/HelloWorldConfiguration.java b/src/main/java/com/example/helloworld/HelloWorldConfiguration.java
index ef46722..b84cfe1 100644
--- a/src/main/java/com/example/helloworld/HelloWorldConfiguration.java
+++ b/src/main/java/com/example/helloworld/HelloWorldConfiguration.java
@@ -1,9 +1,14 @@
package com.example.helloworld;
import io.dropwizard.Configuration;
+import io.dropwizard.db.DataSourceFactory;
+
import com.fasterxml.jackson.annotation.JsonProperty;
import org.hibernate.validator.constraints.NotEmpty;
+import javax.validation.Valid;
+import javax.validation.constraints.NotNull;
+
public class HelloWorldConfiguration extends Configuration {
@NotEmpty
private String template;
@@ -11,6 +16,10 @@ public class HelloWorldConfiguration extends Configuration {
@NotEmpty
private String defaultName = "Stranger";
+ @Valid
+ @NotNull
+ private DataSourceFactory database = new DataSourceFactory();
+
@JsonProperty
public String getTemplate() {
return template;
@@ -30,4 +39,14 @@ public class HelloWorldConfiguration extends Configuration {
public void setDefaultName(String name) {
this.defaultName = name;
}
+
+ @JsonProperty("database")
+ public DataSourceFactory getDataSourceFactory() {
+ return database;
+ }
+
+ @JsonProperty("database")
+ public void setDataSourceFactory(DataSourceFactory dataSourceFactory) {
+ this.database = dataSourceFactory;
+ }
}
% git add src/main/java/com/example/helloworld/HelloWorldConfiguration.java % git commit -m 'add database configuration'
edit src/main/java/com/example/helloworld/HelloWorldApplication.java:
diff --git a/src/main/java/com/example/helloworld/HelloWorldApplication.java b/src/main/java/com/example/helloworld/HelloWorldApplication.java
index 9afca10..bc68d91 100644
--- a/src/main/java/com/example/helloworld/HelloWorldApplication.java
+++ b/src/main/java/com/example/helloworld/HelloWorldApplication.java
@@ -1,16 +1,32 @@
package com.example.helloworld;
import io.dropwizard.Application;
+import io.dropwizard.hibernate.HibernateBundle;
+import io.dropwizard.db.DataSourceFactory;
+import io.dropwizard.migrations.MigrationsBundle;
import io.dropwizard.setup.Bootstrap;
import io.dropwizard.setup.Environment;
-import com.example.helloworld.resources.HelloWorldResource;
+
+import com.example.helloworld.core.Person;
+import com.example.helloworld.db.PersonDAO;
import com.example.helloworld.health.TemplateHealthCheck;
+import com.example.helloworld.resources.HelloWorldResource;
+import com.example.helloworld.resources.PeopleResource;
+
public class HelloWorldApplication extends Application<HelloWorldConfiguration> {
+
public static void main(String[] args) throws Exception {
new HelloWorldApplication().run(args);
}
+ public HibernateBundle<HelloWorldConfiguration> hibernateBundle = new HibernateBundle<HelloWorldConfiguration>(Person.class) {
+ @Override
+ public DataSourceFactory getDataSourceFactory(HelloWorldConfiguration configuration) {
+ return configuration.getDataSourceFactory();
+ }
+ };
+
@Override
public String getName() {
return "hello-world";
@@ -18,17 +34,25 @@ public class HelloWorldApplication extends Application<HelloWorldConfiguration>
@Override
public void initialize(Bootstrap<HelloWorldConfiguration> bootstrap) {
- // nothing to do yet
+ bootstrap.addBundle(hibernateBundle);
+ bootstrap.addBundle(new MigrationsBundle<HelloWorldConfiguration>() {
+ @Override
+ public DataSourceFactory getDataSourceFactory(HelloWorldConfiguration configuration) {
+ return configuration.getDataSourceFactory();
+ }
+ });
}
@Override
public void run(HelloWorldConfiguration configuration,
Environment environment) {
- // nothing to do yet
final HelloWorldResource resource = new HelloWorldResource(
configuration.getTemplate(),
configuration.getDefaultName()
);
+ final PersonDAO dao = new PersonDAO(hibernateBundle.getSessionFactory());
+ environment.jersey().register(new PeopleResource(dao));
+
final TemplateHealthCheck healthCheck =
new TemplateHealthCheck(configuration.getTemplate());
environment.healthChecks().register("template", healthCheck);
% git add src/main/java/com/example/helloworld/HelloWorldApplication.java % git commit -m 'add HibernateBundle, MigrationsBundle'
% mvn package % java -jar target/myapp-1.0-SNAPSHOT.jar db migrate myapp.yml
Run
% java -jar target/myapp-1.0-SNAPSHOT.jar server myapp.yml
POST
% curl -H "Content-Type: application/json" -X POST -d '{"fullName":"Coda Hale", "jobTitle" : "Chief Wizard" }' http://localhost:8080/people
{"id":1,"fullName":"Coda Hale","jobTitle":"Chief Wizard"}
% curl -H "Content-Type: application/json" -X POST -d '{"fullName":"ko2ic", "jobTitle" : "hoge" }' http://localhost:8080/people
{"id":2,"fullName":"ko2ic","jobTitle":"hoge"}
GET
% curl http://localhost:8080/people
[{"id":1,"fullName":"Coda Hale","jobTitle":"Chief Wizard"},{"id":2,"fullName":"ko2ic","jobTitle":"hoge"}]