Hatena::Groupprogram

ひとり開発日記。 このページをアンテナに追加 RSSフィード

2019/01/20 (Sun)

Jacksonを使って、JSON文字列を、イミュータブルなクラスにデシリアライズしたい。

| Jacksonを使って、JSON文字列を、イミュータブルなクラスにデシリアライズしたい。 - ひとり開発日記。 を含むブックマーク はてなブックマーク - Jacksonを使って、JSON文字列を、イミュータブルなクラスにデシリアライズしたい。 - ひとり開発日記。

例えば、 以下のようなクラスがあります。

public class UserData {
    private final Long id;
    private final String email;
    private final String displayName;
    private final boolean admin;
    
    public UserData(Long id, String email, String displayName, boolean admin) {
        this.id = id;
        this.email = email;
        this.displayName = displayName;
        this.admin = admin;
    }

    // getter
}

で、JSON文字列を、JacksonのObjectMapperを使って、このクラスにデシリアライズしようとします。

    @Test
    public void testDeserialize() throws IOException {
        String json = "{\"id\":1,\"email\":\"test@example.com\",\"display_name\":\"test user no.1\",\"admin\":false}";
        ObjectMapper mapper = new ObjectMapper();
        UserData userData = mapper.readValue(json, UserData.class);
        System.out.print(userData);
    }

上記のような適当なテストケース書いて、確認しようとすると、例外が発生します。

com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `test.UserData` (no Creators, like default construct, exist): cannot deserialize from Object value (no delegate- or property-based Creator)

デフォルトコンストラクタ無いと、インスタンス作ることができないので、まぁ、仕方ないですね。

でも、それでもイミュータブルなクラスに変換したい時は、変換するクラスに、以下のようにアノテーションを与えてあげれば良い、とのこと。

public class UserData {
    private final Long id;
    private final String email;
    private final String displayName;
    private final boolean admin;
    
    @JsonCreator(mode = JsonCreator.Mode.PROPERTIES)
    public UserData(@JsonProperty("id") Long id, 
            @JsonProperty("email") String email, 
            @JsonProperty("display_name") String displayName, 
            @JsonProperty("admin") boolean admin) {
        this.id = id;
        this.email = email;
        this.displayName = displayName;
        this.admin = admin;
    }

    // getter
}

この後、先程のテストケースを実行すると、デシリアライズされている、と…。

トラックバック - http://program.g.hatena.ne.jp/halflite/20190120

2018/12/06 (Thu)

Powershell5.1をWindows7マシンにインストールした

|  Powershell5.1をWindows7マシンにインストールした - ひとり開発日記。 を含むブックマーク はてなブックマーク -  Powershell5.1をWindows7マシンにインストールした - ひとり開発日記。

この前、Windows7マシンを、まっさらな状態にした際に、Powershellも5.1にアップデートしました。

上記ページを開いて、.zipファイルをダウンロード*1、解凍後、中の*.msuファイルをダブルクリックしてインストール、再起動を促されるので、再起動後、Powershellで確認すればOK。

確認方法は、以下

  1. スタートボタンをクリック
  2. "プログラムとファイルの検索"欄に powershell と入力
  3. プログラムのサジェストが出るので、Powershellを選択
  4. 立ち上がったPowershellプロンプトに以下を入力
$PSVersionTable
Name                           Value
----                           -----
PSVersion                      5.1.14409.1018
PSEdition                      Desktop
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.14409.1018
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1

思ったより簡単でしたね。

*1:この場合、Windows7 64bit OSだったので "Win7AndW2K8R2-KB3191566-x64.ZIP"

トラックバック - http://program.g.hatena.ne.jp/halflite/20181206

2018/10/12 (Fri)

MavenでEclipseプロジェクトを更新した際に、ソースコードの文字コードをUTF-8にする

|  MavenでEclipseプロジェクトを更新した際に、ソースコードの文字コードをUTF-8にする - ひとり開発日記。 を含むブックマーク はてなブックマーク -  MavenでEclipseプロジェクトを更新した際に、ソースコードの文字コードをUTF-8にする - ひとり開発日記。

WindowsマシンでEclipse使っていると、いつの間にか、ソースの文字コードがMS932になっていて、イラッとしません?

Eclipseの設定から直しても、プロジェクトのクラスパス修正しようと、.settingsファイルを初期化したら、文字コード設定が、元に戻ってしまったりして…。

pom.xmlに以下のように記述します

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	</properties>

	<build>
		<plugins>
			<!-- Eclipse -->
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-eclipse-plugin</artifactId>
				<version>2.10</version>
				<configuration>
					<downloadSources>true</downloadSources>
					<downloadJavadocs>true</downloadJavadocs>
					<additionalConfig>
						<file>
							<name>.settings/org.eclipse.core.resources.prefs</name>
							<content>
<![CDATA[eclipse.preferences.version=1${line.separator}encoding/<project>=${project.build.sourceEncoding}${line.separator}]]>
							</content>
						</file>
					</additionalConfig>
				</configuration>
			</plugin>
		</plugins>
	</build>

で、Eclipse用の.settingsファイルを作り直すと、次からは、ソースコード文字コードは、UTF-8になっています。

mvn eclipse:clean eclipse:eclipse
トラックバック - http://program.g.hatena.ne.jp/halflite/20181012

2018/01/27 (Sat)

CentOS7.4にMySQL5.6をAnsibleでインストール

|  CentOS7.4にMySQL5.6をAnsibleでインストール - ひとり開発日記。 を含むブックマーク はてなブックマーク -  CentOS7.4にMySQL5.6をAnsibleでインストール - ひとり開発日記。

はいな、これ*12018年版です。

当然、あれから年月を経て、色々便利になっているのですよね。

  • CentOSは7がメインになった
  • Vagrantでup/reload時にプロビジョニング出来るようになった
  • MySQLは、5.6はほとんど枯れた存在になった*2

またひとり開発をやりたいな、って思った時、手持ちのWindows7機で、Vagrant/Virtualbox/CentOS7/MySQL5.6を使って、ローカル開発環境を作ろうかと思ったら、思いの外大変だったので、以下に記します。


環境

C:\workspace\vagrant>dir /b
my.cnf.j2
playbook.yml
Vagrantfile
  • Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|

  config.vm.define "server_db" do |node|
    node.vm.box = "centos/7"
    node.vm.network "private_network", ip:"192.168.33.12"
    node.vm.synced_folder ".", "/vagrant"
  end

  config.vm.provision "ansible_local" do |ansible|
    ansible.playbook = "playbook.yml"
  end

  config.vm.provider "virtualbox" do |v|
    v.gui = true
  end

end
  • playbook.yml
- hosts: all
  remote_user: vagrant
  become: yes
  vars:
    mysql_root_password: rootpassword1
    mysql_user_password: dbpassword1
    mysql_user_name: dbuser
    mysql_db: sampledb

  tasks:
    - name: yum update all
      yum: name=* state=latest

    - name: install MySQL-python/libselinux-python/yum-utils
      yum: name="{{ item }}" state=present
      with_items:
        - MySQL-python
        - libselinux-python
        - yum-utils

    - name: add MySQL Yum Repository
      yum:
        name: https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm
        state: present
   
    - name: disable mysql57-community
      command: yum-config-manager --disable mysql57-community

    - name: enable mysql56-community
      command: yum-config-manager --enable mysql56-community
 
    - name: install MySQL
      yum: name="{{ item }}" state=present
      with_items:
        - mysql-community-server
        - mysql-community-client
        - mysql-community-common
        - mysql-community-libs

    - name: /root/.my.cnf by template
      template: src=my.cnf.j2 dest=/root/.my.cnf owner=root group=root mode=0600

    - name: start MySQL service
      service: name=mysqld enabled=yes state=started

    - name: root password changed
      mysql_user: name=root password={{ mysql_root_password }} host_all=yes check_implicit_admin=yes

    - name: dbuser created
      mysql_user: name={{ mysql_user_name }} password={{ mysql_user_password }} host={{ item }} priv=*.*:ALL,GRANT state=present
      with_items:
        - localhost
        - '%'

    - name: create mysql database
      mysql_db: name={{ mysql_db }} state=present
  • my.conf.j2
[client]
user=root
password={{ mysql_root_password }}

以下、ハマりどころ

*1g:program:id:halflite:20151014:provisioning_mysql_server

*2:それ故に知見が貯まって、ハマりにくく、調べればすぐ解が見つかる

トラックバック - http://program.g.hatena.ne.jp/halflite/20180127

2017/09/18 (Mon)

Apache Commons Text 1.1

|  Apache Commons Text 1.1 - ひとり開発日記。 を含むブックマーク はてなブックマーク -  Apache Commons Text 1.1 - ひとり開発日記。

commons-lang3*1のバージョンを3.6に上げたら、幾つかのクラスが @deprecated になっていましたね。

ランダムに文字列を生成する機能だったり、プレースホルダーっぽい機能、文字列の差分表示を提供するクラス辺りは、私もよく使ってたりするのですが、そう言うのを、外に切り出したのでしょうね…。*2

Javadoc*3を見ると、結構面白そうな機能も多いので、ちょっとづつ触ってみたいですかねー。

トラックバック - http://program.g.hatena.ne.jp/halflite/20170918