4

さまざまなユーザーを作成、読み取り、更新、および削除できる単純なアプリケーションを作成しようとしています。動作する基本的な UI ベースのビュー、コントローラー、およびモデルがありますが、これよりも高度になり、RESTful json インターフェイスを提供したいと考えていました。

ただし、Play 2 のドキュメント、Play 2 の Google グループ、および stackoverflow の Web サイトで見つけられるものをすべて読んだにもかかわらず、これを機能させることはできません。

以前のフィードバックに基づいてコントローラーを更新しましたが、ドキュメントに基づいていると信じています。

これが私の更新されたコントローラーです:

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

JsonPlay2ドキュメントのクラスの使用に矛盾があるようです。上記の例を正しく機能させるために、次のインポートが使用されます。

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

この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

于 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

私の知る限り、使用しているコードは、これによると、公式の 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

ドキュメントを確認してみましたか?

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 に答える
0

注釈をインポートplay.libs.Jsonしてから、この で使用します。BodyParser.OfJson.class

上記の注釈は、 を拡張するクラスを想定していplay.mvc.BodyParserます。@BodyParser.Of(Json.class)したがって、単純にに置き換え@BodyParser.Of(BodyParser.Json.class)ます。

于 2012-10-25T21:09:24.190 に答える