在 java 代码中使用具有隐式参数的 Scala 对象中的函数

Use functions from a Scala object that have implicit parameters in java code

有没有一种方法可以在我的 java 代码中使用 fromJsontoJson 方法?我想调用它来将我从 mongoldb 获得的 bson 文档转换为我在 Scala

中拥有的模型 class

下面是我的 Scala 对象,

import com.fasterxml.jackson.databind.{DeserializationFeature, ObjectMapper}
import com.fasterxml.jackson.module.scala.{DefaultScalaModule, ScalaObjectMapper}

object JsonUtils {

  val mapper = new ObjectMapper() with ScalaObjectMapper

  mapper.registerModule(DefaultScalaModule)
  mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)

  def toJson(value: Map[Symbol, Any]): String = {
    toJson(value map { case (k,v) => k.name -> v})
  }

  def toJson(value: Any): String = {
    mapper.writeValueAsString(value)
  }

  def toMap[V](json:String)(implicit m: Manifest[V]) = fromJson[Map[String,V]](json)

  def fromJson[T](json: String)(implicit m : Manifest[T]): T = {
    mapper.readValue[T](json)
  }

  implicit class Marshallable[T](marshallMe: T) {
    def toJson: String = JsonUtils.toJson(marshallMe)
  }

  implicit class Unmarshallable(unMarshallMe: String) {
    def toMap: Map[String,Any] = JsonUtils.toMap(unMarshallMe)
    def fromJson[T]()(implicit m: Manifest[T]): T =  JsonUtils.fromJson[T](unMarshallMe)
  }
}

在 Java 代码中,您必须手动解析 Scala 隐式。

试着给fromJson打电话

JsonUtils.fromJson("a", scala.reflect.Manifest.classType(LocalUser.class));

JsonUtils$.MODULE$.fromJson("a", scala.reflect.Manifest$.MODULE$.classType(LocalUser.class));

基于Calling a Scala from Java Play Framework which takes a ClassTag

关于 toJson 我看不出有什么问题。尽管如果您使用 Map 参数调用 toJson 的重载版本,也许您必须在 scala.Predef.Map 又名 scala.collection.immutable.Mapjava.util.Map

之间进行转换

Convert Java Map to Scala Map

How can I convert Scala Map to Java Map with scala.Float to java.Float k/v conversion

顺便说一句,Manifest 已弃用,取而代之的是 ClassTag/TypeTag

https://docs.scala-lang.org/overviews/reflection/typetags-manifests.html