【问题标题】:Using json with Play 2在 Play 2 中使用 json
【发布时间】:2012-05-06 14:12:29
【问题描述】:

我正在尝试创建一个简单的应用程序,它允许我创建、读取、更新和删除各种用户。我有一个基于 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();

据我所知,我是从 documentation 复制过来的,所以如果能帮我解决这个问题,我将不胜感激。

【问题讨论】:

    标签: json playframework playframework-2.0


    【解决方案1】:

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

    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);
        }
    }
    

    注意@BodyParser中正确的Json类的显式调用

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

    【讨论】:

      【解决方案2】:

      导入这两个

      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

      【讨论】:

        【解决方案3】:

        试试这个:

        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);
            }
          }
        

        【讨论】:

        • 为您的代码、参考链接、解释添加更多信息
        【解决方案4】:

        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")) {
        

        【讨论】:

          【解决方案5】:

          您是否尝试过查看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);
            }
          }
          

          【讨论】:

          • anthony,我已经重新阅读了文档和您的示例,现在它对我来说更有意义,但我收到错误消息“找不到符号:Json 类”。我已经包含了 play.libs.json。这是我的代码:@BodyParser.Of(Json.class) public static Result member(Long id){ JsonNode json = request().body().asJson(); ObjectNode 结果 = Json.newObject();字符串名称 = json.findPath("name").getTextValue();会员会员 = Member.byid(id); result.put("id", member.id); result.put("email", member.email); result.put("name", member.name);返回确定(结果); }
          • 我遵循了上面的示例,但由于某种原因,我收到以下错误:“找不到符号:Json 类” - 我已在我的应用程序控制器中导入 play.libs.Json。有人可以帮忙吗?
          • 我已经修改了我的源代码,现在出现了一个新错误(请参阅上面更新的问题内容)
          【解决方案6】:

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

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

          【讨论】:

            猜你喜欢
            • 2013-03-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-07-16
            • 2017-06-21
            • 2014-03-07
            • 1970-01-01
            相关资源
            最近更新 更多