Задача Ant для преобразования WSDL в POJO с использованием XJC выдает имя пакета Error

У меня есть задача Ant, которая принимает файл wsdl и должна автоматически генерировать POJO (Java на стороне клиента), поэтому я могу начать программировать свои веб-службы JAX-WS на стороне клиента.

Однако я получаю сообщение об ошибке «[ОШИБКА] Имя пакета ...., используемое для этой схемы, не является допустимым именем пакета»

Эта ошибка возникает только в том случае, если в моем файле wsdl имеется более 1 импорта схемы, например

            <xsd:import namespace="http://service.rts.cmslink.tms.com/ProcessCustomerInquiry/Response" schemaLocation="ProcessCustomerInquiryResponse.xsd"/>
            <xsd:import namespace="http://service.rts.cmslink.tms.com/ProcessCustomerInquiry/Request" schemaLocation="ProcessCustomerInquiryRequest.xsd"/>
        </xsd:schema>

Ниже представлен весь wsdl

<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions xmlns:CMSLINK="http://service.rts.cmslink.tms.com/ProcessCustomerInquiry" xmlns:REQ="http://service.rts.cmslink.tms.com/ProcessCustomerInquiry/Request" xmlns:RESP="http://service.rts.cmslink.tms.com/ProcessCustomerInquiry/Response" xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://service.rts.cmslink.tms.com/ProcessCustomerInquiry" name="ProcessCustomerInquiryService">
    <wsdl:types>
        <xsd:schema>
            <xsd:import namespace="http://service.rts.cmslink.tms.com/ProcessCustomerInquiry/Response" schemaLocation="ProcessCustomerInquiryResponse.xsd"/>
            <xsd:import namespace="http://service.rts.cmslink.tms.com/ProcessCustomerInquiry/Request" schemaLocation="ProcessCustomerInquiryRequest.xsd"/>
        </xsd:schema>
    </wsdl:types>
    <wsdl:message name="ProcessCustomerInquiryRequest">
        <wsdl:part name="requestData" element="REQ:ProcessCustomerInquiryRequest"/>
    </wsdl:message>
    <wsdl:message name="ProcessCustomerInquiryResponse">
        <wsdl:part name="responseData" element="RESP:ProcessCustomerInquiryResponse"/>
    </wsdl:message>
    <wsdl:portType name="ESB_ProcessCustomerInquiryService">
        <wsdl:operation name="ReqResp">
            <wsdl:input name="processRequest" message="CMSLINK:ProcessCustomerInquiryRequest"/>
            <wsdl:output name="processResponse" message="CMSLINK:ProcessCustomerInquiryResponse"/>
        </wsdl:operation>
    </wsdl:portType>
    <wsdl:binding name="ProcessCustomerInquiryServiceSoapBinding" type="CMSLINK:ESB_ProcessCustomerInquiryService">
        <wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
        <wsdl:operation name="ReqResp">
            <wsdlsoap:operation soapAction="process"/>
            <wsdl:input>
                <wsdlsoap:body use="literal"/>
            </wsdl:input>
            <wsdl:output>
                <wsdlsoap:body use="literal"/>
            </wsdl:output>
        </wsdl:operation>
    </wsdl:binding>
    <wsdl:service name="ProcessCustomerInquiryService">
        <wsdl:port name="ProcessCustomerInquiry" binding="CMSLINK:ProcessCustomerInquiryServiceSoapBinding">
            <wsdlsoap:address location="http://tsesbd01.tms.toyota.com:51180/v2/MF_CMSLINK_ProcessCustomerInquiryDistributed.msgflow"/>
        </wsdl:port>
    </wsdl:service>
</wsdl:definitions>

Задача XJC Ant

<project name="WSDLCompile" default="wsdl2java" basedir=".">
    <target name="wsdl2java" description="Run xjc -wsdl.">
        <!-- properties -->
        <property name="sourceDir" value="temp/src" />
        <echo message="sourceDir:"/>
        <echo message="${sourceDir}"/>
        <mkdir dir="temp/classes"/>
        <property name="outputDir" value="temp/classes" />
        <echo message="outputDir:"/>
        <echo message="${outputDir}"/>
        <!-- xjc properties -->
        <property name="wsdl.url" value="src/wsdl/cmslink/ProcessCustomerInquiry.wsdl" />
        <echo message="wsdl.url:"/>
        <echo message="${wsdl.url}"/>
        <property name="wsdl.mapping.package.response" value="http://service.rts.cmslink.tms.com/ProcessCustomerInquiry/Response=com.tms.cmslink.rts.service.ProcessCustomerInquiry.Response" />
        <echo message="wsdl.mapping.package.response:"/>
        <property name="wsdl.mapping.package.request" value="http://service.rts.cmslink.tms.com/ProcessCustomerInquiry/Request=com.tms.cmslink.rts.service.ProcessCustomerInquiry.Request" />
        <echo message="wsdl.mapping.package.request:"/>
        <!--C:/Program Files/Java/jdk1.7.0_09/bin/xjc -->
        <!--xjc execution-->
        <exec executable="xjc">
            <arg value="-wsdl" />
            <arg value="${wsdl.url}" />
            <arg value="-d" />
            <arg value="${outputDir}" />
            <arg value="-p"/>
            <arg value="${wsdl.mapping.package.request}"/>
            <arg value="-p"/>
            <arg value="${wsdl.mapping.package.response}"/>
            <arg value="-verbose"/>
        </exec>
    </target>
</project>

Если я удалю дополнительную схему, импортируйте либо response.xsd, либо request.xsd, а также включу только 1 аргумент пространства имен пакета "-p" для задачи ANT, чем ANT работает без ошибок, однако мой файл wsdl содержит несколько импортированных схем.

ИЗМЕНИТЬ

Я изменил значение аргумента «-p», чтобы придерживаться соглашений о пакетах, хотя мой предыдущий подход был основан на форуме ошибок JXC.

<project name="WSDLCompile" default="wsdl2java" basedir=".">
    <target name="wsdl2java" description="Run xjc -wsdl.">
        <!-- properties -->
        <property name="sourceDir" value="temp/src" />
        <echo message="sourceDir:"/>
        <echo message="${sourceDir}"/>
        <mkdir dir="temp/classes"/>
        <property name="outputDir" value="temp/classes" />
        <echo message="outputDir:"/>
        <echo message="${outputDir}"/>
        <!-- xjc properties -->
        <property name="wsdl.url" value="src/wsdl/cmslink/ProcessCustomerInquiry.wsdl" />
        <echo message="wsdl.url:"/>
        <echo message="${wsdl.url}"/>
        <property name="wsdl.mapping.package.response" value="com.tms.cmslink.rts.service.ProcessCustomerInquiry.Response" />
        <echo message="wsdl.mapping.package.response:"/>
        <property name="wsdl.mapping.package.request" value="com.tms.cmslink.rts.service.ProcessCustomerInquiry.Request" />
        <echo message="wsdl.mapping.package.request:"/>
        <!--C:/Program Files/Java/jdk1.7.0_09/bin/xjc -->
        <!--xjc execution-->
        <exec executable="xjc">
            <arg value="-wsdl" />
            <arg value="${wsdl.url}" />
            <arg value="-d" />
            <arg value="${outputDir}" />
            <arg value="-p"/>
            <arg value="${wsdl.mapping.package.request}"/>
            <arg value="-p"/>
            <arg value="${wsdl.mapping.package.response}"/>
            <arg value="-verbose"/>
        </exec>
    </target>
</project>

Я даже пробовал описанную выше задачу с муравьями с

-p <arg value="${wsdl.mapping.package.request }"/>
<arg value="${wsdl.mapping.package.response}"/>

помещая оба имени пакета в одну строку, разделенную пробелом, это соответствует документу JXC, объясняя, что вы можете иметь «ноль или более пространств имен пакетов, разделенных пробелом». Мне требуется, чтобы XJC мог обрабатывать более 1 импорта схемы.


person cyber101    schedule 30.10.2012    source источник


Ответы (2)


Параметр -p указывает одиночный пакет Java, который следует использовать для всех сгенерированных классов независимо от пространства имен. Если вы хотите, чтобы каждый URI пространства имен отображался в его собственном пакете, вы не можете использовать -p, вместо этого вам нужно использовать файл настройки привязки

<bindings xmlns="http://java.sun.com/xml/ns/jaxb" xmlns:xs="http://www.w3.org/2001/XMLSchema" version="2.1">
  <bindings schemaLocation="ProcessCustomerInquiryResponse.xsd" node="/xs:schema">
    <schemaBindings>
      <package name="com.example.inquiry.response"/>
    </schemaBindings>
  </bindings>
  <bindings schemaLocation="ProcessCustomerInquiryRequest.xsd" node="/xs:schema">
    <schemaBindings>
      <package name="com.example.inquiry.request"/>
    </schemaBindings>
  </bindings>
</bindings>

и передайте его xjc с помощью параметра -b

<arg value="-b"/>
<arg file="bindings.xjb"/>
person Ian Roberts    schedule 30.10.2012
comment
Пожалуйста, укажите, как я могу передать эту настройку привязки моей задаче ANT, каков синтаксис ??? Спасибо - person cyber101; 31.10.2012
comment
Спасибо, я попробовал, это работает, однако я выбрал реализацию Apache CFX, нет необходимости в файле пользовательских привязок в CFX, он автоматически обрабатывает импорт нескольких схем в wsdl, еще раз спасибо :) - person cyber101; 31.10.2012

Думаю, проблема в вашем Ant-скрипте. Есть две проблемы:

  1. Значение свойства package должно быть java-пакетом. Например: <property name="wsdl.mapping.package" value="com.mycompany.xml.generated"/>
  2. Вы должны указать только один пакет, а не два.

Удачи!

Кроме того, вот ссылка на подход "пакет по схеме".

-Мюэль

person Muel    schedule 30.10.2012