2012-07-18 163 views
2

我想通過REST調用使用Jersey來獲取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);  

回答

1

這是如果您的A類與B類或B類有任何關係,則可能與A類有關。

但是在你的代碼中,似乎沒有任何關係,所以關係是不可能的。

+0

謝謝。如果B擴展A,它會工作嗎? – sunny 2012-07-18 13:33:40

+0

類之間的關係與它有任何關係。請檢查我的答案。 – 2012-07-18 16:02:00

2

其實,這是可能的。

傑克遜將marshall/unmarshall類轉換爲JSON,而另一端只要能解析它就不會注意到它是哪個類。

但你的代碼中有幾個錯誤:

  • 讓你的屬性私有,然後提供getter/setter方法。這,對於每個Java類。
  • 註釋與@XmlRootElement的類至少,讓傑克遜就可以找到它們
  • 標註與@Produces和@Consumes方法將它們設置爲JSON

下面的代碼工作正常(我改變了格式XML爲方便起見,應該在JSON相同):

的TestServlet:

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

ClassA的:

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

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

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

ClassB的:

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

的輸出中爲大家好,今天的日期