
YAML定義からJavaオブジェクトを自動生成する
はじめに
今回はjs2pライブラリを使い、YAML定義からJavaオブジェクトを自動生成する一例をご紹介します。
※補足
今回ご紹介するライブラリは、jsonschema2pojo-gradle-pluginをベースに作成されております。
こちらのREADMEによると、jsonschema2pojo-gradle-pluginは、今後開発されることが無いようです。
そのため、代わりに今回ご紹介するjs2pライブラリの利用が推奨されています。
環境
- Windows 10
- Java 11.0.2
- Gradle 6.7
- js2p 1.0
前提
- Gradleプロジェクト作成済み
自動生成するJavaオブジェクトを定義したYAMLを作成する
src/main/resources配下にpojo-schema.yamlを作成します。
作成したpojo-schema.yamlの編集を行い、今回自動生成するJavaオブジェクトを定義します。
description: ルートオブジェクト
properties:
parentObject:
description: 親オブジェクト
type: object
properties:
parentId:
type: integer
parentName:
type: string
children:
type: array
items:
$ref: '#/definitions/childObject'
definitions:
childObject:
description: 子オブジェクト
type: object
properties:
childId:
type: integer
ChildName:
type: string
ライブラリの追加と自動生成に関する設定をする
以下のコメントを参考にbuild.gradleを編集して、Javaオブジェクトの自動生成に関する設定を行います。
plugins {
id 'java'
// 以下のライブラリを追加する
id 'com.github.eirnym.js2p' version '1.0'
}
version '1.0-SNAPSHOT'
group 'com.example'
repositories {
mavenCentral()
}
// 以下の自動生成に関する設定を追加する
jsonSchema2Pojo {
// Javaオブジェクトが定義されているYAMLのファイルパス
source = files("${projectDir}/src/main/resources/pojo-schema.yaml")
// 定義ファイルの種類(json, jsonschema, yamlのいすれか)
sourceType = 'yamlschema'
// 自動生成されたコードの出力先
targetDirectory = file("${projectDir}/src/main/java")
// 自動生成されたコードのパッケージ
targetPackage = "com.example.autogen.model"
// 自動生成されたオブジェクトに適用するメソッドを指定
generateBuilders = true
includeGetters = true
includeSetters = true
includeToString = true
includeHashcodeAndEquals = false
// プロパティを追加するMapの生成可否
includeAdditionalProperties = false
// 自動生成されたオブジェクトに適用するアノテーションを指定(jackson, gsonなど)
// 今回はアノテーションを付与しないように設定
annotationStyle = 'none'
}
Javaオブジェクトを自動生成する
プロジェクト直下に移動して、以下のコマンドを実行します。
gradlew generateJsonSchema2Pojo
自動生成されたJavaオブジェクトを確認する
build.gradleで指定した出力先に自動生成されたオブジェクトが配置されているのが確認できます。
自動生成されたオブジェクトには、YAMLで定義したオブジェクトのプロパティに加えてbuild.gradleで指定したメソッドも追加されていることが確認できます。メソッドについては、いずれもbuild.gradleで行う設定で追加有無の変更が可能です。
・PojoSchema.java
package com.example.autogen.model;
/**
* ルートオブジェクト
*
*/
public class PojoSchema {
/**
* 親オブジェクト
*
*/
private ParentObject parentObject;
/**
* 親オブジェクト
*
*/
public ParentObject getParentObject() {
return parentObject;
}
/**
* 親オブジェクト
*
*/
public void setParentObject(ParentObject parentObject) {
this.parentObject = parentObject;
}
public PojoSchema withParentObject(ParentObject parentObject) {
this.parentObject = parentObject;
return this;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append(PojoSchema.class.getName()).append('@').append(Integer.toHexString(System.identityHashCode(this))).append('[');
sb.append("parentObject");
sb.append('=');
sb.append(((this.parentObject == null)?"":this.parentObject));
sb.append(',');
if (sb.charAt((sb.length()- 1)) == ',') {
sb.setCharAt((sb.length()- 1), ']');
} else {
sb.append(']');
}
return sb.toString();
}
}
・ParentObject.java
package com.example.autogen.model;
import java.util.ArrayList;
import java.util.List;
/**
* 親オブジェクト
*
*/
public class ParentObject {
private Integer parentId;
private String parentName;
private List children = new ArrayList();
public Integer getParentId() {
return parentId;
}
public void setParentId(Integer parentId) {
this.parentId = parentId;
}
public ParentObject withParentId(Integer parentId) {
this.parentId = parentId;
return this;
}
public String getParentName() {
return parentName;
}
public void setParentName(String parentName) {
this.parentName = parentName;
}
public ParentObject withParentName(String parentName) {
this.parentName = parentName;
return this;
}
public List getChildren() {
return children;
}
public void setChildren(List children) {
this.children = children;
}
public ParentObject withChildren(List children) {
this.children = children;
return this;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append(ParentObject.class.getName()).append('@').append(Integer.toHexString(System.identityHashCode(this))).append('[');
sb.append("parentId");
sb.append('=');
sb.append(((this.parentId == null)?"":this.parentId));
sb.append(',');
sb.append("parentName");
sb.append('=');
sb.append(((this.parentName == null)?"":this.parentName));
sb.append(',');
sb.append("children");
sb.append('=');
sb.append(((this.children == null)?"":this.children));
sb.append(',');
if (sb.charAt((sb.length()- 1)) == ',') {
sb.setCharAt((sb.length()- 1), ']');
} else {
sb.append(']');
}
return sb.toString();
}
}
・ChildObject.java
package com.example.autogen.model;
/**
* 子オブジェクト
*
*/
public class ChildObject {
private Integer childId;
private String childName;
public Integer getChildId() {
return childId;
}
public void setChildId(Integer childId) {
this.childId = childId;
}
public ChildObject withChildId(Integer childId) {
this.childId = childId;
return this;
}
public String getChildName() {
return childName;
}
public void setChildName(String childName) {
this.childName = childName;
}
public ChildObject withChildName(String childName) {
this.childName = childName;
return this;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append(ChildObject.class.getName()).append('@').append(Integer.toHexString(System.identityHashCode(this))).append('[');
sb.append("childId");
sb.append('=');
sb.append(((this.childId == null)?"":this.childId));
sb.append(',');
sb.append("childName");
sb.append('=');
sb.append(((this.childName == null)?"":this.childName));
sb.append(',');
if (sb.charAt((sb.length()- 1)) == ',') {
sb.setCharAt((sb.length()- 1), ']');
} else {
sb.append(']');
}
return sb.toString();
}
}
まとめ
今回はシンプルなJavaオブジェクトを生成しましたが、設定でJSONデータとの対応付けや
BeanValidationを有効にすることができます。そのため、複雑なJSONを変換するための
オブジェクトを自動生成するのに重宝しそうです。
他にも様々な設定があるため、気になる方は以下をご参照ください。
jsonSchema2Pojoの設定一覧