Java bean to map, vo to map, 객체를 Map으로 변환

2017. 9. 29. 13:53language/java


Java bean to map, vo to map, 객체를 Map으로 변환

 

 

bean 객체 즉 VO나 DTO 등을 Map으로 변환해야 하는 경우가 생겼다.

 

빈번하게 사용될 것으로 예상되어 모듈로 만들어 보았다.

 

만들다 보니 key에 대해서도 이슈가 있었다.

 

key를 대문자로 할것인지 또는 어떤 case를 활용할 것인지 등등...

 

어떻게 쓰일지 몰라서 예상되는 몇가지는 고려해 두었다.

 

최종 완정된 소스는 Map의 Key 를 필드명 그대로 사용하거나, 대문자, 언더바를 제거한 후 camelCase, 특정 접두어를 제거하기 등이 고려되어 있다.

 



 

간단히 핵심소스를 살펴보고 맨 아래에 전체 소스를 작성해 둘것이다..

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
    private static void putValues(Object bean, Map<String, Object> map, String prefixOverrides, boolean keyUpperCase, boolean camelCase) {
 
        Class<?> cls = bean.getClass();
 
        for (Field field : cls.getDeclaredFields()) {
            field.setAccessible(true);
 
            Object value = null;
            String key;
 
            try {
                value = field.get(bean);
            } catch (IllegalArgumentException e) {
                System.out.println("Exception position : CollectionsUtil - putValues(Object bean, Map<String, Object> map, String prefix)");
            } catch (IllegalAccessException e) {
                System.out.println("Exception position : CollectionsUtil - putValues(Object bean, Map<String, Object> map, String prefix)");
            }
 
            // 선행문자 제거
            if (prefixOverrides == null) {
                key = field.getName();
            } else {
                key = field.getName().replaceFirst(prefixOverrides, "");
            }
 
            // key 대문자로 변경
            if (keyUpperCase) {
                key = key.toUpperCase();
            }
 
            // key camelCase로 변경
            if (camelCase) {
                StringBuffer buffer = new StringBuffer();
                for (String token : key.toLowerCase().split("_")) {
                    buffer.append(StringUtils.capitalize(token));
                }
                key = StringUtils.uncapitalize(buffer.toString());
            }
 
            if (isValue(value)) {
                map.put(key, value);
            } else if (value instanceof BigDecimal) {
                map.put(key, value);
            } else {
                putValues(value, map, key, keyUpperCase, camelCase);
            }
        }
    }
cs

3# : bean객체의 class를 꺼냄
5# : getDeclaredFields() 함수를 이용하여 private field에 접근하여 field를 꺼내어 반복문을 실행
6# : private field에 접근할 때 setAccessible(true)를 호출하지 않는다면 IllegalAccessException 이 발생함
12# : field의 값을 꺼냄
20# ~ 24# : key에서 제거할 선행문자가 있다면 제거함
27# ~ 29# : key를 대문자로 변경해야 한다면 변경함
32# ~ 38# : key를 camelCase로 변경해야 한다면 변경함
40# ~ 46# : 미리 정의한 타입과 일치하거나 BigDecimal 타입일 경우 map에 값을 담고 그렇지 않다면 재귀호출함 (isValue 함수는 전체 소스에 있음)

 



전체소스

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
public class CollectionsUtil {
 
    /**
     * bean to map 함수
     *
     * @param bean
     * @return
     */
    public static Map<String, Object> beanToMap(Object bean) {
        Map<String, Object> map = new HashMap<String, Object>();
 
        putValues(bean, map, nullfalsefalse);
 
        return map;
    }
 
    /**
     * bean to map 함수
     *
     * @param bean
     * @param prefixOverrides 제거할 prefix 문자열 (ex. sch_)
     * @return
     */
    public static Map<String, Object> beanToMap(Object bean, String prefixOverrides) {
        Map<String, Object> map = new HashMap<String, Object>();
 
        putValues(bean, map, prefixOverrides, falsefalse);
 
        return map;
    }
 
    /**
     * bean to map 함수 (key : 대문자)
     *
     * @param bean
     * @return
     */
    public static Map<String, Object> beanToMapKeyUpperCase(Object bean) {
        Map<String, Object> map = new HashMap<String, Object>();
 
        putValues(bean, map, nulltruefalse);
 
        return map;
    }
 
    /**
     * bean to map 함수 (key : 대문자)
     *
     * @param bean
     * @param prefixOverrides 제거할 prefix 문자열 (ex. sch_)
     * @return
     */
    public static Map<String, Object> beanToMapKeyUpperCase(Object bean, String prefixOverrides) {
        Map<String, Object> map = new HashMap<String, Object>();
 
        putValues(bean, map, prefixOverrides, truefalse);
 
        return map;
    }
 
    /**
     * bean to map 함수 (key : camelCase)
     *
     * @param bean
     * @return
     */
    public static Map<String, Object> beanToMapKeyCamelCase(Object bean) {
        Map<String, Object> map = new HashMap<String, Object>();
 
        putValues(bean, map, nullfalsetrue);
 
        return map;
    }
 
    /**
     * bean to map 함수 (key : camelCase)
     *
     * @param bean
     * @param prefixOverrides 제거할 prefix 문자열 (ex. sch_)
     * @return
     */
    public static Map<String, Object> beanToMapKeyCamelCase(Object bean, String prefixOverrides) {
        Map<String, Object> map = new HashMap<String, Object>();
 
        putValues(bean, map, prefixOverrides, falsetrue);
 
        return map;
    }
 
    /**
     * Map에 값 셋팅
     *
     * @param bean
     * @param map
     * @param prefixOverrides  제거할 prefix 문자열 (ex. sch_)
     * @param keyUpperCase
     * @param camelCase
     * @return
     */
    private static void putValues(Object bean, Map<String, Object> map, String prefixOverrides, boolean keyUpperCase, boolean camelCase) {
 
        Class<?> cls = bean.getClass();
 
        for (Field field : cls.getDeclaredFields()) {
            field.setAccessible(true);
 
            Object value = null;
            String key;
 
            try {
                value = field.get(bean);
            } catch (IllegalArgumentException e) {
                System.out.println("Exception position : CollectionsUtil - putValues(Object bean, Map<String, Object> map, String prefix)");
            } catch (IllegalAccessException e) {
                System.out.println("Exception position : CollectionsUtil - putValues(Object bean, Map<String, Object> map, String prefix)");
            }
 
            // 선행문자 제거
            if (prefixOverrides == null) {
                key = field.getName();
            } else {
                key = field.getName().replaceFirst(prefixOverrides, "");
            }
 
            // key 대문자로 변경
            if (keyUpperCase) {
                key = key.toUpperCase();
            }
 
            // key camelCase로 변경
            if (camelCase) {
                StringBuffer buffer = new StringBuffer();
                for (String token : key.toLowerCase().split("_")) {
                    buffer.append(StringUtils.capitalize(token));
                }
                key = StringUtils.uncapitalize(buffer.toString());
            }
 
            if (isValue(value)) {
                map.put(key, value);
            } else if (value instanceof BigDecimal) {
                map.put(key, value);
            } else {
                putValues(value, map, key, keyUpperCase, camelCase);
            }
        }
    }
 
    private static final Set<Class<?>> valueClasses = (Collections.unmodifiableSet(new HashSet<>(Arrays.asList(Object.classString.class, Boolean.class,
            Character.class, Byte.class, Short.class, Integer.class, Long.class, Float.class, Double.class))));
 
    private static boolean isValue(Object value) {
        return value == null || valueClasses.contains(value.getClass());
    }
}
cs