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

问题描述

我是否可以在Java代码中使用fromJsontoJson方法?我想用它来将我从mongoldb获得的bson文档转换为Scala中的模型类

我的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,我看不到任何问题。尽管如果您使用参数toJson调用Map的重载版本,也许您必须在scala.Predef.Mapscala.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

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