Почему я не могу прочитать папку ресурса rom файла json с Kotlin? - PullRequest
0 голосов
/ 23 ноября 2018

я пытаюсь прочитать из моего файла json, он у меня был в корне, но когда я упаковываю файлы в jar, файл не приходит.Теперь я положил файл JSON в папку «ресурс».

Мой код:

@Component
class DefaultData {

@Autowired
private lateinit var gameOfThronesService: GameOfThronesService

@PostConstruct
fun initializeDefault() {
    val reader = JsonReader(FileReader("game-of-thrones.json"))
    val gameofthronesCharacters: List<GameOfThronesDto> = Gson().fromJson(reader, object : TypeToken<List<GameOfThronesDto>>() {}.type)

    println("-----> JSON Data <-----")
    gameofthronesCharacters.forEach{ println(it) }

    gameOfThronesService.createCharactersFromJson(gameofthronesCharacters)
}
}

Это сработало, когда у меня был файл json в корне, но он не может найти его в папке "resource", как решить эту проблему?

Я также пытался: Как прочитать текстовый файл из ресурсов в Kotlin?

Тогда я получаю следующую ошибку:

(File name too long)
at java.io.FileInputStream.open0(Native Method) ~[na:1.8.0_181]
at java.io.FileInputStream.open(FileInputStream.java:195) ~[na:1.8.0_181]
at java.io.FileInputStream.<init>(FileInputStream.java:138) ~[na:1.8.0_181]
at java.io.FileInputStream.<init>(FileInputStream.java:93) ~[na:1.8.0_181]
at java.io.FileReader.<init>(FileReader.java:58) ~[na:1.8.0_181]
at com.ahmmud16.gameofthrones.util.DefaultData.initializeDefault(DefaultData.kt:24) ~[classes/:na]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_181]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_181]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_181]
at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_181]
at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleElement.invoke(InitDestroyAnnotationBeanPostProcessor.java:366) ~[spring-beans-5.0.9.RELEASE.jar:5.0.9.RELEASE]
at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleMetadata.invokeInitMethods(InitDestroyAnnotationBeanPostProcessor.java:309) ~[spring-beans-5.0.9.RELEASE.jar:5.0.9.RELEASE]
at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:136) ~[spring-beans-5.0.9.RELEASE.jar:5.0.9.RELEASE]
... 18 common frames omitted

1 Ответ

0 голосов
/ 23 ноября 2018

Чтобы прочитать файл из папки ресурсов, вы должны следовать этому ответу здесь .Вы попробовали это, но не правильно.

При этом: val fileContent = this::class.java.classLoader.getResource("game-of-thrones.json").readText(), вы читаете содержимое файла.Затем вы передаете содержимое всего файла в FileReader, как если бы это было имя файла (именно поэтому вы получаете ошибку File name too long).

Из того, что я вижу в документации Gson,Вы можете полностью пропустить создание JsonReader и передать String в fromJson().

Можете ли вы попробовать следующее:

@Component
class DefaultData {

@Autowired
private lateinit var gameOfThronesService: GameOfThronesService

@PostConstruct
fun initializeDefault() {
    val fileContent = this::class.java.classLoader.getResource("game-of-thrones.json").readText()

    val gameofthronesCharacters: List<GameOfThronesDto> = Gson().fromJson(fileContent, object : TypeToken<List<GameOfThronesDto>>() {}.type)

    println("-----> JSON Data <-----")
    gameofthronesCharacters.forEach{ println(it) }

    gameOfThronesService.createCharactersFromJson(gameofthronesCharacters)
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...