2012-05-06 3 views
4

Я пытаюсь создать простое приложение, которое позволяет мне создавать, читать, обновлять и удалять различных пользователей. У меня есть основанный на UI взгляд, контроллер и модель, которые работают, но хотели быть более продвинутыми, чем это, и предоставить интерфейс RESTful json.Использование json with Play 2

Однако, несмотря на чтение всего, что я могу найти в документации Play 2, в группах Play 2 Google и на веб-сайте stackoverflow, я все еще не могу заставить это работать.

Я обновил свой контроллер на основе предыдущих отзывов, и теперь я полагаю, что он основан на документации.

Вот мой обновленный контроллер:

package controllers; 

import models.Member; 

import play.*; 
import play.mvc.*; 
import play.libs.Json; 
import play.data.Form; 

public class Api extends Controller { 

/* Return member info - version to serve Json response */ 
public static Result member(Long id){ 
    ObjectNode result = Json.newObject(); 
    Member member = Member.byid(id); 
    result.put("id", member.id); 
    result.put("email", member.email); 
    result.put("name", member.name); 
    return ok(result); 
} 

// Create a new body parser of class Json based on the values sent in the POST 
@BodyParser.Of(Json.class) 
public static Result createMember() { 
    JsonNode json = request().body().asJson(); 
    // Check that we have a valid email address (that's all we need!) 
    String email = json.findPath("email").getTextValue(); 
    if(name == null) { 
     return badRequest("Missing parameter [email]"); 
    } else { 
     // Use the model's createMember class now 
     Member.createMember(json); 
     return ok("Hello " + name); 
    } 
} 

.... 

Но когда я запускаю это, я получаю следующее сообщение об ошибке:

incompatible types [found: java.lang.Class<play.libs.Json>] [required: java.lang.Class<?extends play.mvc.BodyParser>] 
In /Users/Mark/Development/EclipseWorkspace/ms-loyally/loyally/app/controllers/Api.java at line 42. 

41 // Create a new body parser of class Json based on the values sent in the POST 
42 @BodyParser.Of(Json.class) 
43 public static Result createMember() { 
44  JsonNode json = request().body().asJson(); 
45  // Check that we have a valid email address (that's all we need!) 
46  String email = json.findPath("email").getTextValue(); 

Насколько я могу сказать, я скопированный из documentation поэтому я был бы признателен за любую помощь в получении этой работы.

ответ

0

Вы попробовали проверить documentation?

сервировки ответ JSON выглядит следующим образом:

@BodyParser.Of(Json.class) 
public static index sayHello() { 
    JsonNode json = request().body().asJson(); 
    ObjectNode result = Json.newObject(); 
    String name = json.findPath("name").getTextValue(); 
    if(name == null) { 
    result.put("status", "KO"); 
    result.put("message", "Missing parameter [name]"); 
    return badRequest(result); 
    } else { 
    result.put("status", "OK"); 
    result.put("message", "Hello " + name); 
    return ok(result); 
    } 
} 
+0

Антони, я перечитал документацию и ваш exmaple и имеет больше смысла для меня сейчас, но я получаю сообщение об ошибке «не могу найти символ: класс Json». Я включил play.libs.json. вот мой код: \t @ BodyParser.Of (Json.класс) \t public static Результат (длинный идентификатор) { \t JsonNode json = request(). body(). asJson(); \t ObjectNode result = Json.newObject(); \t Строка name = json.findPath ("name"). GetTextValue(); \t Член-член = Member.byid (id); \t result.put ("id", member.id); \t result.put ("email", member.email); \t result.put ("name", member.name); \t return ok (результат); \t} – mstreffo

+0

Я следовал примеру выше, но по какой-то причине я получаю следующую ошибку: «не могу найти символ: класс Json» - я импортировал play.libs.Json в свой контроллер приложения. Может ли кто-нибудь помочь? – mstreffo

+0

Я пересмотрел свой исходный код и теперь получаю новую ошибку (см. Обновленный контент вопроса выше) – mstreffo

1

AFAIK, код, который вы используете не достигли какой-либо официальной версии Play (ни 2,0 или 2.0.1) в соответствии с этим: https://github.com/playframework/Play20/pull/212

Вместо , вы можете сделать это (не проверено):

if(request().getHeader(play.mvc.Http.HeaderNames.ACCEPT).equalsIgnoreCase("application/json")) { 
+0

спасибо, я дам ему – mstreffo

5

Там, как представляется, конфликты в использовании Json класса в Play 2 documentatio п. Чтобы получить пример выше работаю правильно, используется следующий импорт:

import play.mvc.Controller; 
import play.mvc.Result; 
import play.mvc.BodyParser;      
import play.libs.Json; 
import play.libs.Json.*;       

import static play.libs.Json.toJson; 

import org.codehaus.jackson.JsonNode;   
import org.codehaus.jackson.node.ObjectNode;  

@BodyParser.Of(play.mvc.BodyParser.Json.class) 
public static index sayHello() { 
    JsonNode json = request().body().asJson(); 
    ObjectNode result = Json.newObject(); 
    String name = json.findPath("name").getTextValue(); 
    if(name == null) { 
     result.put("status", "KO"); 
     result.put("message", "Missing parameter [name]"); 
     return badRequest(result); 
    } else { 
     result.put("status", "OK"); 
     result.put("message", "Hello " + name); 
     return ok(result); 
    } 
} 

Обратите внимание на явном вызывающую правый Json класса в @BodyParser

Я не уверен, если это ошибка или нет? Но это единственный способ заставить этот пример работать.

0

Вы импортировали play.libs.Json, а затем используете аннотацию BodyParser.Of с этим Json.class.

Вышеупомянутая аннотация предполагает класс, который расширяет play.mvc.BodyParser. Поэтому просто замените @BodyParser.Of(Json.class) на @BodyParser.Of(BodyParser.Json.class).

2

Попробуйте это:

import play.*; 
import play.mvc.*; 
import org.codehaus.jackson.JsonNode; //Fixing "error: cannot find symbol" for JsonNode 

// Testing JSON 
    @BodyParser.Of(BodyParser.Json.class) //Or you can import play.mvc.BodyParser.Json 
    public static Result sayHello() { 
    JsonNode json = request().body().asJson(); 
    String name = json.findPath("name").getTextValue(); 
    if(name==null) { 
     return badRequest("Missing parameter [name]"); 
    } else { 
     return ok("Hello " + name); 
    } 
    } 
+2

добавить дополнительную информацию для вашего кода, ссылки, пояснения –

Смежные вопросы