2014-02-05 3 views
0

У меня есть приложение, и я хочу, чтобы принимать как XML и JSON, это мой POJOJSON демаршаллинга с помощью JAXB

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; 
    } 

} 

Мой интерфейс Остальное

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" ; 

} 

мой XML является

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

мой JSON:

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

    } 
} 

Мои проблемы/вопросы

1) Я постоянно получаю 415 ошибку, когда я использую JSON, почему это не демаршаллизации правильно?

мои зависимостей

<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> 

настроить заголовок как Content-Type:application/json

+0

415 является медиа не поддерживается, вы настройки типа контента в вашем запросе? – csn

+1

Когда вы пытаетесь использовать Json у клиента - вы устанавливаете заголовок Accept на «application/json» - потому что ваш заказ по умолчанию - xml сначала, а затем json - поэтому, если вы специально не спросите json, класс ресурсов по умолчанию будет равен xml. – mikemil

+0

@mikemil да, я устанавливаю заголовок в application/json. Infact Я знаю, что он принимает это, потому что, если я изменю метод, чтобы принять строку вместо объекта, я могу видеть запрос как String.Есть проблема с unmarshalling – user1801279

ответ

1

я бы предположить, что вы не настройки содержание правильно печатать на ваш запрос HTTP, который вы отправляете на службу ,

Я не знаю, какой инструмент вы используете для создания запроса я бы рекомендовал:

  • Cmd линии - завиток. вы просто не можете победить! Хром
  • Advanced Rest Client. Просто самое лучшее при работе с услугами по отдыху.

Обе из них позволят вам просмотреть необработанный HTTP-запрос и ответ и таким образом диагностировать вашу проблему.

Как правило, предпочтительным является пространство между двоеточием и значением при настройке заголовка запроса. т.е.

Content-Type: application/json; 

Так образец локон запрос будет выглядеть следующим образом:

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

Curl затем выплюнуть как необработанный запрос и ответ, так что вы можете четко видеть, что происходит. Продвинутый клиент отдыха делает то же самое, но также имеет множество инструментов для запоминания и просмотра ответов/запросов.

0

Попробуйте добавить это к вашему web.xml

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

Подробнее Jersey JSON Support

Смежные вопросы