1

ここに画像の説明を入力

JAX-RS に関するプロジェクト (宿題) があります。私は NetBeans、Jersey、および Tomcat を使用しています。たとえば、post メソッドでは、 '{"user":{"username":"accavdar", "gender":"M", "birthDate":"06.11.1982"}}' このようなリクエストが来た場合、この入力を解析して新しいユーザーをシステムに追加する必要があります。サンプル応答は次のようにする必要があります。

{
    "meta": {
        "code": 200
    },
    "data": {
        "message": "You successfully created a user."
    }
}

予想されるエラーは次のようになります。

{
    "meta": {
        "code": 101,
        "type": "FieldError",
        "errors": [
            {
                "fieldName": "fullname",
                "rejectedValue": null
            }
        ]
    }
}

もう 1 つの問題は、Get メソッドを使用すると、開発者がシステム内のすべてのユーザーを一覧表示したい場合があることです。応答は次のようになります。

{
  "meta": {
    "code": 200
  },
  "data": [
    {
      "id": 1,
      "username": "sample",
      "fullname": "sample",
      "gender": "M",
      "birthDate": "12.02.1990"
    },
    {
      "id": 2,
      "username": "sample",
      "fullname": "sample",
      "gender": "M",
      "birthDate": "21.09.1940"
    }
  ]
}

ユーザーをテキストファイルに保存したいのですが、ユーザーを保存する方法に制限はありません(データベースまたはメモリに保存できます)が、リクエスト入力を処理してそのようなレスポンスを生成する方法がわかりません。あなたに宿題をしてほしくないのですが、誰か私の問題についてヒントをいただけませんか?

注: JSON のみを使用します。"Content-Type: application/json" "Accept: application/json"

EDİT: #Bogdan さん、ご回答ありがとうございます。教えていただいたサイトを検索しました。その出力がどのように生成されるかを知りたいですか?:

{
    "meta": {
        "code": 200
    },
    "data": {
        "message": "You successfully created a user."
    }
}

また

{
  "meta": {
    "code": 200
  },
  "data": {
    "id": 1,
    "username": "jack",
    "fullname": "jack",
    "gender": "M",
    "birthDate": "12.12.2012"
  }
}

「メタ」クラスと「ユーザー」クラスがあります。

@XmlRootElement(name="data")
public class User {

    @XmlElement
    public int id ;
    @XmlElement
    public String username;
    @XmlElement
    public String fullname;
    @XmlElement
    public String gender;
    @XmlElement
    public String birthDate;

    public User(){

    }

@XmlRootElement(name="meta")
public class Meta {

    @XmlElement
    int code=200;

    public Meta(){

    }

また、この jaxbcontextresolver クラスがあります

@Provider
public class JAXBContextResolver implements ContextResolver<JAXBContext>{

    private JAXBContext context;
    private Class[] types = {User.class, Meta.class};


    public JAXBContextResolver() throws Exception {

        this.context = 
        new JSONJAXBContext(  JSONConfiguration.mapped().nonStrings("id").nonStrings("code").build(), types); 
    }

    @Override
    public JAXBContext getContext(Class<?> objectType) {
         for (Class type : types) {
             if (type == objectType) {
                 return context;
             }
         }

        return null;

    }

}

しかし、この応答構造を作成する方法はありますか?

4

1 に答える 1

4

アプリケーションはユーザーと連携します。これは、アプリケーションが処理し、クライアントが作成、更新、削除、および取得 (基本的にCRUD ) を行うリソースです。

ただし、ユーザーは抽象的なリソースであるため、サーバーとクライアントはこのリソースの表現を使用して相互に対話します。表現は、JSON形式(例のように)、XMLなどにすることができます。クライアントは、必要な表現のタイプを指定し、サーバーは、Content-Type. 要求/応答の本文はコンテンツ タイプと一致します。

これは Java アプリケーションであるため、アプリケーション コードではユーザーは Java オブジェクトとして表されます。リクエスト/レスポンスの本文を、ゲッターとセッターを使用してオブジェクトに変換する必要があります。JAXB を使用して XML 変換を行うことができ、Jackson のようなライブラリを使用して JSON を変換できます。もちろん、手動で文字列をオブジェクトに解析し、オブジェクトから文字列を出力することもできますが、それはより多くの作業になります。

クライアントは JSON を送信し、変換後に処理可能な Java オブジェクトを取得します。それらをアプリケーション スコープ マップ内のメモリに保持するか、ファイルまたはデータベース内に書き込んで、その表現をもう一度変更することができます。

アプリケーションは、リクエスト表現をオブジェクトに変換する特定のアクションに URL をバインドし、オブジェクトに対して操作を実行してから、それらを返し、クライアントが期待する表現に再度変換します。

以上はあくまで基本的な説明です。いくつかのJAX-RS チュートリアルに従えば、すべての質問に答えることができます(たとえば、クイック検索で REST with Java (JAX-RS) using Jersey - TutorialまたはREST: CRUD with JAX-RS (Jersey)が返されます。その他多数)。あなたの質問はあまりにもオープンエンドなので、障害物にぶつかったときにスタックオーバーフローに関する特定の質問を掘り下げて戻ってください。

EDIT :これに少し苦労しているようですので、基本的なサービスを追加して、ユーザーのリストとしましょう。

これまでのところ、サービス クラスについては何も言及していません。それが重要です。次のようなものです。

package com.test;

import java.util.ArrayList;
import java.util.List;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

@Path("/api")
public class Test {

    @GET
    @Path("/users")
    @Produces({ MediaType.APPLICATION_JSON })
    public UsersResponseWrapper getUsers() {
        List<User> users = new ArrayList<User>();

        User u1 = new User();
        u1.setId(1);
        u1.setFullname("Joe Doe");
        u1.setGender("M");
        u1.setUsername("joe.doe");
        u1.setBirthDate("1919-12-12");

        User u2 = new User();
        u2.setId(1);
        u2.setFullname("John Smith");
        u2.setGender("M");
        u2.setUsername("john.smith");
        u2.setBirthDate("1990-01-01");

        users.add(u1);
        users.add(u2);

        UsersResponseWrapper resp = new UsersResponseWrapper();
        resp.setMeta(new Meta(200));
        resp.setData(users);

        return resp;
    }
}

次に、ユーザー クラスとメタ クラス:

package com.test;

public class Meta {
    private int code;

    public Meta(int code) {
        this.code = code;
    }

    public Meta() {
        this.code = 200;
    }

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }
}

package com.test;

public class User {
    private int id;
    private String username;
    private String fullname;
    private String gender;
    private String birthDate;

    public int getId() {
        return id;
    }

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

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getFullname() {
        return fullname;
    }

    public void setFullname(String fullname) {
        this.fullname = fullname;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public String getBirthDate() {
        return birthDate;
    }

    public void setBirthDate(String birthDate) {
        this.birthDate = birthDate;
    }

}

JAXB プロバイダー:

package com.test;

import java.util.ArrayList;

import javax.ws.rs.ext.ContextResolver;
import javax.ws.rs.ext.Provider;
import javax.xml.bind.JAXBContext;

@Provider
public class JAXBContextResolver implements ContextResolver<JAXBContext> {
    private JAXBContext context;
    private static Class<?>[] types = {UsersResponseWrapper.class, User.class, Meta.class, ArrayList.class};

    public JAXBContextResolver() throws Exception {
        this.context = JAXBContext.newInstance(types);
    }

    @Override
    public JAXBContext getContext(Class<?> objectType) {
         for (Class<?> type : types) {
             if (type == objectType) {
                 return context;
             }
         }
        return null;
    }
}

web.xml からの何か:

<web-app xmlns="http://java.sun.com/xml/ns/javaee"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
      version="3.0">
 <servlet>
    <servlet-name>RestService</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
    <init-param>
      <param-name>com.sun.jersey.config.property.packages</param-name>
      <param-value>com.test</param-value>
    </init-param>
  </servlet>
  <servlet-mapping>
    <servlet-name>RestService</servlet-name>
    <url-pattern>/*</url-pattern>
  </servlet-mapping>
</web-app>

結果のラッパー:

package com.test;

import java.util.List;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class UsersResponseWrapper {
    private Meta meta;
    private List<User> data;

    public Meta getMeta() {
        return meta;
    }

    public void setMeta(Meta meta) {
        this.meta = meta;
    }

    public List<User> getData() {
        return data;
    }

    public void setData(List<User> data) {
        this.data = data;
    }
}

結果がメタコンテンツとデータコンテンツの両方で形成されているため、この最後のクラスが問題になっていると思います。オブジェクトを返す必要があることを忘れないでください ( Jersey ディストリビューションのデフォルトの Jackson マッパーがそれを処理します)。上記はこれを返すはずです(フォーマットは含まれていません):

{
    "data": [
        {
            "birthDate": "1919-12-12",
            "fullname": "Joe Doe",
            "gender": "M",
            "id": "1",
            "username": "joe.doe"
        },
        {
            "birthDate": "1990-01-01",
            "fullname": "John Smith",
            "gender": "M",
            "id": "1",
            "username": "john.smith"
        }
    ],
    "meta": {
        "code": "200"
    }
}

詳細としてこれに追加できるのはこれくらいです。結局のところ、それはあなたの宿題です:)。あなたは元気です、ただ続けてください。

于 2013-01-20T16:33:36.070 に答える