Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > XML, XSL > JAXB Unmarshalling


Автор: Zloxa 3.2.2012, 16:47
Пытаюсь средствами забиндить XMLчик, который содержит конфигурацию клиента.
В результате выполнения метода unmarshal, получаю объект корневого класса, свойства которого == null.

Перед публикацией поста на форуме, попробовал на упрощенном примере схожей структуры, вне проекта. Воспроизвести не смог, сбоку все отлично работает. Потому выкладываю полотнища, не обессудьте.

xsd:
Код

<?xml version="1.0" encoding="UTF-8" ?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
            xmlns="config.pospostclient"
            targetNamespace="config.pospostclient" 
>
  <xsd:element name="Config">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="OracleConnection">
          <xsd:complexType>
            <xsd:sequence>
              <xsd:element name="ConnectionString" type="xsd:string"/>
              <xsd:element name="User" type="xsd:string"/>
              <xsd:element name="Password" type="xsd:string"/>
            </xsd:sequence>
          </xsd:complexType>
        </xsd:element>
        <xsd:element name="FtpConnection">
          <xsd:complexType>
           <xsd:sequence>
               <xsd:element name="TemporaryFileDir" type="xsd:string" minOccurs="0"/>
               <xsd:element name="Upload" type="FTPConnectionType"/>
               <xsd:element name="Download" type="FTPConnectionType"/>
           </xsd:sequence>
          </xsd:complexType>
        </xsd:element>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
  <xsd:complexType name="FTPConnectionType">
    <xsd:sequence>
      <xsd:element name="Host" type="xsd:string"/>
      <xsd:element name="User" type="xsd:string"/>
      <xsd:element name="Password" type="xsd:string"/>
      <xsd:element name="Dir" type="xsd:string"/>
    </xsd:sequence>
  </xsd:complexType>
</xsd:schema>

с помощью утилиты формирую классы
Код

>xjc.exe config.xsd
parsing a schema...
compiling a schema...
pospostclient\config\Config.java
pospostclient\config\FTPConnectionType.java
pospostclient\config\ObjectFactory.java
pospostclient\config\package-info.java

В ресурсе проекта создаю xml:
Код

<?xml version="1.0" encoding="windows-1251"?>
<Config xmlns="config.pospostclient" 
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
          xsi:schemaLocation="config.pospostclient src/config.xsd"
          xsi:elementFormDefault="qualified"
          >
  <OracleConnection>
    <ConnectionString>****</ConnectionString>
    <User>***</User>
    <Password>***</Password>
  </OracleConnection>
  <FtpConnection>
    <TemporaryFileDir>./tmp</TemporaryFileDir>
    <Upload>
      <Host>***</Host>
      <User>***</User>
      <Password>***</Password>
      <Dir>***</Dir>
    </Upload>
    <Download>
      <Host>***</Host>
      <User>***</User>
      <Password>***</Password>
      <Dir>***</Dir>
    </Download>
  </FtpConnection>
</Config>

выполняю:
Код

public class test {
    public static void main (String[] args) throws JAXBException {
        JAXBContext context = JAXBContext.newInstance("pospostclient.config");      
        Unmarshaller unmarshaller = context.createUnmarshaller();
        InputStream ris = ConfigLoader.class.getClass().getResourceAsStream("/config.xml");
        Config config = (Config)unmarshaller.unmarshal(ris);
        Config.OracleConnection oraConfig = config.getOracleConnection();
        System.out.println(oraConfig.getConnectionString());
    }
}

В результате config.getOracleConnection() возвращает null, соответственно получаю на следующей строке NullPointerException

Посоветуйте плиз, куда смотреть, где искать косяк?.


Автор: LSD 3.2.2012, 17:15
Код

<?xml version="1.0" encoding="windows-1251"?>
<c:Config xmlns:c="config.pospostclient"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="config.pospostclient zloxa.xsd">

    <OracleConnection>
        <ConnectionString>aaa</ConnectionString>
        <User>aaa</User>
        <Password>aaa</Password>
    </OracleConnection>
    <FtpConnection>
        <TemporaryFileDir>./tmp</TemporaryFileDir>
        <Upload>
            <Host>***</Host>
            <User>***</User>
            <Password>***</Password>
            <Dir>***</Dir>
        </Upload>
        <Download>
            <Host>***</Host>
            <User>***</User>
            <Password>***</Password>
            <Dir>***</Dir>
        </Download>
    </FtpConnection>
</c:Config>

Автор: Zloxa 3.2.2012, 17:21
Симптоматика устранилась после добавления параметра схемы elementFormDefault="qualified" 
 smile

Добавлено через 5 минут и 10 секунд
Цитата(LSD @  3.2.2012,  17:15 Найти цитируемый пост)
<c:Config

Да, так тоже работает, и при не установленном elementFormDefault, спасибо, буду разбираться что это значит.  smile 

Автор: LSD 3.2.2012, 17:48
Думаю тут более подходящее место.


Цитата(Zloxa @  3.2.2012,  18:21 Найти цитируемый пост)
Да, так тоже работает, и при не установленном elementFormDefault, спасибо, буду разбираться что это значит.

Это явное указание принадлежности к неймспейсу. Правда я не понимаю почему у вложенных элементов его не надо указывать.

Автор: Zloxa 6.2.2012, 12:47
Цитата(LSD @  3.2.2012,  17:48 Найти цитируемый пост)
Думаю тут более подходящее место.

Не, в жаве было лучше. Походу это какая то особенность именно JAXB.

На сколько я могу судить из "http://www.w3.org/TR/2004/REC-xmlschema-0-20041028/#GlobalvsLocal", " both schema approaches can validate the same, namespace defaulted, document". А у меня, в виду того, что я указал пространство имен по умолчанию, это был именно namespace defaulted документ. Т.е. он валидный, но не читается почему-то JAXB, и, более того, не поднимает ошибку. smile 

Цитата(LSD @  3.2.2012,  17:48 Найти цитируемый пост)
. Правда я не понимаю почему у вложенных элементов его не надо указывать. 

http://www.w3.org/TR/2004/REC-xmlschema-0-20041028/#po1.xml объясняется.
Если я правильно понял, при  elementFormDefault="unqualified", префиксы должны применяться только к глобальным элементам схемы - элементам объявленным в корне схемы. Прочие элементы считаются локальными в этом пространстве имен.

Автор: LSD 6.2.2012, 15:16
Цитата(Zloxa @  6.2.2012,  13:47 Найти цитируемый пост)
Походу это какая то особенность именно JAXB.

Я проверил сторонним валидатором (на базе MSXML) он тоже сказал, что <c:Config - правильно, а <Config - нет.

Автор: Zloxa 6.2.2012, 19:26
Цитата(LSD @  6.2.2012,  15:16 Найти цитируемый пост)
проверил

Ухты... он оказывается не валидирует вовсе.  smile 
Судя по тому времени, что уходит на загрузку этого XML, я полагал что валидация таки производится и проходит успешно.  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)