简体   繁体   English

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

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

Is there a way that I can use the fromJson and toJson methods in my java code?有没有办法可以在我的 Java 代码中使用fromJsontoJson方法? I would want to call it to transform a bson document that I get from mongoldb to a model class that I have in Scala我想调用它来将我从 mongoldb 获得的 bson 文档转换为我在 Scala 中拥有的模型类

My Scala object is below,我的 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)
  }
}

In Java code you have to resolve Scala implicits manually.在 Java 代码中,您必须手动解析 Scala 隐式。

Try to call fromJson like尝试调用fromJson类的

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

or或者

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

Based on Calling a Scala from Java Play Framework which takes a ClassTag基于从带有 ClassTag 的 Java Play Framework 调用 Scala

Regarding toJson I can't see problems.关于toJson我看不出问题。 Although if you call overloaded version of toJson with Map argument, maybe you'll have to convert between scala.Predef.Map aka scala.collection.immutable.Map and java.util.Map虽然如果你用Map参数调用toJson重载版本,也许你必须在scala.Predef.Map aka scala.collection.immutable.Mapjava.util.Map之间转换

Convert Java Map to Scala Map 将 Java 映射转换为 Scala 映射

How can I convert Scala Map to Java Map with scala.Float to java.Float k/v conversion 如何使用 scala.Float 将 Scala Map 转换为 Java Map 到 java.Float k/v 转换

By the way, Manifest is deprecated in favor of ClassTag / TypeTag顺便说一句, Manifest已被弃用,以支持ClassTag / TypeTag

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM