Tips

Apache Commons Javaプログラム演習問題 第11回

Apache Commons Javaプログラム演習問題 第11回

Apache Commons を利用した Java でのプログラム作成問題の11回目となります。

環境を構築していない場合は、概要を読み、環境を構築してから実施してください。

※この出題形式に関しては答えは1つではありません。
解答例はできるだけ複数載せるつもりですが、問題文の要件を満たしていれば正解として下さい。

問題

jp.pjin.tech.commons.domain.BloodType.java

package jp.pjin.tech.commons.domain;

public enum BloodType {
	A, B, O, AB
}

jp.pjin.tech.commons.domain.User.java

package jp.pjin.tech.commons.domain;

import java.io.Serializable;
import java.lang.reflect.InvocationTargetException;
import java.time.LocalDate;

import org.apache.commons.beanutils.BeanUtils;

import lombok.Data;

@Data
public class User implements Serializable {

	private int id;
	private String name;
	private BloodType type;
	private LocalDate birthday;
	private String mail;
	private String phone;

	@Override
	public User clone() throws CloneNotSupportedException {
		try {
			return (User) BeanUtils.cloneBean(this);
		} catch (IllegalAccessException | InstantiationException | InvocationTargetException
				| NoSuchMethodException e) {
			e.printStackTrace();
		}
		return null;
	}
}

jp.pjin.tech.commons.Practice011.java

package jp.pjin.tech.commons;

import java.time.LocalDate;
import java.util.HashMap;
import java.util.Map;

import jp.pjin.tech.commons.domain.BloodType;
import jp.pjin.tech.commons.domain.User;

public class Practice011 {
	public static void main(String[] args) throws Exception {
		Map<String, String> user = new HashMap<>();
		user.put("id", "123");
		user.put("name", "大高弘明");
		user.put("type", "B");
		user.put("birthday", "2000-12-10");
		user.put("mail", "hiroaki.ootaka@ssie.jp");
		user.put("phone", "000-9999-8888");

		User ootaka = new User();
		ootaka.setId(Integer.parseInt(user.get("id")));
		ootaka.setName(user.get("user"));
		ootaka.setType(BloodType.valueOf(user.get("type")));
		ootaka.setBirthday(LocalDate.parse(user.get("birthday")));
		ootaka.setMail(user.get("mail"));
		ootaka.setPhone(user.get("phone"));

		System.out.println(ootaka);

	}
}

前回 と同様な問題になりますが、こちらのほうが多いパターンです。
全ての値が文字列になっています。

この代入部分をcommonsを利用して、簡略化してください。

解答例1

jp.pjin.tech.commons.converter.BloodTypeConverter.java

[java] package jp.pjin.tech.commons.converter;

import org.apache.commons.beanutils.Converter;

import jp.pjin.tech.commons.domain.BloodType;

public final class BloodTypeConverter implements Converter {

@Override
public <T> T convert(Class<T> type, Object value) {
if (value == null) {
return ((T) null);
} else {
if (value instanceof String) {
return (T) BloodType.valueOf((String) value);
}
return (T) value;
}
}

}
[/java]

jp.pjin.tech.commons.converter.LocalDateConverter.java

[java] package jp.pjin.tech.commons.converter;

import java.time.LocalDate;

import org.apache.commons.beanutils.Converter;

public final class LocalDateConverter implements Converter {

@Override
public <T> T convert(Class<T> type, Object value) {
if (value == null) {
return ((T) null);
} else {
if (value instanceof String) {
return (T) LocalDate.parse((String) value);
}
return (T) value;
}
}

}
[/java]

jp.pjin.tech.commons.Practice011.java

[java] package jp.pjin.tech.commons;

import java.time.LocalDate;
import java.util.HashMap;
import java.util.Map;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.ConvertUtils;

import jp.pjin.tech.commons.converter.BloodTypeConverter;
import jp.pjin.tech.commons.converter.LocalDateConverter;
import jp.pjin.tech.commons.domain.BloodType;
import jp.pjin.tech.commons.domain.User;

public class Practice011 {
public static void main(String[] args) throws Exception {

ConvertUtils.register(new LocalDateConverter(), LocalDate.class);
ConvertUtils.register(new BloodTypeConverter(), BloodType.class);

Map<String, String> user = new HashMap<>();
user.put("id", "123");
user.put("name", "大高弘明");
user.put("type", "B");
user.put("birthday", "2000-12-10");
user.put("mail", "hiroaki.ootaka@ssie.jp");
user.put("phone", "000-9999-8888");

User ootaka = new User();
BeanUtils.copyProperties(ootaka, user);

System.out.println(ootaka);

}
}
[/java]

BeanUtils#copyProperties をそのまま利用すると例外が発生してしまいます。
ここで重要なのは、Converterを作成することです。

データ型として、IntegerはStringから変換が可能です。
BloodType(列挙型)、LocalDate の場合は、変換が必要になります。

copyPropertiesを行う前に、ConvertUtils#registerで登録しておきます。

ちょっと難易度が高いですが、これを覚えておくと、色々な変換が可能です。
Webでは、画面から送信されるデータはStringですが、オブジェクト変換後、ORMのオブジェクトに変換など、とにかく変換することが多いですので、ここはしっかり使えるようになりましょう。

apache commons

Apache Commons Javaプログラム演習問題 第23回

Apache Commons を利用した Java でのプログラム作成問題の23回目となります。 環境を構築していない場合は、概要を読み、環境を構築してから実施してください。 ※この出題形式に関しては答えは1つではありません。 解答例はできるだけ複数載せるつもりですが、問題文の要件を満たしていれば正
apache commons

Apache Commons Javaプログラム演習問題 第22回

Apache Commons を利用した Java でのプログラム作成問題の22回目となります。 環境を構築していない場合は、概要を読み、環境を構築してから実施してください。 ※この出題形式に関しては答えは1つではありません。 解答例はできるだけ複数載せるつもりですが、問題文の要件を満たしていれば正
apache commons

Apache Commons Javaプログラム演習問題 第21回

Apache Commons を利用した Java でのプログラム作成問題の21回目となります。 環境を構築していない場合は、概要を読み、環境を構築してから実施してください。 ※この出題形式に関しては答えは1つではありません。 解答例はできるだけ複数載せるつもりですが、問題文の要件を満たしていれば正
apache commons

Apache Commons Javaプログラム演習問題 第20回

Apache Commons を利用した Java でのプログラム作成問題の20回目となります。 環境を構築していない場合は、概要を読み、環境を構築してから実施してください。 ※この出題形式に関しては答えは1つではありません。 解答例はできるだけ複数載せるつもりですが、問題文の要件を満たしていれば正
apache commons

Apache Commons Javaプログラム演習問題 第19回

Apache Commons を利用した Java でのプログラム作成問題の19回目となります。 環境を構築していない場合は、概要を読み、環境を構築してから実施してください。 DB環境の準備は、Apache Commons Javaプログラム演習問題 第16回をご覧ください。 ※この出題形式に関して
apache commons

Apache Commons Javaプログラム演習問題 第18回

Apache Commons を利用した Java でのプログラム作成問題の18回目となります。 環境を構築していない場合は、概要を読み、環境を構築してから実施してください。 DB環境の準備は、Apache Commons Javaプログラム演習問題 第16回をご覧ください。 ※この出題形式に関して
apache commons

Apache Commons Javaプログラム演習問題 第17回

Apache Commons を利用した Java でのプログラム作成問題の17回目となります。 環境を構築していない場合は、概要を読み、環境を構築してから実施してください。 DB環境の準備は、Apache Commons Javaプログラム演習問題 第16回をご覧ください。 ※この出題形式に関して
apache commons

Apache Commons Javaプログラム演習問題 第16回

Apache Commons を利用した Java でのプログラム作成問題の16回目となります。 環境を構築していない場合は、概要を読み、環境を構築してから実施してください。 ※この出題形式に関しては答えは1つではありません。 解答例はできるだけ複数載せるつもりですが、問題文の要件を満たしていれば正
apache commons

Apache Commons Javaプログラム演習問題 第12回

Apache Commons を利用した Java でのプログラム作成問題の12回目となります。 環境を構築していない場合は、概要を読み、環境を構築してから実施してください。 ※この出題形式に関しては答えは1つではありません。 解答例はできるだけ複数載せるつもりですが、問題文の要件を満たしていれば正
apache commons

Apache Commons Javaプログラム演習問題 第15回

Apache Commons を利用した Java でのプログラム作成問題の15回目となります。 環境を構築していない場合は、概要を読み、環境を構築してから実施してください。 ※この出題形式に関しては答えは1つではありません。 解答例はできるだけ複数載せるつもりですが、問題文の要件を満たしていれば正

新連載はじまりました!新Java基礎 連載リンク

はじめてのJAVA 連載

Recent News

Recent Tips

Tag Search