How can I convert Java object to Json in spray routing

301 Views Asked by At

I would like to know if there is any way to return Java object as Json String inside spray routing.

For now, I am converting my Java object (which is returned my UserActor) into Json using Jackson through a util class(JacksonUtil) created by me.

Here is the code snippet for reference :

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 is the class which take of query parameters. For example if client hits GET /users/123, then GetResource will add a searchcriteria as userId = "123"

2

There are 2 best solutions below

0
On

I think you need to do it by yourself like by using Jackson or using LiftJson as per your needs and ease of Use. Spray does not provide such feature by default as it does not have dependencies for this !

You can see the compile dependencies used by spray here : https://mvnrepository.com/artifact/io.spray/spray-routing_2.11/1.3.4

Screenshot :

enter image description here

0
On

This should work for you, as simple as:

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
}