1

我想知道是否有任何方法可以在喷射路由中将 Java 对象作为 Json 字符串返回。

现在,我正在通过我创建的 util 类(JacksonUtil)使用 Jackson 将我的 Java 对象(返回我的 UserActor)转换为 Json。

这是供参考的代码片段:

val route = {
    path("users" / Segment) { id =>
      parameterMap { params =>
        get {
          respondWithMediaType(MediaTypes.`text/plain`) {
            val resource: GetResource = new GetResource
            resource.searchCriteriaList.add(new SearchCriteria("userId", "=", Segment)) 
            logger.info("Request Received in new route: " + resource)
            onComplete(callUserActor(resource)) {
              case Success(ret: User) => {
                logger.info("Request complete. Success.")
                complete(JacksonUtil.toJson(ret))
              }
              case Failure(error) => {
                logger.info("Request complete. Failure. " + error)
                complete("Error: " + error)
              }
            }
          }
        }
      }
    } 
  }

def callUserActor(getResource: GetResource): Future[User] = {
    (userActor ? getResource).mapTo[User]
  }

GetResource 是获取查询参数的类。例如,如果客户端点击 GET /users/123,则 GetResource 将添加一个 searchcriteria 作为 userId = "123"

4

2 回答 2

1

我认为您需要自己完成,例如根据您的需要和易用性使用Jackson或使用LiftJson 。Spray 默认情况下不提供此类功能,因为它对此没有依赖关系!

您可以在此处查看 spray 使用的编译依赖项:https ://mvnrepository.com/artifact/io.spray/spray-routing_2.11/1.3.4

截屏 :

在此处输入图像描述

于 2016-11-30T10:11:47.733 回答
1

这应该对你有用,就像这样简单:

class YourService(implicit val requestTimeout: Timeout)
extends HttpServiceActor with
   Json4sJacksonSupport {

  path("users" / Segment) { id =>
    parameterMap { params =>
      get {
        respondWithMediaType(MediaTypes.`text/plain`) {
          val user : Future[User] = Future { User("name", "90") }
          complete(user)
          }
        }
      }
    }  
  }

  implicit def json4sJacksonFormats: Formats = DefaultFormats.lossless
}
于 2016-11-30T11:33:08.697 回答