@Path("/")public class JAXRSRestController { @Path("/JsonRequest") @POST @Consumes(MediaType.APPliCATION_JsON) public Response submitJsonRequest(SampleObject sampleObject,@Context httpheaders headers) { Ack ack = new Ack(); ack.setUniqueID(sampleObject.getID()); ack.setType(sampleObject.getname()); return Response.ok().entity(ack).build(); }}
如果请求采用以下格式,则不会消耗:
{ "sampleObject": { "ID": "12345","name": "somename" }}
但如果请求采用以下格式,则会被使用:
{ "ID": "12345","name": "somename"}
如何让控制器也使用Json根元素?
SampleObject类:
import org.codehaus.jackson.map.annotate.JsonRootname;@XmlRootElement(name = "sampleObject")@JsonRootname(value = "sampleObject")@XmlAccessorType(XmlAccesstype.FIELD)@XmlType(name = "SampleObject",propOrder = { "ID","name"})public class SampleObject { protected String ID; protected String name; public SampleObject(){} public SampleObject(String ID,String name) { this.ID = ID; this.name = name; } public String getID() { return ID; } public voID setID(String ID) { this.ID = ID; } public String getname() { return name; } public voID setname(String name) { this.name = name; }}
web.xml中:
<?xml version="1.0" enCoding= "UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" > <display-name>Wed Application</display-name> <servlet> <servlet-name>Jersey RESTFul WebSerivce</servlet-name> <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class> <init-param> <param-name>com.sun.jersey.config.property.packages</param-name> <param-value>com.jaxrs.rest</param-value> </init-param> <init-param> <param-name>com.sun.jersey.API.Json.POJOMapPingFeature</param-name> <param-value>true</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Jersey RESTFul WebSerivce</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping></web-app>解决方法 我能想到两种方法.如果这在您的应用程序中很常见,我建议您在ObjectMapper上启用解包.如果这是一次性情况,则包装器对象不是一个糟糕的选择.
A.启用展开功能
@JsonRootname仅在ObjectMapper上启用解包时才适用.您可以使用反序列化功能完成此 *** 作.请注意,这将解包所有请求:
public CustomObjectMapper() { super(); enable(DeserializationFeature.UNWRAP_ROOT_VALUE);}
如果您还没有注册自定义ObjectMapper,那么您需要添加一个provider以使用Jersey注册自定义配置. This answer解释了如何实现这一目标.
B.创建一个包装器
如果您不想全局展开,可以创建一个简单的包装器对象并省略@JsonRootname注释:
public class SampleObjectWrapper { public SampleObject sampleObject;}
然后更新您的资源方法签名以接受包装器:
public Response submitJsonRequest(SampleObjectWrapper sampleObjectWrapper,@Context httpheaders headers)总结
以上是内存溢出为你收集整理的web-services – 杰克逊没有使用JSON根元素全部内容,希望文章能够帮你解决web-services – 杰克逊没有使用JSON根元素所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)