LINUX.ORG.RU

Изменение имени класса в JAXB

 , ,


0

1

Есть очень простая схема (не моя, потому менять схему не стоит) в xsd, в ней повторяется имя элемента node

<xs:element name="path">
 <!-- type="path" -->
  <xs:complexType>
   <xs:sequence>
   <xs:element name="node" maxOccurs="unbounded" minOccurs="0">
    <xs:complexType>
     <xs:sequence>
      <!--...-->
      <xs:element name="points">
       <xs:complexType>
        <xs:sequence>
         <xs:element name="node" maxOccurs="unbounded" minOccurs="0">
          <xs:complexType>
           <xs:sequence>
            <xs:element name="x" minOccurs="0" type="xs:string"/>
            <xs:element name="y" minOccurs="0" type="xs:string"/>
<!-- ... -->

к ней есть еще более прямолинейный биндинг

<jxb:bindings 
    xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    jxb:version="2.1">
  <jxb:bindings schemaLocation="test.xsd" node="/xs:schema">
    <!-- Resolve Node class name conflict -->
    <jxb:bindings node="//xs:element[@name='path']/xs:complexType/xs:sequence/xs:element[@name='node']">
      <jxb:class name="pathNode"/>
    </jxb:bindings>
    <jxb:bindings node="//xs:element[@name='points']/xs:complexType/xs:sequence/xs:element[@name='node']">
      <jxb:property name="point"/>
      <jxb:class name="point"/>
    </jxb:bindings>
  </jxb:bindings>
</jxb:bindings>

при попытке сгенерить классы с этим биндингом xjc ругается что два класса имеют одно и то же имя Node, хотя, бл, ни один из них его уже иметь не должен.

если сделать autoNameResolution, то это чудо безусловно обрабатывает схему, и еще создает два указанных в биндинге класса, которые extend'ят созданные автоматом Node и Node2. Какого пса оно делает extend вместо замены имени хз.

Подскажите, где я туплю? Ну, помимо того что юзаю jaxb.

upd попытаюсь без мата... короче надо биндинг в этом случае прописывать не к элементу типа <jxb:bindings node="//xs:element[@name='points']/xs:complexType/xs:sequence/xs:element[@name='node']">, а к complexType этого элемента, в виде <jxb:bindings node="//xs:element[@name='points']/xs:complexType/xs:sequence/xs:element[@name='node']/xs:complexType">. И жеж не одна падла в документации на это не указала. Все ж очевидно, бл, спасибо... Допер после примера ниже. Видно что бинд идет к complexType, а почему - загадка века.

<xsd:element name="billingaddress">
    <xsd:complexType>
        <xsd:annotation>
          <xsd:appinfo>
            <jaxb:class name="PrimaryBillingAddress">
              <jaxb:javadoc>
                DOCUMENTATION
             </jaxb:javadoc>
             </jaxb:class>
           </xsd:appinfo>
         </xsd:annotation>

★★★★★

Последнее исправление: upcFrost (всего исправлений: 3)
Ответ на: комментарий от stevejobs

в плане target? уже пытался и с 2.0, и с 2.1, и с дефолтной 2.2 - один хрен.

upcFrost ★★★★★
() автор топика
Ответ на: комментарий от stevejobs

попытался заюзать другой плагин (maven), glassfish вместо apache. этот вроде жив и обновляется, в то время как апачевский плагин в репах давно протух. по идее их зависимости не пересекаются. хрен, та же картина. хотя в манах прозрачно сказано что jxb:class меняет имя класса, а не тупо экстендит его с другим именем

upcFrost ★★★★★
() автор топика
Ответ на: комментарий от upcFrost

ну блин страна вам дала отладчик чтобы посмотреть что не так, с виду тут только то что класс у тебя называется с маленькой буквы - это упорото, и некоторые не менее упоротые библиотеки могут это проверять. Хотя маловероятно. Больше вероятность что он твой маппинг игнорирует.

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от Deleted

класс у тебя называется с маленькой буквы

делал четко по ману, оно должно его автоматом с большой буквы писать. в манах как раз с маленькой, хз почему, но видимо есть какой-то глубинный смысл типа стандартной нотации имен параметров XML. а так да, с CamelCase я знаком.

страна вам дала отладчик

отладчик чего? xjc? разница при включении verbose - строчка INFO что «ок, ща попытаемся забацать классы». других различий нет.

Больше вероятность что он твой маппинг игнорирует.

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

upcFrost ★★★★★
() автор топика
Ответ на: комментарий от stevejobs

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

кхе, собирать из сорсов и дебажить генератор? это не через неделю, это месяца через два. в сорцы jaxb лезть совсем не хочется, чую там можно найти такое, что «архитектура» перегруженной пыховой вебморды раем покажется

upcFrost ★★★★★
() автор топика
Ответ на: комментарий от stevejobs

не, спасибо. я как-то раз с АТС логи снимал за пару недель чтоб косяк найти. больше не хочу. короче решил проблему. фееричные черти короче, все что могу сказать без мата

кстати самое смешное что работает для всех классов кроме корня. как обойти повтор корня, который везде назвали response, хз. распихать по разным пакетам не помогает, работает только если в несколько заходов делать по одному файлу.

upcFrost ★★★★★
() автор топика
Последнее исправление: upcFrost (всего исправлений: 1)
Ответ на: комментарий от stevejobs

в шапке добавил. соль в том что когда меняешь класс элемента, надо менять его не у самого элемента, а у его complexType. какой наркоман это придумал для меня загадка. и что самое смешное - вот для корневого элемента надо менять сам элемент. психи короче.

upcFrost ★★★★★
() автор топика
Последнее исправление: upcFrost (всего исправлений: 1)

Нашел у себя fine-tuned генерацию jaxb, может будет полезной. А биндинг-файлы, это да, только наугад пока звезды не сойдуться. Зато как сгенериться все - становится тепло и хорошо.

            <plugin>
                <!-- https://cxf.apache.org/cxf-xjc-plugin.html -->
                <groupId>org.apache.cxf</groupId>
                <artifactId>cxf-xjc-plugin</artifactId>
                <version>${version.cxf}</version>
                <executions>
                    <execution>
                        <id>myid</id>
                        <phase>generate-sources</phase>
                        <goals>
                            <goal>xsdtojava</goal>
                        </goals>
                        <configuration>
                            <xsdOptions>
                                <xsdOption>
                                    <extension>true</extension>
                                    <xsd>${project.basedir}/src/main/resources/my.xsd</xsd>
                                    <bindingFile>
                                        ${project.basedir}/src/main/resources/my.xjb</bindingFile>
                                    <extensionArgs>
                                        <arg>-Xcommons-lang</arg>
                                        <arg>-Xvalue-constructor</arg>
                                        <arg>-Xdefault-value</arg>
                                        <arg>-Xfluent-api</arg>
                                        <arg>-no-header</arg>
                                    </extensionArgs>
                                </xsdOption>
                            </xsdOptions>
                            <extensions>
                                <extension>org.jvnet.jaxb2_commons:jaxb2-commons-lang:2.3</extension>
                                <extension>org.jvnet.jaxb2_commons:jaxb2-value-constructor:3.0</extension>
                                <extension>org.jvnet.jaxb2_commons:jaxb2-default-value:1.1</extension>
                                <extension>org.jvnet.jaxb2_commons:jaxb2-fluent-api:3.0</extension>
                            </extensions>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
anonymous
()
Ответ на: комментарий от anonymous

спасибо. сам конфиг плагина у меня на 90% такой же, разве что no-header нету. самый сок был потом, когда внезапно выяснилось что разрабы предоставляют их API в двух форматах, xsd и json, и как раз xsd нифига не правильный, там ошибки в части классов (скажем массив точек Point2D.Double почему-то стал строкой).

upcFrost ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.