在JAX-RS中使用JSON to java unmarshelling在POST

时间:2015-12-01 00:08:37

标签: java json jaxb jax-rs

我正在尝试构建一个JAX-RS rest api,它在POST方法中接受一个(JSON)UnMarshelled类,此刻我只返回相同的类(作为JSON回收)。

当我返回对象时,我在浏览器(postman客户端)中获得了一个普通的{}。我正在使用此question:中提供的数据。

我的理解是否正确,我发送的相同JSON应该按原样返回?,如果是,不确定为什么只有{}被接收或者我完全错过了什么。

以下是我的代码:

@Path( “/元数据”) 公共类MetadataResource {

//Anil: This is the method that will be called when a post at /metadata comes  
@Consumes(MediaType.APPLICATION_JSON)
@POST
@Produces(MediaType.APPLICATION_JSON)
public ObjectA CreateMetadata_JSON(ObjectA metadata) {

    return metadata;

}

类对象A:

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "objectA")
public class ObjectA {
    @XmlElement(required = true)
    protected String propertyOne;
    @XmlElement(required = true)
    protected String propertyTwo;
    @XmlElement(required = true)
    protected ObjectB objectB;
}

和类对象B:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "objectB")
public class ObjectB {
    @XmlElement(required = true)
    protected String propertyA;
    @XmlElement(required = true)
    protected boolean propertyB;
}

发送的json对象是:

{ 
  "objectA" : 
  { 
    "propertyOne" : "some val", 
    "propertyTwo" : "some other val",
    "objectB" : 
    {
      "propertyA" : "some val",
      "propertyB" : "true" 
    }
  }
}

1 个答案:

答案 0 :(得分:1)

因为根对象包装器

{ 
  "objectA" : 

}

通常,期望的JSON对象就是您拥有的所有内容,不包括上述根值包装器。如果需要准确使用JSON,则需要将JSON提供程序配置为 un - 包装根值。如果你不这样做,那么提供者不会识别JSON中的任何属性,而是留下一个带有一堆空值的对象。因此,当您序列化同一个对象时,提供程序会忽略null,并且您将留下一个空的JSON对象{ }

所以简单的解决方案就是使用

{ 
  "propertyOne" : "some val", 
  "propertyTwo" : "some other val",
  "objectB" : 
  {
    "propertyA" : "some val",
    "propertyB" : "true" 
  }
}

如果你需要root值包装器,那么我需要知道你正在使用什么JSON提供程序,然后我才能尝试帮助你如何配置它来解包根值。

更新

对于MOXy,如果要将其配置为包装/解包根值,则可以setIncludeRootMoxyJsonConfig为真。您需要提供ContextResolver才能发现它。

@Provider
public class MoxyConfigResolver implements ContextResolver<MoxyJsonConfig> {

    private final MoxyJsonConfig config;

    public MoxyConfigResolver() {
        config = new MoxyJsonConfig();
        config.setIncludeRoot(true);
    }

    @Override
    public MoxyJsonConfig getContext(Class<?> type) {
        return config;
    } 
}