【问题标题】:Jersey object mapping泽西对象映射
【发布时间】:2012-07-17 13:03:34
【问题描述】:

我想使用 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);    

【问题讨论】:

    标签: java json jersey


    【解决方案1】:

    如果您的 A 类与 B 类有任何关系,或者 B 与 A 类有关系,则有可能。

    但是在您的代码中似乎没有任何关系,因此不可能有关系。

    【讨论】:

    • 类之间的关系与它有什么关系。请检查我的答案。
    【解决方案2】:

    其实是可以的。

    Jackson 会将类编组/解组为 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;
        }
    }
    

    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 和今天的日期

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-17
      • 1970-01-01
      • 1970-01-01
      • 2014-07-21
      • 1970-01-01
      • 1970-01-01
      • 2018-01-31
      相关资源
      最近更新 更多