EntityからDTOへのコピーなど、以下のようにできたら便利かも。
Bookエンティティ(entity)→BookDtoへコピーする時、こんな感じで
BookDto dto = BeanUtil.copyAs(BookDto.class, entity);
entitys は entity が入った List だとすると、こんな感じで
List<BookDto> dtos = BeanUtil.copyListAs(BookDto.class, entitys);
サックリ作ってみると
package etc9.util; import java.util.ArrayList; import java.util.List; import org.apache.commons.beanutils.PropertyUtils; public class BeanUtil { public static <T> T copyAs(Class<T> clazz, Object orig) { try { T dest = clazz.newInstance(); PropertyUtils.copyProperties(dest, orig); return dest; } catch(Exception e) { throw new RuntimeException(e); } } public static <T, V> List<T> copyListAs(Class<T> clazz, List<V> origs) { try { List<T> list = new ArrayList<T>(); for(V orig : origs) { list.add(BeanUtil.copyAs(clazz, orig)); } return list; } catch(Exception e) { throw new RuntimeException(e); } } }
テストケースは、
package etc9.util; import java.util.ArrayList; import java.util.List; import org.junit.Test; import etc9.domain.Book; import etc9.dto.BookDto; import static org.junit.Assert.*; public class BeanUtilTest { @Test public final void testCopyAs() { Book entity = new Book(); entity.setName("hoge"); BookDto dto = BeanUtil.copyAs(BookDto.class, entity); assertEquals("hoge", dto.getName()); } @Test public final void testCopyListAs() { Book entity1 = new Book(); entity1.setName("hoge1"); Book entity2 = new Book(); entity2.setName("hoge2"); List<Book> entitys = new ArrayList<Book>(); entitys.add(entity1); entitys.add(entity2); List<BookDto> dtos = BeanUtil.copyListAs(BookDto.class, entitys); assertEquals("hoge1", dtos.get(0).getName()); assertEquals("hoge2", dtos.get(1).getName()); } }
層をまたいだ情報のやり取りをDTOのみ許容する場合には使えるのか