4

我正在尝试创建一个简单的应用程序,允许我创建、读取、更新和删除各种用户。我有一个基本的基于 UI 的视图、控制器和模型,但我想比这更高级,并提供一个 RESTful json 接口。

但是,尽管阅读了我在 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();

据我所知,我已经从文档中复制了,因此我将不胜感激任何帮助使其正常工作。

4

6 回答 6

5

JsonPlay 2 文档中的类的使用似乎存在冲突。为了使上面的示例正常工作,使用了以下导入:

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

我不确定这是否是一个错误?但这是我可以让这个例子工作的唯一方法。

于 2012-05-18T13:15:23.453 回答
3

导入这两个

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ObjectNode;

根据此文档: http: //fasterxml.github.io/jackson-databind/javadoc/2.0.0/com/fasterxml/jackson/databind/node/ObjectNode.html

于 2014-01-20T18:01:06.270 回答
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);
    }
  }
于 2012-11-21T21:51:49.130 回答
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")) {
于 2012-05-06T14:44:13.590 回答
0

您已导入play.libs.Json,然后将BodyParser.Of注释与 this 一起使用Json.class

上面的注释需要一个扩展play.mvc.BodyParser. 所以只需替换@BodyParser.Of(Json.class)@BodyParser.Of(BodyParser.Json.class).

于 2012-10-25T21:09:24.190 回答
0

您是否尝试查看它的文档

提供 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);
  }
}
于 2012-05-06T14:21:06.763 回答