Scala с Spring Boot странное поведение: зависает и не исключение при сбое ввода - PullRequest
1 голос
/ 25 июня 2019

Я использую Scala. Я не очень знаком со Scala, но, по крайней мере, он работал для использования jackson JSON-анализатора.

Теперь у меня очень странная проблема. Если входная строка JSON имеет синтаксическую ошибку, методы разбора зависают, не дают ответа и не исключение. Я использую этот объект / методы, который отлично работает при правильном вводе:


import com.fasterxml.jackson.databind.{DeserializationFeature, ObjectMapper}
import org.json4s.jackson.JsonMethods.parse
import com.fasterxml.jackson.module.scala.experimental.ScalaObjectMapper
import com.fasterxml.jackson.module.scala.DefaultScalaModule

object JsonHelper {
val internal_mapper = new ObjectMapper() with ScalaObjectMapper
internal_mapper.registerModule(DefaultScalaModule)

implicit def jsonStrToAny(jsonStr: String)(implicit m : Manifest[Any]): Any = {
    internal_mapper.readValue[Any](jsonStr)
  }
}

В коде я просто называю: JsonHelper.jsonStrToAny("[{\"660\":false]")

Обновление:

Этот метод используется методом-обработчиком kafka, который называется onReceived. @Thilo указал, что исключение может быть «заблокировано» вызывающим кодом. Может быть, этот обработчик кафки «проглотил» исключение?

private val checker = Consumer
    .plainSource(consumerSettings, Subscriptions.topics(CHECK_REQUEST_TOPIC))
    .toMat(Sink.foreach(onReceived))(Keep.both)
    .mapMaterializedValue(DrainingControl.apply)
    .run()

У кого-нибудь есть подсказка для меня, почему это может быть?

Заранее спасибо,

Allan

1 Ответ

0 голосов
/ 25 июня 2019

Я нашел себе ответ, который меня не очень удовлетворяет. Если у кого-то есть объяснение, вы можете его прокомментировать.

Простой трюк заключался в том, чтобы обернуть пробную ловушку, даже если не было никакого исключения. Теперь я могу обнаружить неправильные входные строки и обработать их, как захочу.

Но я не понимаю, почему раньше не было никакого исключения?

implicit def jsonStrToAny(jsonStr: String)(implicit m: Manifest[Any]): Any = {
    try {
      internal_mapper.readValue[Any](jsonStr)
    } catch {
      case e: Exception => {
        null
      }
    }
  }

Reards

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