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の設定一覧


--------------------------
システム開発のご要望・ご相談はこちらから

コメントを残す

メールアドレスが公開されることはありません。