in the mythosil

Rhythm & Biology.

WildFly: JBoss Forgeによるアプリケーション開発

環境

プロジェクト作成

Forge Consoleを開きます

  • Show View → Forge Console
  • 緑の▶ボタンを押して起動
    • Forge 2.7.2.Finalを起動 (1.4.4.Finalではない)

新規プロジェクトを作成します

  • プロジェクト名: forge-proj
  • パッケージ名: com.mythosil.forge
[workspace]$ project-new --named forge-proj --topLevelPackage com.mythosil.forge --type war
***SUCCESS*** Project named 'forge-proj' has been created.

[forge-proj]$ ls
pom.xml  src  target

forgeのプロンプトがディレクトリ名(=プロジェクト名)になっています

エンティティ作成

  • エンティティクラス名: Person
[forge-proj]$ jpa-new-entity --named Person
***SUCCESS*** Persistence (JPA) is installed.
***SUCCESS*** Entity com.mythosil.forge.model.Person created

[Person.java]$ ls

[fields]
id::java.lang.Long  version::int

[methods]
equals(java.lang.Object)::boolean
getId()::java.lang.Long
getVersion()::int
hashCode()::int
setId(java.lang.Long)::void
setVersion(int)::void
toString()::java.lang.String

jap-new-entityコマンドでは、エンティティクラスの作成だけでなく、persistence.xmlの作成やpom.xmlの修正(依存追加)を行ってくれます

Java EEのバージョンは6.0、JPAのバージョンは2.0で作成されます
(Java EE 7に変更したければ手作業で書き換えるしかない?)

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>org.jboss.spec</groupId>
      <artifactId>jboss-javaee-6.0</artifactId>
      <version>3.0.2.Final</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>
<dependencies>
  <dependency>
    <groupId>org.hibernate.javax.persistence</groupId>
    <artifactId>hibernate-jpa-2.0-api</artifactId>
    <scope>provided</scope>
  </dependency>
</dependencies>

データソースとしてはH2が利用されます

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
  <persistence-unit name="forge-proj-persistence-unit" transaction-type="JTA">
    <description>Forge Persistence Unit</description>
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <jta-data-source>java:jboss/datasources/ExampleDS</jta-data-source>
    <exclude-unlisted-classes>false</exclude-unlisted-classes>
    <properties>
      <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
      <property name="hibernate.show_sql" value="true"/>
      <property name="hibernate.format_sql" value="true"/>
      <property name="hibernate.transaction.flush_before_completion" value="true"/>
      <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
    </properties>
  </persistence-unit>
</persistence>

エンティティにフィールド追加

  • フィールド名: name
  • 型: String
  • 長さ: 50
[Person.java]$ jpa-new-field --named name --type String --length 50
***SUCCESS*** Field name created

RESTエンドポイント作成

Personエンティティを元に作成してみます

(Eclipse上で実行するとエラーが出る場合は、CLIで試してみて下さい)

[Person.java]$ rest-generate-endpoints-from-entities --targets com.mythosil.forge.model.Person
***SUCCESS*** JAX-RS has been installed.
***SUCCESS*** Endpoint created

この際、RESTエンドポイントクラス作成と同時に、Personクラスに@XmlRootElementアノテーションが付加されます
また、エンティティ作成時と同様、pom.xmlが自動で修正されます

<dependency>
  <groupId>org.jboss.spec.javax.servlet</groupId>
  <artifactId>jboss-servlet-api_3.0_spec</artifactId>
  <scope>provided</scope>
</dependency>
<dependency>
  <groupId>org.jboss.spec.javax.ws.rs</groupId>
  <artifactId>jboss-jaxrs-api_1.1_spec</artifactId>
  <scope>provided</scope>
</dependency>
<dependency>
  <groupId>org.jboss.spec.javax.ejb</groupId>
  <artifactId>jboss-ejb-api_3.1_spec</artifactId>
  <scope>provided</scope>
</dependency>

ビルド

[PersonEndpoint.java]$ build
***SUCCESS*** Build Success

デプロイ

jboss-cli.shを利用してデプロイします
(wildflyは事前に起動しておく)

$ cd /path/to/forge-proj
$ $JBOSS_HOME/bin/jboss-cli.sh -c --command="deploy target/forge-proj-1.0.0-SNAPSHOT.war"

実行

$ curl -XPOST 'http://localhost:8080/forge-proj-1.0.0-SNAPSHOT/rest/people' \
    -d '{"name":"my name"}' \
    -H "Content-Type: application/json"
$ curl 'http://localhost:8080/forge-proj-1.0.0-SNAPSHOT/rest/people/1'
{"id":1,"version":0,"name":"my name"}

まとめ

  • 開発のベースはforgeで作ると楽
  • Forge Consoleが遅い・不安定
    • 正直、まともに動かない
    • Eclipse上ではなくCLIであれば普通に動く

参考