org.yaml.snakeyaml.error.YAMLException: java.io.IOException: Stream closed

org.yaml.snakeyaml.error.YAMLException: java.io.IOException: Stream closed

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@Getter
@Setter
@ToString
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class ErrorMessage {
private NotFound notFound;

public static ErrorMessage getInstance() {
var yaml = new Yaml(new Constructor(ErrorMessage.class));
try (var inputStream = ClassLoader.getSystemResourceAsStream("error/error.message.yml")) {

return yaml.load(inputStream);
} catch (IOException e) {
throw new UndefinedException("product.error.message.yml 파일을 찾을수 없습니다.", e);
}
}

}

이렇게 ClassLoader 에서 Stream을 얻어서 사용하고 있었다 이렇게 했을때 test code도 모두 통과 하고 정상적인것 처럼 보였다.

서버에서 실행을 해봤더니 error가 나왔다.

1
org.yaml.snakeyaml.error.YAMLException: java.io.IOException: Stream closed

보니 error/error.message.yml의 스트림을 못연것이 였다.
멀티모듈을 사용하고 있었고 ClassLoader는 상위 모듈의 위치를 가르키고 있던것이 였다 하위 모듈을 가르키게 하기위에 아래 처럼 로드를 했다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@Getter
@Setter
@ToString
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class ErrorMessage {
private NotFound notFound;

public static ErrorMessage getInstance() {
var yaml = new Yaml(new Constructor(ErrorMessage.class));
try (var inputStream = ErrorMessage.class.getClassLoader()
.getResourceAsStream("error/product.error.message.yml")) {

return yaml.load(inputStream);
} catch (IOException e) {
throw new UndefinedException("product.error.message.yml 파일을 찾을수 없습니다.", e);
}
}
}

참고자료