반응형
Spring Boot (스프링 부트) - Runtime에 WAR파일 내부에서 json파일을 읽어서 class에 static하게 저장
<< 환경 >>
Java Open JDK 1.8
Spring Boot 2.4.2
- WAR 실행과 동시에 json형태 정보를 static하게 가지고 있게 해야할 필요 (DB사용 X)
- 조건을 충족하는 경우에 해당 정보를 사용할 수 있도록 설정
1. 메뉴정보의 일부를 json object 형태로 json 파일 생성 (menu.json)
2. 메뉴 정보를 받을 class 파일 생성 (Menu.java)
3. WAR파일 실행시 실행시킬 설정 파일 생성 (CustomConfigurer.java)
4. json 파일에 접근하여 저장시킬 수 있는 파일 생성 (MenuFactory.java)
5. static 정보에 접근하여 해당 정보를 찾을 수 있는지 확인
[ menus.json ]
{
"menus": [{
"name": "menuA",
"url": "menuA",
"authority": "ROLE_HASVIEW"
},
{
"name": "menuB",
"url": "menuB",
"authority": "ROLE_HASLOGIN"
},
{
"name": "menuAdmin",
"url": "menuAdmin",
"authority": "ROLE_ADMIN"
}]
}
|
cs |
[ Menu.java ]
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
|
package com.test.readfile.custom;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Menu {
static Logger log = LoggerFactory.getLogger(Menu.class);
public String name;
public String url;
public String authority;
public Menu() {
}
public Menu(String name, String url, String authority) {
this.name = name;
this.url = url;
this.authority = authority;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getAuthority() {
return authority;
}
public void setAuthority(String authority) {
this.authority = authority;
}
@Override
public String toString() {
return "Menu{" +
"name='" + name + '\'' +
", url='" + url + '\'' +
", authority='" + authority + '\'' +
'}';
}
}
|
cs |
[ MenusFactory.java ]
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
|
package com.test.readfile.custom.factory;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import com.fasterxml.jackson.core.type.TypeReference;
import com.test.readfile.custom.Menu;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
public class MenusFactory {
static Logger log = LoggerFactory.getLogger(MenusFactory.class);
static final String menuFile = "config/json/menus.json";
static HashMap<String, ArrayList<Menu>> tempMenus;
public MenusFactory() throws JsonParseException, JsonMappingException, IOException {
tempMenus = addDefaultMenus();
}
public static HashMap<String, ArrayList<Menu>> addDefaultMenus() throws JsonParseException, JsonMappingException, IOException {
log.info("adding default menus");
// get file
InputStream is = getStreamFromResource(menuFile);
// add hashmap
HashMap<String, ArrayList<Menu>> tempMenusMap = mapInputStreamMenus(is);
// check with log
log.info("tempMenusMap: " + tempMenusMap.toString());
return tempMenusMap;
}
private static InputStream getStreamFromResource(String menuFile) {
ClassLoader classLoader = MenusFactory.class.getClassLoader();
InputStream inputStream = classLoader.getResourceAsStream(menuFile);
if (inputStream == null) {
throw new IllegalArgumentException("menu file \"" + menuFile + "\" not found.");
} else {
return inputStream;
}
}
private static HashMap<String, ArrayList<Menu>> mapInputStreamMenus(InputStream is) throws JsonParseException, JsonMappingException, IOException {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(DeserializationFeature.FAIL_ON_IGNORED_PROPERTIES, false);
HashMap<String, ArrayList<Menu>> tempMenusMap = objectMapper.readValue(is, new TypeReference<HashMap<String, ArrayList<Menu>>>() {});
return tempMenusMap;
}
public static HashMap<String, ArrayList<Menu>> getTempMenus() {
return tempMenus;
}
public static void setTempMenus(HashMap<String, ArrayList<Menu>> tempMenus) {
MenusFactory.tempMenus = tempMenus;
}
}
|
cs |
[ CustomConfigurer.java ]
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
|
package com.test.readfile.config;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.test.readfile.custom.factory.MenusFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.io.IOException;
@Configuration
public class CustomConfigurer {
Logger log = LoggerFactory.getLogger(CustomConfigurer.class);
@Bean
public MenusFactory menusInitializer() throws JsonParseException, JsonMappingException, IOException {
log.info("Initialize Menu");
return new MenusFactory();
}
}
|
cs |
[ ReadFileApplication.java ]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
package com.test.readfile;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class ReadFileApplication {
static Logger log = LoggerFactory.getLogger(ReadFileApplication.class);
public static void main(String[] args) {
SpringApplication.run(ReadFileApplication.class, args);
}
}
|
cs |
반응형
'스프링 (Spring) > Spring Boot' 카테고리의 다른 글
[Spring Boot 실습 #4] 초기 데이터 생성 - CommandLineRunner 활용 (1) (0) | 2021.05.02 |
---|---|
[Spring Boot 실습 #3] Runtime에 WAR파일 내부 json 파일 읽기 (3) - 테스트 (0) | 2021.02.01 |
[Spring Boot 실습 #3] Runtime에 WAR파일 내부 json 파일 읽기 (2) - 테스트 (0) | 2021.01.20 |
[Spring Boot 실습 #2] undertow - HTTP method 제한 (0) | 2020.12.24 |
[Spring Boot 실습 #1] undertow - 에러페이지 처리 문제 (0) | 2020.12.19 |