我有一个简单的类型层次结构,如下所示:
sealed abstract class Config
object Config {
case class Valid(name: String, traits: List[String]) extends Config
case class Invalid(error: String) extends Config
}
implicit val validFormat = jsonFormatFor(Config.Valid)
implicit val invalidFormat = jsonFormatFor(Config.Invalid)
我还有客户端代码执行以下操作:
newHttpServer().addHandler("/config", extractConfig)
extractConfig
方法执行一些计算并返回Config.Valid
或Config.Invalid
,服务器将使用隐式json格式对象自动转换为json。我的问题是存在编译器错误,因为extractConfig
返回Config
:
type mismatch; found : Config
required: spray.httpx.marshalling.ToResponseMarshallable
如果我将extractConfig
的返回类型更改为Config.Valid
,那么服务器代码会进行编译,因为jsonFormatFor(...)
会提供必要的自动类型转换,以便设置ToResponseMarshaller
(尽管我承认我也不完全理解这种自动转换,对于scala来说有些新东西。有没有一种简单的方法可以通过声明Config
的任何子类必须是ToResponseMarshaller
来解决这个问题,因为ToResponseMarshaller
是一个似乎通过隐式转换提供的特征?
答案 0 :(得分:2)
如果您只有Config.Valid和Config.Invalid,则extractConfig返回Either [Config.Valid,Config.Invalid]就足够了。那么你上面的格式应该可行。
另一种可能性是编写自己的jsonwriter(请参阅邮件列表中的thread)。