我非常确定可以使用反射API来完成。
我同时使用Casbah和spray.json在Scala项目中创建JSON文档 - 一个面向MongoDB,另一个面向REST API。
这有时令人困惑。我想检测并禁止import
错误的"某个源文件中的库,确保将来的编辑永远不会在同一代码中混合使用这两种方法。
可能没有编译时机制来执行此操作(宏除外,不想这么深)。
运行时方法(例如放置在object
体内以使其在前面运行)会没问题。即如何在Scala中将spray.json
命名空间导入此范围?
早期问题:Prevent imports of unauthorized classes in Scala触及关闭,但更多关于沙盒(不可信代码)
答案 0 :(得分:1)
在澄清你的评论之后,我要做的是根据哪些类型是“安全的”来结束Casbah序列化。有一个“网关”方法可以进行Casbah序列化,还有一个标记界面可以说明哪些类型“安全”发送到Casbah
trait CasbahSafe[T]
object CasbahSafe {
implicit val intsAreSafe = new CasbahSafe[Int]{}
implicit val stringsAreSafe = new CasbahSafe[String]{}
...
}
def saveToMongo[T: CasbahSafe](t: T) = ...
然后只能使用适当的类型调用saveToMongo
;如果您尝试使用JsNumber
调用它,则会出现编译错误。对于复合类型,您可以使用Shapeless automatic typeclass derivation为所有字段为CasbahSafe
的任何案例类派生CasbahSafe
。
整体效果与spray-json对JsonFormat
的效果非常相似。应该已经不可能“在相反的方向犯同样的错误”,因为编译器强制存在JsonFormat
。