2

Jersey を使用して、REST 呼び出しで Java オブジェクトを取得したいと思います。質問: A がすべて B のメンバーを持っている場合、クラス A のオブジェクトを送信し、クラス B のオブジェクトを受信できますか?

例を示しましょう:

 class A {
    String one;
    Date two;
    int three;
 }

 class B {
    Date two;
    int three;
 }

たとえば、REST サービスがあるとします。

class MyREST {

  @GET
  @Path("somepath")
  public void getThing() {
     return new A();
{

そして、私はそれをコードで呼び出します:

Client client = Client.create();
WebResource scResource = client.resource("somePath");

MyClass result = scResource.type(MediaType.APPLICATION_JSON_TYPE).accept(MediaType.APPLICATION_JSON_TYPE).get(B.class);    
4

2 に答える 2

2

実際、それは可能です。

Jackson はクラスを JSON にマーシャリング/アンマーシャリングしますが、相手側はそれを解析できる限り、それがどのクラスであったかを認識しません。

しかし、あなたのコードにはいくつかのエラーがあります:

  • 属性を非公開にしてから、getter/setter メソッドを提供します。これは、すべての Java クラスに適用されます。
  • 少なくとも @XmlRootElement でクラスに注釈を付けて、Jackson がそれらを見つけられるようにします。
  • @Produces および @Consumes でメソッドにアノテーションを付け、JSON に設定します。

次のコードは正常に動作します (便宜上、形式を XML に変更しました。JSON でも同じである必要があります)。

テストサーブレット:

@Path("/testDifferentClass")
public class TestServlet {

    @GET
    @Produces(MediaType.APPLICATION_XML)
    @Consumes(MediaType.APPLICATION_XML)
    public ClassA getClassA() {
        ClassA classA = new ClassA();
        classA.setOne("Hello");
        classA.setTwo(new Date());
        classA.setThree(1);
        return classA;
    }
}

クラスA:

@XmlRootElement(name = "common")
public class ClassA {

    private String one;
    private Date two;
    private int three;

    public String getOne() {
        return one;
    }
//more getters and setters

クラスB:

@XmlRootElement(name="common")
public class ClassB {

    private String one;
    private Date two;

    public String getOne() {
        return one;
    }
//more getters and setters

TestDifferent:

public void test() {
    Client client = Client.create();
    WebResource scResource = client.resource("http://localhost:8080/services/testDifferentClass");

    ClassB result = scResource.type(MediaType.APPLICATION_XML).accept(MediaType.APPLICATION_XML).get(ClassB.class);
    System.out.println(result.getOne());
    System.out.println(result.getTwo());
}

出力は Hello と今日の日付です

于 2012-07-18T16:01:02.727 に答える
1

クラスAがクラスBと関係があるか、BがクラスAと関係がある場合に可能です。

しかし、あなたのコードでは関係がないように見えるので、関係では不可能です。

于 2012-07-18T13:30:53.667 に答える