我想使用 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);
最佳答案
事实上,这是可能的。
Jackson 会将类编码/解编为 JSON,而另一端只要能够解析它就不会注意到它是哪个类。
但是您的代码有几个错误:
- 将您的属性设为私有(private),然后提供 getter/setter 方法。对于每个 java 类都是如此。
- 至少使用 @XmlRootElement 对类进行注释,以便 Jackson 可以找到它们
- 使用 @Produces 和 @Consumes 注释方法,并将其设置为 JSON
下面的代码工作正常(为了方便,我将格式更改为 XML,它在 JSON 中应该是相同的):
测试Servlet:
@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 和今天的日期
关于java - Jersey 对象映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11542315/