読者です 読者をやめる 読者になる 読者になる

Beanのコピーを簡単に?

Java

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のみ許容する場合には使えるのか