Никакие перечисления, сгенерированные jax-ws ri 2.2.1 для файла amazon ecs wsdl - PullRequest
7 голосов
/ 21 ноября 2010

Я пытаюсь сгенерировать артефакты для следующего amazon wsdl:
http://webservices.amazon.com/AWSECommerceService/AWSECommerceService.wsdl

, используя следующую задачу муравья:

<taskdef name="wsimport" classname="com.sun.tools.ws.ant.WsImport">
    <classpath>
        <pathelement location="${BUILD_LIBS}/jaxws-ri/lib/jaxws-tools.jar"/>
    </classpath>
</taskdef>

<target name="wsimport" depends="init">
    <delete dir="${generated.src}" />
    <mkdir dir="${generated.src}"/>
    <wsimport
        debug="true"
    keep="true"
    verbose="true"
    destdir="${generated.src}"
    package="com.amazon.webservices.ecs"
    wsdl="wsdl/AWSECommerceService.wsdl"/>
</target>

, но нет артефактов javaсоздаются для следующего элемента, который выглядит следующим образом:

<xs:element name="Condition">
    <xs:simpleType>
        <xs:restriction base="xs:string">
            <xs:enumeration value="All"/>
            <xs:enumeration value="New"/>
            <xs:enumeration value="Used"/>
            <xs:enumeration value="Collectible"/>
            <xs:enumeration value="Refurbished"/>
       </xs:restriction>
   </xs:simpleType>
</xs:element>

По существу, никакие перечисления не генерируются, даже если генерируются все остальные элементы.Кто-нибудь видел эту проблему раньше?Я использую jax-ws ri 2.2.1 http://jax -ws.java.net / 2.2.1 /
Спасибо

Ответы [ 2 ]

5 голосов
/ 03 декабря 2010

, на что ссылается Puspendu, настройка привязки клиента JAXB в точности / очень близка к тому, что вам нужно - вам нужно использовать настройку клиента JAX-WS для вашего примера. Настройки JAXB и JAX-WS, по существу, позволяют дополнить определение элементов схемы для WSDL / схем, которые вы не контролируете. Есть МНОГИЕ разные вещи, которые вы можете выполнить, такие как сопоставление имен элементов XML с пользовательскими элементами Java, изменение сгенерированного API и ответ на ваш вопрос, создание безопасных для типов классов перечисления для элементов, ограниченных перечислением.

Существует два способа / части настройки клиента для JAX-WS.

1) если WSDL импортирует файл внешней схемы 2) если WSDL содержит полное определение схемы без каких-либо импортов

если wsdl импортирует файл внешней схемы,

в основном вам нужно создать новый файл (обычно с расширением jxb, но это действительно не имеет значения), который вы будете поддерживать вместе с wsdl, для которого вы генерируете заглушку / api клиента. обычно я называю эти файлы schema-file-name_clientcustomization.jxb

каждый раз, когда вы получаете обновленный wsdl, вы должны проверить, что ваш файл JXB все еще действителен для этого wsdl. Самыми большими вещами, которые я нашел, особенно с ограничениями enum, являются изменения ограниченных значений, изменения пространства имен, изменения имени типа и т. Д.

содержимое этого нового файла будет выглядеть примерно так:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

<jxb:bindings 
  xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
  xmlns:jxb="http://java.sun.com/xml/ns/jaxb"     
  targetNamespace="http://java.sun.com/xml/ns/jaxb" 
   version="1.0">

    <jxb:bindings schemaLocation="NameOfYourSchemaFile.xsd" 
         node="/xsd:schema[@targetNamespace='SCHEMANAMESPACE']">
        <jxb:schemaBindings>
            <jxb:package name="com.amazon.webservices.ecs" />
        </jxb:schemaBindings>

        <jxb:bindings node="xsd:element[@name='Condition']/xsd:simpleType">
            <jxb:typesafeEnumClass name="ConditionEnum" >
                <jxb:typesafeEnumMember value="All" name="ALL" />
                <jxb:typesafeEnumMember value="New" name="NEW" />
                <jxb:typesafeEnumMember value="Used" name="USED" />
                <jxb:typesafeEnumMember value="Collectible" name="COLLECTIBLE" />
                <jxb:typesafeEnumMember value="Refurbished" name="REFURBISHED" />
            </jxb:typesafeEnumClass>
        </jxb:bindings>
         </jxb:bindings>
</jxb:bindings>

По сути, этот файл определяет расширение, которое должно быть сделано для ссылочного файла xsd. все элементы привязок в этом файле имеют атрибут узла, который является выражением XPATH, которое выбирает элемент схемы, который вы хотите дополнить. в этом примере у меня нет пространства имен или другой информации, поэтому я указал XPATH, чтобы выбрать только простое объявление типа элемента. внутри этой привязки мы определяем класс типовafeenum, это заставляет jaxb / wsimport генерировать класс enum для представления ссылочного простого типа. поскольку это простой анонимный тип, он фактически определяет класс только для ссылочного элемента. Сгенерированный класс будет ENUM, члены которого определяются атрибутом «name» элемента typesafeEnumMember.

чтобы использовать этот файл JXB, вам нужно сослаться на него в вашей задаче ant, например:

<wsimport
        debug="true"
    keep="true"
    verbose="true"
    destdir="${generated.src}"
    package="com.amazon.webservices.ecs"
    wsdl="wsdl/AWSECommerceService.wsdl">

    <binding dir="wsdl" includes="*.jxb"/>

</wsimport>

если WSDL определяет всю схему внутренне, то вам нужно использовать файл настройки JAX-WS. Этот случай соответствует вашему вопросу.

http://jax -ws.java.net / nonav / 2.1.7 / Docs / customizations.html

Настройка клиента JAX-WS очень похожа на настройку JAXB. Идея идентична, по большей части часть файла настройки JAX-WS будет изменять сгенерированные артефакты, которые конкретно связаны с WSDL, тогда как встроенная настройка JAXB выполняет ту же функцию, что и внешний файл настройки: она изменяет созданные объекты на основе на схеме.

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

Этот пример, который я на самом деле тестировал и проверял для создания класса Enum для элемента, о котором вы задаете вопросы, так что вы можете дословно скопировать этот пример настройки JAX-WS.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

<jaxws:bindings
        wsdlLocation="AWSECommerceService.wsdl" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
    xmlns:jaxws="http://java.sun.com/xml/ns/jaxws"
    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
    >

    <jaxws:bindings node="wsdl:definitions/wsdl:types/xsd:schema[@targetNamespace='http://webservices.amazon.com/AWSECommerceService/2010-11-01']">
        <jaxb:schemaBindings>
            <jaxb:package name="com.amazon.webservices.ecs"/>
        </jaxb:schemaBindings>


        <jaxb:bindings node="xsd:element[@name='Condition']/xsd:simpleType">
            <jaxb:typesafeEnumClass name="ConditionEnum" >
                <jaxb:typesafeEnumMember value="All" name="ALL" />
                <jaxb:typesafeEnumMember value="New" name="NEW" />
                <jaxb:typesafeEnumMember value="Used" name="USED" />
                <jaxb:typesafeEnumMember value="Collectible" name="COLLECTIBLE" />
                <jaxb:typesafeEnumMember value="Refurbished" name="REFURBISHED" />
            </jaxb:typesafeEnumClass>
        </jaxb:bindings>

    </jaxws:bindings>

</jaxws:bindings>

тогда вы будете ссылаться на этот файл настройки JAX-WS так же, как и на файл JXB.

Я не проверял автономный пример настройки JAXB, поскольку я действительно включил его только в качестве примера и объяснения предшественника для примера настройки JAX-WS.

Пример настройки JAX-WS, который я действительно тестировал / проверял на WSDL, который вы связали, так что вы сможете использовать его в качестве отправной точки.Я заметил, что в определенном WSDL существует множество перечисленных ограничений, поэтому я предполагаю, что вы захотите сгенерировать перечисления для большинства / всех из них.

Надеюсь, это поможет.

1 голос
/ 30 ноября 2010

Используйте typesafeEnumMember в JAXB-Binding

Ссылка: http://download.oracle.com/docs/cd/E17802_01/webservices/webservices/docs/1.5/tutorial/doc/JAXBUsing4.html#wp148439

Или

Примерно так [добавлено name = "ConditionType" ]:

<xs:simpleType name="ConditionType">
            <xs:restriction base="xs:string">
                <xs:enumeration value="All"/>
                <xs:enumeration value="New"/>
                <xs:enumeration value="Used"/>
                <xs:enumeration value="Collectible"/>
                <xs:enumeration value="Refurbished"/>
            </xs:restriction>
        </xs:simpleType>
...