我正在尝试构建一个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"
}
}
}
答案 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,如果要将其配置为包装/解包根值,则可以setIncludeRoot
中MoxyJsonConfig
为真。您需要提供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;
}
}