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 注释类,以便杰克逊可以找到它们
  • 使用 @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

测试不同:

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 回答