2015-06-26 2 views
1

У меня есть webresource, который возвращает этот XML:Простейшее Джерси Клиент для XML RESTful вопрос

<?xml version="1.0" encoding="utf-8"?> 
<messagebody 
    xmlns="http://api.esendex.com/ns/"> 
    <bodytext>blablabla</bodytext> 
    <characterset>blabla</characterset> 
</messagebody> 

я написал простой класс для этого:

package com.example; 
import javax.xml.bind.annotation.XmlAttribute; 
import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlRootElement; 
import javax.xml.bind.annotation.XmlType; 

@XmlRootElement(name = "messagebody") 
public class MessageBody { 
    private String xmlns; 
    private String bodytext; 
    private String characterset; 

    public String getXmlns() { 
     return xmlns; 
    } 

    @XmlAttribute 
    public void setXmlns(String xmlns) { 
     this.xmlns = xmlns; 
    } 

    public String getBodytext() { 
     return bodytext; 
    } 

    @XmlElement 
    public void setBodytext(String bodytext) { 
     this.bodytext = bodytext; 
    } 

    public String getCharacterset() { 
     return characterset; 
    } 

    @XmlElement 
    public void setCharacterset(String characterset) { 
     this.characterset = characterset; 
    } 
} 

И простой основной класс:

package com.example; 

import javax.ws.rs.core.MediaType; 

import com.sun.jersey.api.client.Client; 
import com.sun.jersey.api.client.ClientResponse; 
import com.sun.jersey.api.client.WebResource; 
import com.sun.jersey.api.client.filter.HTTPBasicAuthFilter; 
/** 
* Hello world! 
* 
*/ 
public class App 
{ 
    public static void main(String[] args) 
    { 
     try { 

      Client client = Client.create(); 
      client.addFilter(new HTTPBasicAuthFilter("***", "****")); 
      WebResource webResource = client 
        .resource("http://myresturl"); 


      ClientResponse response = webResource.type(MediaType.APPLICATION_XML).get(ClientResponse.class); 
      if (response.getStatus() != 200) { 
       throw new RuntimeException("Failed : HTTP error code : " 
         + response.getStatus()); 
      } 

      MessageBody body = response.getEntity(MessageBody.class); 
      System.out.println(body.getBodytext()); 


     } catch (Exception e) { 

      e.printStackTrace(); 

     } 
    } 
} 

Я передаю аутентификацию, и я получаю право на XML, но что-то не так с xmmhehelling. Я получаю следующее исключение:

javax.ws.rs.WebApplicationException: javax.xml.bind.UnmarshalException: unexpected element (uri:"http://api.esendex.com/ns/", local:"messagebody"). Expected elements are <{}messagebody> 

Насколько я понимаю, я правильно установил аннотацию.

Что я делаю неправильно?

ответ

0

JAXB имеет собственный механизм управления пространством имен. Я предполагаю, что он терпит неудачу (из-за отсутствия надлежащей аннотации), прежде чем он увидит, что ваш класс хочет обрабатывать пространство имен.

Вы можете это исправить, создав package-info.java файл в том же пакете, класс затем использовать @XmlSchema аннотацию объявить пространство имен

@XmlSchema(
     elementFormDefault = XmlNsForm.QUALIFIED, 
     namespace = "http://api.esendex.com/ns/" 
) 
package com.example; 

import javax.xml.bind.annotation.XmlNsForm; 
import javax.xml.bind.annotation.XmlSchema; 

Вы можете увидеть больше об обработке пространства имен, here и here

+1

Благодаря! На самом деле мне удалось это исправить, добавив аннотацию в один файл: @XmlRootElement (name = "messagebody", namesspace = "http://api.esendex.com/ns/"). –

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