带有Spring Boot的Scala异常行为:挂起并且输入失败也不例外

时间:2019-06-24 22:36:29

标签: json scala jackson

我正在使用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]")

更新:

此方法由名为onReceived的kafka处理程序方法使用。 @Thilo指出,异常可能被调用代码“阻止”。难道这个kafka处理程序“吞噬”了异常?

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

有人对我有暗示吗,为什么会这样?

先谢谢您

艾伦

1 个答案:

答案 0 :(得分:0)

我找到了答案,这并不能真正令我满意。如果有人有解释,您可以随意评论。

一个简单的技巧是包装一个try-catch,即使没有先引发任何观念。现在,我可以检测到错误的输入字符串并进行处理。

但是我不明白为什么在没有执行死刑之前?

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

蓄积