简体   繁体   English

使用jaxb进行JSON解组

[英]JSON unmarshalling using jaxb

I have an application and I want it to accept both XML and JSON , this is my POJO 我有一个应用程序,我希望它接受XML和JSON,这是我的POJO

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;


// Class to marshall and unmarshall the XML and JSON to POJO

 // This is a class for the request JSON and XML


@XmlRootElement
public class KeyProvision {

    private String Consumer ; 
    private String API ; 
    private String AllowedNames ; 


    public void setConsumer( String Consumer)
    {
        this.Consumer= Consumer;

    }


    public void setAPI( String API){

        this.API = API;

    }


    public void setAllowedNames(String AllowedNames){

        this.AllowedNames = AllowedNames;

    }

     @XmlElement(name="Consumer")
    public String  getConsumer(){

        return Consumer;
    }

     @XmlElement(name="API")
    public String getAPI(){

        return API;
    }

     @XmlElement(name="AllowedNames")
    public String getAllowedNames(){

        return AllowedNames;
    }

}

My rest interface is 我的休息界面是

    import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

@POST
     @Path("/request")
     @Consumes({MediaType.APPLICATION_XML,MediaType.APPLICATION_JSON})
     @Produces({MediaType.APPLICATION_XML,MediaType.APPLICATION_JSON})
     public Response getRequest(KeyProvision keyInfo){

    /* StringReader reader = new StringReader(keyInfo); // this code just leads to an execution failure for some reason 
     try{
         JAXBContext jaxbContext = JAXBContext.newInstance(KeyProvision.class);

         Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
         KeyProvision api = (KeyProvision) jaxbUnmarshaller.unmarshal(reader);
         System.out.println(api);

     }   catch(JAXBException e){
         e.printStackTrace();

     }
      */

     String result = "Track saved : " + keyInfo;
     return Response.status(201).entity(result).build() ;

  //   return "success" ;

 }

my XML is 我的XML是

<?xml version="1.0" encoding="UTF-8"?>
<KeyProvision>
<Consumer> testConsumer </Consumer>
<API>posting</API>
<AllowedNames> google</AllowedNames>
</KeyProvision>

my JSON is 我的JSON是

{
    "KeyProvision": {
        "Consumer": "testConsumer",
        "API": "posting",
        "AllowedNames": "google",

    }
}

My problems/questions are 我的问题/问题是

1) I keep getting an 415 error when I use the JSON , why is this not unmarshalling properly? 1)使用JSON时,我总是收到415错误,为什么不能正确解组?

my dependencies are 我的依赖是

   <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-server</artifactId>
        <version>1.8</version>

    </dependency>

    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-client</artifactId>
        <version>1.8</version>
    </dependency>

I set up the header as Content-Type:application/json 我将标题设置为Content-Type:application/json

I would take a guess that you are not setting the content type correctly on your http request which you are sending to the service. 我猜您在发送给服务的http请求上没有正确设置内容类型。

I dont know what tool you are using for creating a request i would recommend: 我不知道您会使用哪种工具来创建请求,我建议:

  • Cmd line - curl. Cmd线-卷曲。 you just cant beat it! 您就是无法击败它! Chrome
  • Advanced Rest Client . 高级休息客户 Simply the best when working with rest services. 当使用休息服务时,这就是最好的选择。

Both of these will allow you to see the raw http request and response and thus diagnose your problem. 这两种方法都可以使您看到原始的http请求和响应,从而诊断出问题。

Generall as a rule of thumb a space between colon and value when setting a request header is preferable. 一般而言,一般来说,在设置请求标头时,冒号和值之间应留有空格。 ie

Content-Type: application/json;

So a sample curl request would look like this: 因此,示例卷曲请求将如下所示:

curl -X POST -H "Content-Type: application/json" -d '{"KeyProvision":{"Consumer":"testConsumer","API":"posting","AllowedNames":"google"}}' http://localhost:8080/request

Curl will then spit out both raw request and response so you can clearly see what's happening. 然后,Curl将吐出原始请求和响应,因此您可以清楚地看到正在发生的事情。 Advanced rest client does same but also got many tools for remembering and viewing responses/requests. 高级休息客户端也可以做到这一点,但也有很多工具可以记住和查看响应/请求。

Try adding this to your web.xml 尝试将其添加到您的web.xml

<init-param>
    <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
    <param-value>true</param-value>
</init-param>

More info Jersey JSON Support 更多信息Jersey JSON支持

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM