2016-02-23 1 views
0

Я хотел бы знать, как я могу вернуть данные ответа json из класса контроллера Scala (2.2.x) для отображения на моей странице просмотра? У меня есть объекты json в базе данных Postgresql (имя таблицы: «test» и имеющие: id и имя). Пожалуйста, предоставьте мне какие-либо решения.Как вернуть json из контроллера Play Scala?

Я пробовал следующие случаи (a и b), но я не уверен, почему я не получаю ответ (например: имена) на моем контроллере, поэтому я могу показать их на моей странице просмотра? так как я очень новичок в Play/Scala и Postgresql. кейс a. Если я дам, как: модели:

def getTestValuesFromTable() = { 
    DB.withConnection { implicit connection => 
    val selectJson =SQL("select name from test").on().apply().collect { 
      case Row(id:Long, Some(name:String)) => 
      new TestContent(name) 
     } 
     //.head 
     //JsObject(selectJson().map { row => row[Long]("id").toString -> JsString(row[String]("name")) }.toSeq) 
    } 
    } 

контроллер:

def getTest = Action { 
     val response = TestContent.getTestValuesFromTable() 
     Ok("Done") 
     //Ok(response) 
    } 

Выхода: Done (приложение выполняется нормально, без каких-либо исключений, конечно JSON данных не подходят, так как я возвращаюсь: Done только, поэтому получение выхода: «Готово»)

кейс b. Если я сделаю так: получение ошибки: недостаточно аргументов для метода: (n: Int) models.Testname в признаке LinearSeqOptimized. Неопределенный параметр значения n. Я действительно не уверен, как я могу получить ответ?

контроллер:

def getTest = Action { 
     val response = TestContent.getTestValuesFromTable() 
     // Ok("Done") 
     Ok(response) 
    } 

модель:

def getTestValuesFromTable(): JsValue = { 
DB.withConnection { implicit connection => 
    val selectJson = SQL("select * from test") 
    JsObject(selectJson().map { row => row[Long]("id").toString -> JsString(row[String]("name")) }.toSeq) 
    // val selectJson =SQL("select name from test").on().apply().collect { 
      // case Row(id:Long, Some(name:String)) => 
      // new TestContent(name) 
     // } 
     //.head 
    JsObject(selectJson().map { row => row[Long]("id").toString -> JsString(row[String]("name")) }.toSeq)//not enough arguments for method apply: (n: Int)models.Testname in trait LinearSeqOptimized. Unspecified value parameter n. 
    } 
    } 

Пожалуйста, дайте мне знать, как получить мой ответ?

+0

Возможный дубликат [Невозможно вернуться Ответ JSON с использованием Play Framework и Postgresql?] (Http://stackoverflow.com/questions/35547677/unable-to-return-json-response-using-play-framework-and-postgresql) – cchantep

ответ

0

getJsonValuesFromTable способ не возвращайте ничего (Unit). Чтобы исправить это изменить определение этого метода

def getJsonValuesFromTable(testContent: TestContent) = {

или явно тип установки:

def getJsonValuesFromTable(testContent: TestContent): Unit = {

Кроме того, как следующий шаг, чтобы позволить клиенту знать, что вы возвращаете JSON, вы должны установить Тип контента:

Ok(Json.obj(response)).as("application/json")

+0

спасибо за ваш ответ, у меня есть выполнил вышеуказанную вещь (def getJsonValuesFromTable (testContent: TestContent) = {-} и Ok (Json.obj (response)). as ("application/json")), но получить ошибку: type mismatch; найдено: anorm.SqlQuery required: (String, play.api.libs.json.Json.JsValueWrapper) в: Ok (Json.obj (response)). as ("application/json") – Dhana

+0

Фактически вы не выполняете запрос. Прочтите, как это сделать с использованием API, который вы используете здесь: https://www.playframework.com/documentation/2.0/ScalaAnorm – Rumoku

+0

Я имею в виду, что я сделал только с API, написал запрос: select * from test; где я делаю неправильно? (как я могу получить данные json без выполнения этого запроса), пожалуйста, дайте мне знать. Можем ли мы обсудить чат, пожалуйста? – Dhana