JAXB с демаршализацией пространства имен (используя Джерси из сервиса REST) - PullRequest
4 голосов
/ 23 июня 2010

Я пытаюсь демонтировать простой XML-документ из публичного API от Convio.Я не получаю никаких ошибок компилятора со следующим кодом, но он также не даст результата.Значения равны нулю.Если я удаляю элементы схемы и пространства имен из документа xml и удаляю атрибут пространства имен из POJO, тогда он будет работать нормально.Чего мне не хватает, чтобы иметь возможность работать с документом / пространством имен xsd?

Пример XML, который я пытаюсь проанализировать

<?xml version='1.0' encoding='UTF-8'?>
<getSingleSignOnTokenResponse xsi:schemaLocation="http://convio.com/crm/v1.0 http://service.convio.net/xmlschema/crm.public.v1.xsd" xmlns="http://convio.com/crm/v1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <token>abcdefghijklmnopqrstuvwxyz</token>
  <cons_id>0123456789</cons_id>
</getSingleSignOnTokenResponse>

И POJO с аннотациями:

@XmlRootElement(name = "getSingleSignOnTokenResponse", namespace = "http://convio.com/crm/v1.0")
public class SingleSignOnResponseBean
{
  @XmlElement(name = "token")
  public String token;
  @XmlElement(name = "cons_id")
  public int consId;
}

Теперь я использую Джерси для выполнения реальной работы, но, поскольку я не смог разобрать его с помощью Джерси, я настроил unmarshaller вручную, используя статический xml-файл на моем компьютере с результатом XML.выше:

    JAXBContext jc = JAXBContext.newInstance(new Class[] {org.orgname.utility.convio.sso.api.SingleSignOnResponseBean.class});
    Unmarshaller u = jc.createUnmarshaller();
    SingleSignOnResponseBean bean2 = (SingleSignOnResponseBean) u.unmarshal(new File("C:/token.xml"));
    System.out.println(bean2.token);

Это, вероятно, очень просто, и я просто не вижу, почему он не будет работать, если определены элементы схемы и пространства имен.Я видел некоторые другие комментарии о настройке какого-то SAX-фильтра для удаления пространства имен, но, поскольку я прихожу через REST-вызов из Джерси напрямую, я не верю, что у меня есть возможность сделать это.Есть идеи?

Ответы [ 2 ]

6 голосов
/ 20 июля 2010

Вы можете добавить аннотацию уровня пакета (это делается в классе с именем package-info) и указать elementFormDefault = "qualised", тогда вам не нужно будет квалифицировать каждую аннотацию @XmlElement.

@javax.xml.bind.annotation.XmlSchema(
   namespace="http://convio.com/crm/v1.0".
   elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED) 
package com.convio.crm; 

Для получения дополнительной информации о JAXB и пространствах имен см .:

5 голосов
/ 23 июня 2010

Пространство имен не «наследуется» полями связанного класса. Вам также необходимо определить пространство имен в полях:

@XmlRootElement(name = "getSingleSignOnTokenResponse", namespace = "http://convio.com/crm/v1.0")
public class SingleSignOnResponseBean
{
  @XmlElement(name = "token", namespace = "http://convio.com/crm/v1.0")
  public String token;
  @XmlElement(name = "cons_id", namespace = "http://convio.com/crm/v1.0")
  public int consId;
}

Если их опустить, поля возвращаются в пространство имен «по умолчанию» (т. Е. Без пространства имен).

Это слегка раздражает, но так оно и есть.

...