2012-07-18 123 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()); 
} 

的输出中为大家好,今天的日期