2

請負業者が開始した Web プロジェクトを継承しました。私と同僚は、使用されているテクノロジに慣れておらず、いくつかの質問があります。私たちが知る限り、これはある種の RESTful Java サーバー コードのように見えますが、Java RESTful サービスにはさまざまな種類があると私は理解しています。これはどっち?具体的な質問:

1) この特定のサービスに関する詳細情報 (特に紹介情報) はどこで入手できますか?

2)コードは、ある種の「魔法」によってJSONを作成して返します...フィールドのゲッターメソッドとセッターメソッドを持つモデルクラス(以下のコード)を返すだけで、自動的にJSONに変換されます。これがどのように自動的に行われるかについてもっと知りたいです。

3) JSON を作成するコードが既にいくつかあります。このフレームワークを使用してこれを返す必要があります。既にJSON がある場合、それを返すにはどうすればよいですか? 私はこのようなことを試しました:

String testJSON = "{\"menu\": {\"id\": \"file\", \"value\": \"こんにちは\"}}"; testJSON を返します。

getter/setter を使用してモデル オブジェクトを返す代わりに、JSON ではなくリテラル テキスト文字列を返します。すでに JSON 文字列である実際の JSON を返し、それを JSON として送信する方法はありますか?

上記のすべての質問に答える必要はありません。役立つ方向への任意/すべてのポインタに感謝します!

コード

まず、JSON を返すビュー コントローラー:

package com.aimcloud.server;
import com.aimcloud.util.MySqlConnection;
import javax.ws.rs.GET;
import javax.ws.rs.PUT;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.QueryParam;
import javax.ws.rs.FormParam;
import javax.ws.rs.HeaderParam;
import javax.ws.rs.Produces;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import com.aimcloud.models.SubscriptionTierModel;

@Path("subscription_tier")
public class SubscriptionTierController
{
        // this method will return a list of subscription_tier table entries that are currently active
    @GET
    @Produces({ MediaType.APPLICATION_JSON })
    public String/*ArrayList<SubscriptionTierModel>*/ getSubscriptionTiers(@QueryParam("includeActiveOnly") Boolean includeActiveOnly)
    {       
        MySqlConnection mysql = MySqlConnection.getConnection();
        ArrayList<SubscriptionTierModel> subscriptionTierArray = new ArrayList<SubscriptionTierModel>();
        String queryString;

        if (includeActiveOnly)
            queryString = "SELECT * FROM subscription_tier WHERE active=1";
        else
            queryString = "SELECT * FROM subscription_tier";

        List<Map<String, Object>> resultList = mysql.query(queryString, null);

        for (Map<String, Object> subscriptionRow : resultList)
            subscriptionTierArray.add( new SubscriptionTierModel(subscriptionRow) );

    //  String testJSON = "{\"menu\": {\"id\": \"file\", \"value\": \"Hello there\"}}";
    //  return testJSON;

        return subscriptionTierArray;
    }
}

次に、上記のコードが返すモデル:

package com.aimcloud.models;
// NOTE this does NOT import Globals
import java.sql.Types;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Map;

import org.json.JSONObject;
import com.aimcloud.util.LoggingUtils;

public class SubscriptionTierModel extends ModelPrototype
{
    private String name;
    private Integer num_studies;
    private Integer cost_viewing;
    private Integer cost_processing;
    private Integer active;

    protected void setupFields()
    {
        this.fields.add("name");
        this.fields.add("num_studies");
        this.fields.add("cost_viewing");
        this.fields.add("cost_processing");
        this.fields.add("active");
    }

    public SubscriptionTierModel()
    {
        super("subscription");
        this.setupFields();
    }

    public SubscriptionTierModel(Map<String, Object> map)
    {
        super("subscription");
        this.setupFields();
        this.initFromMap(map);
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return this.name;
    }

    public void setNum_Studies(Integer num_studies) {
        this.num_studies = num_studies;
    }

    public Integer getNum_studies() {
        return this.num_studies;
    }

    public void setCost_viewing(Integer cost_viewing) {
        this.cost_viewing = cost_viewing;
    }

    public Integer getCost_viewing() {
        return this.cost_viewing;
    }

    public void setCost_processing(Integer cost_processing) {
        this.cost_processing = cost_processing;
    }

    public Integer getCost_processing() {
        return this.cost_processing;
    }

    public void setActive(Integer active) {
        this.active = active;
    }

    public Integer getActive() {
        return this.active;
    }
}


public abstract class ModelPrototype {
    protected MySqlConnection mysql;

    protected ArrayList<String> fields;
    protected String table;
    protected Integer id = null;

    public Integer getId() {
        return this.id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    abstract protected void setupFields();

    public ModelPrototype() {
        mysql = MySqlConnection.getConnection();
        this.fields = new ArrayList<String>();
        this.fields.add("id");
    }

    public void initFromDbResult(List<Map<String, Object>> result) {
        if (result.size() >= 1)
        {
            Map<String, Object> userRow = result.get(0);
            this.initFromMap(userRow);

            if (result.size() > 1)
            {
            Thread.dumpStack();
            }
        } 
        else 
        {
            throw new WebApplicationException(ServerUtils.generateResponse(Response.Status.NOT_FOUND, "resource not found"));
        }
    }

    protected void initFromMap(Map<String, Object> map) {
        for (Map.Entry<String, Object> entry : map.entrySet()) {
            Object value = entry.getValue();
            // LoggingUtils.log(entry.getKey() + " " + entry.getValue().toString());
            if (value != null && this.fields.contains(entry.getKey())) {
                this.setField(entry.getKey(), value);
            }
        }
    }

....
4

2 に答える 2

1

RESTful Web サービスの Java 仕様である JAX-RS を読むことをお勧めします。すべての「javax.ws.rs.*」クラス/アノテーションは JAX-RS から来ています

JAX-RSは単なる仕様なので、仕様を実装する何かが必要です。このサービスを実行するために使用されるサードパーティの JAX-RS コンポーネントが存在する可能性があります。一般的な実装の 1 つである Jersey。Apache CXF は別のものです。

JAX-RS に戻ります。これを読むと、クラスのアノテーションがサービスの REST 特性を決定することがわかります。例えば、

@Path("subscription_tier")

URI BASE_PATH/subscription_tier を使用してクラスをリソースとして定義します。ここで、BASE_PATH はおそらく Web サービス フレームワークの構成ファイルで定義されます。

オブジェクトが JSON 応答に「自動的に」変換される方法については、Web サービス フレームワークの役割でもあります。これを実現するために、おそらくある種の標準的なオブジェクトから JSON へのマッピングを使用します。(私は CXF および XML リソースを扱ってきました。その場合、JAXB がマッピング メカニズムでした)。これは良いことです。Web サービスの開発者はこのマッピングについて心配する必要がなく、サービス自体の実装だけをコーディングすることに専念できるからです。

于 2013-07-18T00:17:22.857 に答える