Не могу инициализировать wsdl по умолчанию из Почему?

Мой pom.xml содержит следующее для автоматической генерации клиента для работающей веб-службы с указанным ниже WSDL:

        <plugin>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-codegen-plugin</artifactId>
            <version>2.3.1</version>
            <executions>
                <execution>
                    <id>generate-sources</id>
                    <configuration>
                        <sourceRoot>${basedir}/target/generated/src/main/java</sourceRoot>
                        <wsdlOptions>
                            <wsdlOption>
                                <wsdl>${basedir}/src/main/wsdl/myclient.wsdl</wsdl>
                                <extraargs>
                                    <extraarg>-client</extraarg>
                                    <extraarg>-verbose</extraarg>
                                </extraargs>
                                <wsdlLocation>wsdl/myclient.wsdl</wsdlLocation>
                            </wsdlOption>
                        </wsdlOptions>
                    </configuration>
                    <goals>
                        <goal>wsdl2java</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

Проект строится нормально, без ошибок или предупреждений, и я вижу файл myclient.wsdl в файле JAR прямо под папкой wsdl.

Но когда я пытаюсь запустить этот JAR:

  java -Xmx1028m -jar myclient-jar-with-dependencies.jar

Он жалуется, что «Не удается инициализировать wsdl по умолчанию из wsdl / myclient.wsdl»

Почему?

Что мне не хватает?

Как я могу узнать, какой путь, который wsdl/myclient.wsdl в pom.xml переводится, заставляет клиентский JAR жаловаться во время выполнения?

Обновление: мне известны некоторые решения / обходные пути, которые включают изменение автоматически сгенерированного кода:

  1. Передайте "null" для URL-адреса wsdl, а затем используйте порт ((BindingProvider) .getRequestContext (). put (BindingProvider.ENDPOINT_ADDRESS_PROPERTY, "http://example.com/ ...."), чтобы задать адрес.
  2. загрузите WSDL как ресурс Java и передайте его местоположение в конструктор службы.

Но меня больше интересует решение, которое требует ввода правильных значений в pom.xml, например, подход к пути к классам (но, к сожалению, путь к классам не использовался у меня почему-то не работает).

Есть идеи, что мне вместо этого набирать? По-видимому, это очень простой случай определения правил правильного пути для этого конкретного плагина, но я что-то упускаю и не знаю, что это такое.


person Withheld    schedule 22.11.2013    source источник


Ответы (2)


Я заметил, что примеры cfx немного используют разные места для sourceRoot, wsdl и wsdlLocation.

Помните, что обычно файлы в src/main/resources включаются в созданный артефакт. Чтобы файлы в src/main/wsdl были включены, его необходимо добавить как ресурс в pom.xml:

<resources>
    <resource>
        <directory>src/main/wsdl</directory>
    </resource>
</resources>

Советы:

  • Установите пути, которые вы подозреваете, к известным ошибочным путям и посмотрите, получите ли вы такое же сообщение об ошибке.
  • Разархивируйте созданный *.jar-файл (ы) и проверьте, включен ли wsdl и каков его путь.
person andrel    schedule 14.07.2014
comment
+1 и согласился, потому что это именно то, что я сделал, чтобы решить свою проблему. Однако для меня до сих пор остается загадкой как узнать, какой путь wsdl / myclient.wsdl в pom.xml переводит в во время выполнения? - person Withheld; 04.09.2014

Ошибка возникает из-за статического инициализатора вашего сгенерированного класса службы (который аннотируется @WebServiceClient). Он пытается загрузить файл wsdl как ресурс. Генератор использует значение, указанное вами в параметре wsdlLocation. Вы должны опустить префикс "wsdl /":

<wsdlLocation>myclient.wsdl</wsdlLocation>

потому что wsdl находится непосредственно в корне папки classpath.

Кстати: если вы опустите параметр ‹wsdlLocation>, используется значение параметра ‹wsdl> (что неверно во время выполнения в вашем случае, но было бы правильным, если бы предоставленный URL-адрес был бы удаленным URL-адресом, т.е. сервер веб-сервиса).

BTW2: ваш обходной путь 2 на самом деле +/- то, что делает сгенерированный код класса обслуживания, если вы используете конструктор без параметров.

person Heri    schedule 16.02.2015