728x90
반응형
728x90
반응형
728x90
반응형

객체에 사용되는 string에 대해 한번에 trim해 주는 메소드입니다. 

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
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;
 
public class StringTrimConverter {
 
    public static Object trimReflective(Object object) throws Exception {
        if (object == null)
            return null;
 
        Class<extends Object> c = object.getClass();
        
        try {
            // Introspector usage to pick the getters conveniently thereby
            // excluding the Object getters
            for (PropertyDescriptor propertyDescriptor : Introspector
                    .getBeanInfo(c, Object.class).getPropertyDescriptors()) {
                Method method = propertyDescriptor.getReadMethod();
                String name = method.getName();
 
                // If the current level of Property is of type String
                if (method.getReturnType().equals(String.class)) {
                    String property = (String) method.invoke(object);
                    if (property != null) {
                        Method setter = c.getMethod("set" + name.substring(3),
                                new Class<?>[] { String.class });
                        if (setter != null)
                            // Setter to trim and set the trimmed String value
                            setter.invoke(object, property.trim());
                    }
                }
 
                // If an Object Array of Properties - added additional check to
                // avoid getBytes returning a byte[] and process
                if (method.getReturnType().isArray()
                        && !method.getReturnType().isPrimitive()
                        && !method.getReturnType().equals(String[].class)
                        && !method.getReturnType().equals(byte[].class)) {
                    System.out.println(method.getReturnType());
                    // Type check for primitive arrays (would fail typecasting
                    // in case of int[], char[] etc)
                    if (method.invoke(object) instanceof Object[]) {
                        Object[] objectArray = (Object[]) method.invoke(object);
                        if (objectArray != null) {
                            for (Object obj : (Object[]) objectArray) {
                                // Recursively revisit with the current property
                                trimReflective(obj);
                            }
                        }
                    }
                }
                // If a String array
                if (method.getReturnType().equals(String[].class)) {
                    String[] propertyArray = (String[]) method.invoke(object);
                    if (propertyArray != null) {
                        Method setter = c.getMethod("set" + name.substring(3),
                                new Class<?>[] { String[].class });
                        if (setter != null) {
                            String[] modifiedArray = new String[propertyArray.length];
                            for (int i = 0; i < propertyArray.length; i++)
                                if (propertyArray[i] != null)
                                    modifiedArray[i] = propertyArray[i].trim();
 
                            // Explicit wrapping
                            setter.invoke(object,
                                    new Object[] { modifiedArray });
                        }
                    }
                }
                // Collections start
                if (Collection.class.isAssignableFrom(method.getReturnType())) {
                    Collection collectionProperty = (Collection) method
                            .invoke(object);
                    if (collectionProperty != null) {
                        for (int index = 0; index < collectionProperty.size(); index++) {
                            if (collectionProperty.toArray()[index] instanceof String) {
                                String element = (String) collectionProperty
                                        .toArray()[index];
 
                                if (element != null) {
                                    // Check if List was created with
                                    // Arrays.asList (non-resizable Array)
                                    if (collectionProperty instanceof List) {
                                        ((List) collectionProperty).set(index,
                                                element.trim());
                                    } else {
                                        collectionProperty.remove(element);
                                        collectionProperty.add(element.trim());
                                    }
                                }
                            } else {
                                // Recursively revisit with the current property
                                trimReflective(collectionProperty.toArray()[index]);
                            }
                        }
                    }
                }
                // Separate placement for Map with special conditions to process
                // keys and values
                if (method.getReturnType().equals(Map.class)) {
                    Map mapProperty = (Map) method.invoke(object);
                    if (mapProperty != null) {
                        // Keys
                        for (int index = 0; index < mapProperty.keySet().size(); index++) {
                            if (mapProperty.keySet().toArray()[index] instanceof String) {
                                String element = (String) mapProperty.keySet()
                                        .toArray()[index];
                                if (element != null) {
                                    mapProperty.put(element.trim(),
                                            mapProperty.get(element));
                                    mapProperty.remove(element);
                                }
                            } else {
                                // Recursively revisit with the current property
                                trimReflective(mapProperty.get(index));
                            }
 
                        }
                        // Values
                        for (Map.Entry entry : (Set<Map.Entry>) mapProperty
                                .entrySet()) {
 
                            if (entry.getValue() instanceof String) {
                                String element = (String) entry.getValue();
                                if (element != null) {
                                    entry.setValue(element.trim());
                                }
                            } else {
                                // Recursively revisit with the current property
                                trimReflective(entry.getValue());
                            }
                        }
                    }
                } else {// Catch a custom data type as property and send through
                        // recursion
                    Object property = (Object) method.invoke(object);
                    if (property != null) {
                        trimReflective(property);
                    }
                }
            }
 
        } catch (Exception e) {
            throw new Exception("Strings cannot be trimmed because: ", e);
        }
 
        return object;
 
    }
}
cs

 

실제 vo에 사용 시 아래와 같이 사용하면 됩니다.

1
GrpCodeReqDTO req = (GrpCodeReqDTO) StringTrimConverter.trimReflective(reqDTO);
cs

당연하지만 getter, setter가 있어야 합니다.

이걸 빼먹고 1시간 삽질했네요.

 

아쉽게도 해외 원문 작성글이 있었는데 찾을 수가 없어서 링크를 걸어줄 수 없군요.

728x90
반응형
728x90
반응형

간단하게 dto를 entity에 넣어주고 싶을때 modelmapper를 사용하면 한줄로 해결할 수 있다.

 

# modelmapper 사용하는 방법

1. gradle에 추가하기

1
implementation group: 'org.modelmapper', name: 'modelmapper', version: '2.3.2'
cs

 

2. Bean 등록

1
2
3
4
5
6
7
    /**
     * ModelMapper 설정
     */
    @Bean
    public ModelMapper modelMapper() {
        return new ModelMapper();
    }
cs

 

3. Service에서 modelmapper 활용

1
2
3
4
5
6
7
8
9
10
11
12
13
14
    @Autowired
    private ModelMapper modelMapper;
 
    public GroupCode insertItem(GrpCodeReqDTO reqDTO) {
        GroupCode entity = modelMapper.map(reqDTO, GroupCode.class);
        return groupCodeRepository.save(entity);
    }
 
    public GroupCode updateItem(GrpCodeReqDTO reqDTO) {
        GroupCode entity = groupCodeRepository.findById(reqDTO.getGrpCd());
        modelMapper.map(reqDTO, entity);
        return groupCodeRepository.save(entity);
    }
 
cs

5번 라인의 GroupCode entity = modelMapper.map(reqDTO, GroupCode.class);

11번 라인의 modelMapper.map(reqDTO, entity);

해당 라인을 참고하여 사용하면 된다.

 

 

※ 참고사항: 맵핑에 대한 설정정보

ModelMapper - Configuration

Configuration ModelMapper uses a set of conventions and configuration to determine which source and destination properties match each other. Available configuration, along with default values, is described below: Setting Description Default Value Access le

modelmapper.org

 

728x90
반응형
728x90
반응형

# STS version 4.1.1.RELEASE

1. Package Explorer의 패키지 폴더 우클릭 -> Run As -> Run Configurations

 

2. Gradle Project -> 상단 좌측의 New launch configuration

3. 새 환경의 Gradle Tasks에 'bootWar' 입력 -> Working Directory에 '${workspace_loc:/

ProjectName

}' -> Apply

4. Run을 선택하면 프로젝트\build\libs\ 폴더에 war 파일 생성됨.

 

728x90
반응형
728x90
반응형

Spring boot의 war 파일을 weblogic에서 배포시 net.sf.log4jdbc.sql.jdbcapi.DriverSpy 에러와 함께 배포가 되지 않는 문제가 있다.

 

weblogic version : 12.2.1.3.0

 

변경 내용을 활성화하는 중 오류가 발생했습니다. 자세한 내용은 로그를 참조하십시오.

java.lang.IllegalStateException: Cannot load driver class: net.sf.log4jdbc.sql.jdbcapi.DriverSpy

Cannot load driver class: net.sf.log4jdbc.sql.jdbcapi.DriverSpy

 

 

# db connection1
spring.datasource.url=jdbc:log4jdbc:mysql://xxx.xxx.xxx.xxx:3306/myDb
spring.datasource.username=accountName
spring.datasource.password=password
spring.datasource.driver-class-name=net.sf.log4jdbc.sql.jdbcapi.DriverSpy

 

db 연결에 대한 정보에서 driver 문제로 인해 발생된 것.

아래와 같이 변경하면 배포 된다. (대신 로그가 간소화 된다는 점 참고.)


# db connection2

spring.datasource.url=jdbc:log4jdbc:mysql://xxx.xxx.xxx.xxx:3306/myDb
spring.datasource.username=accountName
spring.datasource.password=password

spring.datasource.driver-class-name=com.mysql.jdbc.Driver

 

 

 

 

728x90
반응형
728x90
반응형

문제가 된 에러 부분은

java.lang.IllegalArgumentException: The main resource set specified [FOLDER_NAME] is not valid

 

Tomcat8에서 새로운 프로젝트의 war를 배포하려고 했으나 어떤 이유에서인지 창이 껴져 버립니다.

원인은 server.xml에 설정된 가상 디렉토리(virtual directory) 폴더가 존재하지 않았기 때문이더군요.

 

에러로그는 아래와 같습니다.

 

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
25-May-2020 14:15:36.431 ?ш컖 [PROJECT_NAME-startStop-1] org.apache.catalina.core.ContainerBase.startInternal A child container failed during start
        java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[PROJECT_NAME].StandardHost[localhost].StandardContext[/uploads]]
                at java.util.concurrent.FutureTask.report(FutureTask.java:122)
                at java.util.concurrent.FutureTask.get(FutureTask.java:192)
                at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:942)
                at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:882)
                at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
                at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1423)
                at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1413)
                at java.util.concurrent.FutureTask.run(FutureTask.java:266)
                at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
                at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
                at java.lang.Thread.run(Thread.java:748)
        Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[PROJECT_NAME].StandardHost[localhost].StandardContext[/uploads]]
                at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:167)
                ... 6 more
        Caused by: org.apache.catalina.LifecycleException: Failed to start component [org.apache.catalina.webresources.StandardRoot@72ac4866]
                at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:167)
                at org.apache.catalina.core.StandardContext.resourcesStart(StandardContext.java:4885)
                at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5020)
                at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
                ... 6 more
        Caused by: java.lang.IllegalArgumentException: The main resource set specified [C:\uploads\dym\PROJECT_NAME] is not valid
                at org.apache.catalina.webresources.StandardRoot.createMainResourceSet(StandardRoot.java:748)
                at org.apache.catalina.webresources.StandardRoot.startInternal(StandardRoot.java:706)
                at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
                ... 9 more
25-May-2020 14:15:36.435 ?ш컖 [main] org.apache.catalina.core.ContainerBase.startInternal A child container failed during start
        java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[PROJECT_NAME].StandardHost[localhost]]
                at java.util.concurrent.FutureTask.report(FutureTask.java:122)
                at java.util.concurrent.FutureTask.get(FutureTask.java:192)
                at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:942)
                at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:262)
                at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
                at org.apache.catalina.core.StandardService.startInternal(StandardService.java:422)
                at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
                at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:793)
                at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
                at org.apache.catalina.startup.Catalina.start(Catalina.java:688)
                at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
                at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
                at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
                at java.lang.reflect.Method.invoke(Method.java:498)
                at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:353)
                at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:493)
        Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[PROJECT_NAME].StandardHost[localhost]]
                at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:167)
                at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1423)
                at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1413)
                at java.util.concurrent.FutureTask.run(FutureTask.java:266)
                at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
                at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
                at java.lang.Thread.run(Thread.java:748)
        Caused by: org.apache.catalina.LifecycleException: A child container failed during start
                at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:953)
                at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:882)
                at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
                ... 6 more
        Caused by: java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[PROJECT_NAME].StandardHost[localhost].StandardContext[/uploads]]
                at java.util.concurrent.FutureTask.report(FutureTask.java:122)
                at java.util.concurrent.FutureTask.get(FutureTask.java:192)
                at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:942)
                ... 8 more
        Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[PROJECT_NAME].StandardHost[localhost].StandardContext[/uploads]]
                at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:167)
                ... 6 more
        Caused by: org.apache.catalina.LifecycleException: Failed to start component [org.apache.catalina.webresources.StandardRoot@72ac4866]
                at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:167)
                at org.apache.catalina.core.StandardContext.resourcesStart(StandardContext.java:4885)
                at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5020)
                at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
                ... 6 more
        Caused by: java.lang.IllegalArgumentException: The main resource set specified [C:\uploads\dym\PROJECT_NAME] is not valid
                at org.apache.catalina.webresources.StandardRoot.createMainResourceSet(StandardRoot.java:748)
                at org.apache.catalina.webresources.StandardRoot.startInternal(StandardRoot.java:706)
                at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
                ... 9 more
25-May-2020 14:15:36.437 ?ш컖 [main] org.apache.catalina.startup.Catalina.start The required Server component failed to start so Tomcat is unable to start.
        org.apache.catalina.LifecycleException: Failed to start component [StandardServer[8005]]
                at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:167)
                at org.apache.catalina.startup.Catalina.start(Catalina.java:688)
                at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
                at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
                at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
                at java.lang.reflect.Method.invoke(Method.java:498)
                at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:353)
                at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:493)
        Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardService[PROJECT_NAME]]
                at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:167)
                at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:793)
                at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
                ... 7 more
        Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[PROJECT_NAME]]
                at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:167)
                at org.apache.catalina.core.StandardService.startInternal(StandardService.java:422)
                at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
                ... 9 more
        Caused by: org.apache.catalina.LifecycleException: A child container failed during start
                at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:953)
                at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:262)
                at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
                ... 11 more
        Caused by: java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[PROJECT_NAME].StandardHost[localhost]]
                at java.util.concurrent.FutureTask.report(FutureTask.java:122)
                at java.util.concurrent.FutureTask.get(FutureTask.java:192)
                at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:942)
                ... 13 more
        Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[PROJECT_NAME].StandardHost[localhost]]
                at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:167)
                at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1423)
                at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1413)
                at java.util.concurrent.FutureTask.run(FutureTask.java:266)
                at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
                at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
                at java.lang.Thread.run(Thread.java:748)
        Caused by: org.apache.catalina.LifecycleException: A child container failed during start
                at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:953)
                at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:882)
                at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
                ... 6 more
        Caused by: java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[PROJECT_NAME].StandardHost[localhost].StandardContext[/uploads]]
                at java.util.concurrent.FutureTask.report(FutureTask.java:122)
                at java.util.concurrent.FutureTask.get(FutureTask.java:192)
                at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:942)
                ... 8 more
        Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[PROJECT_NAME].StandardHost[localhost].StandardContext[/uploads]]
                at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:167)
                ... 6 more
        Caused by: org.apache.catalina.LifecycleException: Failed to start component [org.apache.catalina.webresources.StandardRoot@72ac4866]
                at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:167)
                at org.apache.catalina.core.StandardContext.resourcesStart(StandardContext.java:4885)
                at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5020)
                at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
                ... 6 more
        Caused by: java.lang.IllegalArgumentException: The main resource set specified [C:\uploads\FOLDER_NAME] is not valid
                at org.apache.catalina.webresources.StandardRoot.createMainResourceSet(StandardRoot.java:748)
                at org.apache.catalina.webresources.StandardRoot.startInternal(StandardRoot.java:706)
                at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
                ... 9 more
cs

 

 

* 관련글

[tomcat] memory leak 에러 : https://deonggi.tistory.com/26
[Tomcat] 실행에러 : https://deonggi.tistory.com/76
[tomcat] war 배포하기, 가상 디렉토리 : https://deonggi.tistory.com/126

 

 

 

728x90
반응형
728x90
반응형

Tomcat8에서 war 배포시 에러가 났고, 검색해도 원인을 찾지 못했다.

 

에러코드는 아래.

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
25-May-2020 11:03:42.666 ?ш컖 [PROJECT_NAME-startStop-1] org.apache.catalina.core.ContainerBase.startInternal A child container failed during start
        java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[PROJECT_NAME].StandardHost[localhost].StandardContext[/PROJECT_NAME]]
                at java.util.concurrent.FutureTask.report(FutureTask.java:122)
                at java.util.concurrent.FutureTask.get(FutureTask.java:192)
                at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:942)
                at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:882)
                at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
                at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1423)
                at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1413)
                at java.util.concurrent.FutureTask.run(FutureTask.java:266)
                at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
                at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
                at java.lang.Thread.run(Thread.java:748)
        Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[PROJECT_NAME].StandardHost[localhost].StandardContext[/PROJECT_NAME]]
                at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:167)
                ... 6 more
        Caused by: org.apache.catalina.LifecycleException: Failed to start component [org.apache.catalina.webresources.StandardRoot@73b10462]
                at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:167)
                at org.apache.catalina.core.StandardContext.resourcesStart(StandardContext.java:4885)
                at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5020)
                at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
                ... 6 more
        Caused by: java.lang.IllegalArgumentException: The main resource set specified [D:\webapp_tomcat\PROJECT_NAME-0.0.1-SNAPSHOT] is not valid
                at org.apache.catalina.webresources.StandardRoot.createMainResourceSet(StandardRoot.java:748)
                at org.apache.catalina.webresources.StandardRoot.startInternal(StandardRoot.java:706)
                at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
                ... 9 more
cs

 

원인은 war 파일명 문제.

tomcat설치폴더\conf\server.xml 에 프로젝트의 docBase에서 지정한 war 파일명을 찾을 수 없다라는 것.

 

정확히는 아래 부분의 이 에러

java.lang.IllegalArgumentException: The main resource set specified [D:\webapp_tomcat\PROJECT_NAME-0.0.1-SNAPSHOT] is not valid

 

 

 

반성하자면.. 난 참 쓸데없는 짓을 했는데. 먼저 tomcat이 돌아가는지 확인했어야 했어....

 

 

* 관련글

[tomcat] memory leak 에러 : https://deonggi.tistory.com/26
[Tomcat] java.lang.IllegalArgumentException: The main resource set specified [FOLDER_NAME] ... : https://deonggi.tistory.com/77
[tomcat] war 배포하기, 가상 디렉토리 : https://deonggi.tistory.com/126

 

 

 

 

728x90
반응형
728x90
반응형

SELECT STREET_BILLTO
FROM TABLE_NAME
 {executed in 0 msec} 
20200428 09:17:55.606 [pool-1-thread-1] INFO j.resultsettable - 
|--------------|
|street_billto |
|--------------|
|--------------|
 
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException: 
### Error querying database.  Cause: java.lang.NullPointerException
### The error may exist in file [\projectfolder\out\production\resources\mapper\TestMapper.xml]
### The error may involve com.test.projectfolder.repository.TestMapper.testNullValue
### The error occurred while handling results
### SQL: SELECT STREET_BILLTO   FROM TABLE_NAME
### Cause: java.lang.NullPointerException
at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:77)
at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:446)
at com.sun.proxy.$Proxy65.selectList(Unknown Source)
at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:230)
at org.apache.ibatis.binding.MapperMethod.executeForMany(MapperMethod.java:139)
at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:76)
at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:59)
at com.sun.proxy.$Proxy137.testNullValue(Unknown Source)
at com.test.projectfolder.schedule.ScheduleService.testNullValue(ScheduleService.java:272)
at com.test.projectfolder.schedule.ScheduleEventCron.testEvent(ScheduleEventCron.java:29)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:84)
at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Caused by: org.apache.ibatis.exceptions.PersistenceException: 
### Error querying database.  Cause: java.lang.NullPointerException
### The error may exist in file [\projectfolder\out\production\resources\mapper\TestMapper.xml]
### The error may involve com.test.projectfolder.repository.TestMapper.testNullValue
### The error occurred while handling results
### SQL: SELECT STREET_BILLTO   FROM TABLE_NAME
### Cause: java.lang.NullPointerException
at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:150)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:141)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:433)
... 21 more
Caused by: java.lang.NullPointerException
at net.sf.log4jdbc.sql.resultsetcollector.DefaultResultSetCollector.methodReturned(DefaultResultSetCollector.java:204)
at net.sf.log4jdbc.sql.jdbcapi.ResultSetSpy.reportAllReturns(ResultSetSpy.java:100)
at net.sf.log4jdbc.sql.jdbcapi.ResultSetSpy.reportReturn(ResultSetSpy.java:192)
at net.sf.log4jdbc.sql.jdbcapi.ResultSetSpy.wasNull(ResultSetSpy.java:2497)
at com.zaxxer.hikari.pool.HikariProxyResultSet.wasNull(HikariProxyResultSet.java)
at org.apache.ibatis.type.BaseTypeHandler.getResult(BaseTypeHandler.java:70)
at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.applyAutomaticMappings(DefaultResultSetHandler.java:520)
at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.getRowValue(DefaultResultSetHandler.java:401)
at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleRowValuesForSimpleResultMap(DefaultResultSetHandler.java:355)
at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleRowValues(DefaultResultSetHandler.java:330)
at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleResultSet(DefaultResultSetHandler.java:303)
at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleResultSets(DefaultResultSetHandler.java:196)
at org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:64)
at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:79)
at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:63)
at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:326)
at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:156)
at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:109)
at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:83)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:148)
... 27 more

 

 

해당 쿼리는 실행시 문제가 없다.

다만, mybatis를 통하기만하면 이런 에러가 난다.

그래서 문제 없이 조회한 컬럼들과 비교해 보니 해당 컬럼에서는 null인 값들이 있다.

그래서 널인 경우 처리를 해주었더니 해결.

 

SELECT 

ISNULL(STREET_BILLTO, '') as STREET_BILLTO
FROM TABLE_NAME

 

728x90
반응형
728x90
반응형

ListView내의 item을 클릭 했을때의 이벤트(OnItemClickListener)가 작동하지 않는 경우

확인할 것은 포커스가 가능하거나 클릭이 가능한 View가 item layout 파일내에 있는지 확인해야 합니다.

예를들면, EditText, CheckBox 같은 것들이죠.

 

이 경우 해당 View로 포커스가 가는 문제를 막아주면 됩니다.

item을 작성한 layout 파일에서 감싸고 있는 Layout에

android:descendantFocusability="blocksDescendants" 를 넣어주면 됩니다.

 

 

출처 : https://stackoverflow.com/questions/5551042/onitemclicklistener-not-working-in-listview

 

OnItemCLickListener not working in listview

Activity class code: conversationList = (ListView)findViewById(android.R.id.list); ConversationArrayAdapter conversationArrayAdapter=new ConversationArrayAdapter(this, R.layout.

stackoverflow.com

 

728x90
반응형

+ Recent posts