Maven для создания SOA-сервисов и клиентов? - PullRequest
0 голосов
/ 30 апреля 2011

Я изменил название, чтобы обобщить этот вопрос, который на самом деле не относится к Axis2.В конце концов я полностью отказался от Axis2 и переключился на Metro / JAX-WS, но сейчас серьезно думаю о том, чтобы отказаться от обоих и перейти на OpenSAML.Реальный вопрос, на который я пытаюсь получить ответ, заключается в том, как создать сложные основанные на стандартах сервисы SOA, которые действительно работают.

Первоначальная формулировка была такой: Кто-то может вставить в рабочий примерmaven pom для вызова Axis2 java2wsdl со значениями по умолчанию, с которыми я могу жить?Вот заклинание командной строки, которое ведет себя нормально.

  -o target/generated-sources/java2wsdl \
  -l "http://localhost:9763/services/PolicyService" \
  -tn urn:sesgg:sc:security:1.0.spec.PolicyService \
  -tp ps \
  -stn urn:oasis:names:tc:SAML:2.0:protocol \
  -stp samlp \
  -of PolicyService.wsdl \
  -sn PolicyService \
  -cp "../../Schema/target/Schema-1.0-SNAPSHOT.jar target/PolicyService-1.0-SNAPSHOT.jar" \
  -cn com.technica.pbac.ps.PolicyService \

Все, что я делаю, приводит к очень странным результатам;например, странные обратные пространства имен (например, http://xmldsig._09._2000.w3.org/xsd).Не могли бы вы объяснить, почему это так и как это остановить?

Кажется, есть много java2wsdl, которые ожидают совершенно других аргументов, с небольшой согласованностью между командной строкой и maven pom.

Ответы [ 3 ]

1 голос
/ 02 мая 2011

Нет ответов, поэтому я опубликую текущие результаты своих собственных экспериментов, чтобы помочь другим с подобными проблемами.Я не могу гарантировать, что это правильно, пока тестирование не будет завершено, но, по крайней мере, теперь я получаю результаты, которые могу вынести, глядя на Eclipse:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>2.3.2</version>
            <configuration>
                <source>1.6</source>
                <target>1.6</target>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.jvnet.jaxb2.maven2</groupId>
            <artifactId>maven-jaxb2-plugin</artifactId>
            <version>0.7.5</version>
            <configuration>
                <schemaExcludes>
                    <exclude>*saml*.xsd</exclude>
                </schemaExcludes>
                <strict>true</strict>
                <extension>true</extension>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>generate</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.apache.axis2</groupId>
            <artifactId>axis2-java2wsdl-maven-plugin</artifactId>
            <version>1.5.4</version>
            <executions>
                <execution>
                    <goals>
                        <goal>java2wsdl</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <id>Generate WSDL based on PolicyService Interface</id>
                <serviceName>PolicyService</serviceName>
                <className>com.technica.pbac.ps.PolicyServiceImpl</className>
                <targetNamespace>http://sesgg/sc/security/1.0/spec/PolicyService</targetNamespace>
                <targetNamespacePrefix>sesgg</targetNamespacePrefix>
                <schemaTargetNamespace>http://sesgg/sc/security/1.0/spec/PolicyService</schemaTargetNamespace>
                <schemaTargetNamespacePrefix>sesgg</schemaTargetNamespacePrefix>
                <elementFormDefault>qualified</elementFormDefault>
                <extension>false</extension>
                <package2Namespace>
                    <property>
                        <name>urn:sesgg:sc:security:1.0:spec:PolicyService</name>
                        <value>http://sesgg/sc/security/1.0/spec/PolicyService</value>
                    </property>
                    <property>
                        <name>com.technica.pbac.ps</name>
                        <value>http://com.technica.pbac.ps</value>
                    </property>
                    <property>
                        <name>oasis.names.tc.saml._2_0.protocol.xsd</name>
                        <value>http://oasis/names/tc/saml/2.0/protocol</value>
                    </property>
                    <property>
                        <name>oasis.names.tc.saml._2_0.protocol</name>
                        <value>http://oasis/names/tc/saml/2.0/protocol</value>
                    </property>
                </package2Namespace>
                <episodes>
                    <episode>
                        <groupId>Technica-PBAC</groupId>
                        <artifactId>Schema-1.0-SNAPSHOT.jar</artifactId>
                    </episode>
                </episodes>
                <outputFileName>target/generated-sources/java2wsdl/PolicyService.wsdl</outputFileName>
                <filename>target/generated-sources/java2wsdl/services.xml</filename>
                <locationUri>http://localhost:9763/services/PolicyService</locationUri>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.axis2</groupId>
            <artifactId>axis2-wsdl2code-maven-plugin</artifactId>
            <version>1.5.4</version>
            <executions>
                <execution>
                    <goals>
                        <goal>wsdl2code</goal>
                    </goals>
                    <configuration>
                        <wsdlFile>target/generated-sources/java2wsdl/PolicyService.wsdl</wsdlFile>
                        <packageName>com.technica.pbac.ps</packageName>
                        <outputDirectory>target/generated-sources/wsdl2java</outputDirectory>
                        <unwrap>true</unwrap>
                        <allPorts>true</allPorts>
                        <databindingName>adb</databindingName>
                        <generateServerSide>true</generateServerSide>
                        <generateAllClasses>true</generateAllClasses>
                        <generateServicesXml>true</generateServicesXml>
                        <generateTestcase>true</generateTestcase>
                        <overWrite>true</overWrite>
                        <serviceName>PolicyService</serviceName>
                        <syncMode>sync</syncMode>
                        <backwardCompatible>false</backwardCompatible>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
    <pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.apache.axis2</groupId>
                <artifactId>axis2-java2wsdl-maven-plugin</artifactId>
                <version>1.5.4</version>
            </plugin>
            <plugin>
                <groupId>org.apache.axis2</groupId>
                <artifactId>axis2-wsdl2code-maven-plugin</artifactId>
                <version>1.5.4</version>
            </plugin>
        </plugins>
    </pluginManagement>
</build>

Одно предупреждение: я действительно сомневаюсь в его праве использовать jaxbjava2wsdl, wsdl2java и фазы компиляции в одном pom.В настоящее время java2wsdl работает после wsdl2java, что явно не правильно.Эта помпа вдвойне подозрительна, так как для запуска java2wsdl нужен скомпилированный jar, и, похоже, он использует тот, что был оставлен после предыдущих запусков.Это медведь, чтобы снова работать после mvn clean.Я, вероятно, разделю его на несколько частей и уточню ответ, когда сделаю это.

0 голосов
/ 25 декабря 2012

Окончательный ответ на этот вопрос действительно заключался в том, чтобы отказаться от попыток исправить испорченные схемы и инструменты и перейти на OpenSAML, который уже сделал это. Это прекрасно работало для компилятора XACML 2.0 и веб-сервисов на его основе. Но это не сработало для компиляторов XACML 3.0, потому что OpenSAML не поддерживает XACML 3.0 и не планирует этого делать, поэтому мне пришлось справиться с этим самостоятельно. Но, имея опыт работы с XACML 2.0, я в итоге заработал оба. Этот проект был гораздо более болезненным, чем должен был быть, и «мощные» инструменты только усложнили его.

0 голосов
/ 24 сентября 2011

Я обещал расширить этот ответ чем-то примерно "правильным". Вот прогресс на сегодняшний день, который я до сих пор не совсем уверен, на 100% правильно. Подробнее об этом позже.

Все это основано на стеке схем, которые Oasis публикует для определения стандартов XACML и SAML-P для XACML. XSD были собраны в модуль Commons-Schema (не показан), настроены для исправления нескольких ошибок Oasis и скомпилированы в классы Java с JAX-B. Эти классы являются основой для услуг, описанных ниже. Свойства schema.episode.path и schema.catalog.path указывают на файлы в этом модуле.

Я разделил каждый сервис (в данном случае PolicyService) на два модуля maven. PolicyService-Svc - это сервис, и его pom выглядит так:

<plugin>
  <groupId>org.codehaus.mojo</groupId>
  <artifactId>jaxws-maven-plugin</artifactId>
  <executions>
    <execution>
      <id>Generate WSDL</id>
      <phase>generate-resources</phase>
      <goals>
        <goal>wsgen</goal>
      </goals>
      <configuration>
        <sei>com.technica.pbac.ps.PolicyService</sei>
        <genWsdl>true</genWsdl>
        <keep>true</keep>
        <verbose>true</verbose>
        <extension>true</extension>
        <catalog>${schema.catalog.path}</catalog>
        <xjcArg>-episode</xjcArg>
        <xjcArg>${schema.episode.path}</xjcArg>
        <xjcArg>-catalog</xjcArg>
        <xjcArg>${schema.catalog.path}</xjcArg>
      </configuration>
    </execution>
  </executions>
</plugin>

PolicyService-Proxy - это общий прокси-код, который любой клиент или служба может использовать для вызова этой службы (подробнее о проблемах с этим ниже). Его пом выглядит так:

<plugin>
  <groupId>org.codehaus.mojo</groupId>
  <artifactId>jaxws-maven-plugin</artifactId>
  <executions>
    <execution>
      <!-- <phase>generate-sources</phase> -->
      <goals>
        <goal>wsimport</goal>
      </goals>
      <configuration>
        <wsdlFiles>
          <wsdlFile>localhost_8080/PolicyService-Svc/PolicyService.wsdl</wsdlFile>
        </wsdlFiles>
        <wsdlLocation>http://localhost:8080/PolicyService-Svc/PolicyService?WSDL</wsdlLocation>
        <sourceDestDir>${project.build.directory}/generated-sources/jaxws</sourceDestDir>
        <genWsdl>true</genWsdl>
        <verbose>true</verbose>
        <extension>true</extension>
        <catalog>${schema.catalog.path}</catalog>
        <xjcArg>-episode</xjcArg>
        <xjcArg>${schema.episode.path}</xjcArg>
      </configuration>
    </execution>
  </executions>
</plugin>

Теперь о проблемах, о которых я бы очень хотел посоветовать. Несмотря на то, что Commons-Schema предоставляет скомпилированные классы Java для всех схем, wsgen настаивает на создании wsdl с недавно сгенерированным xsds, которые немного отличаются друг от друга и слегка некорректны по-разному.

В качестве одного примера неверного и другого SAML определяет элемент Extensions, который конфликтует с тем же именем в другой схеме. Поэтому я отремонтировал его в базовой схеме Commons следующим образом:

<element name="Extensions" type="samlp:ExtensionsType">
    <annotation>
        <appinfo>
        <jxb:class name="Extensions-SAML"/>
       </appinfo>
</annotation>
</element>

Но wsgen / wsimport пропускает это исправление, поэтому конфликт снова возникает. Разъяренный и абсолютно смертельный для телосложения.

Другое исключение обязательных включает в себя, поэтому проверка затмения сообщает о них как об ошибках до ручной коррекции. Мой обходной путь - периодически копировать сгенерированные wsdl и xsds из целевой папки в src / main / webapp / WEB-Inf / wsdl, восстанавливать их вручную и настраивать poms, чтобы использовать эту папку вместо сгенерированной внутри целевой цели. Это работает для вызова услуг от не обслуживающих клиентов. Я копирую те же wsdls и xsds в аналогичную папку клиента и проверяю, что pom ссылается на них, а не на те, которые генерирует jaxws в этом модуле.

Проблема, которую я не могу решить, возникает, когда какой-либо службе необходимо вызвать другую службу через ее прокси. Jar-прокси вызывающей службы (с его немного отличающимися версиями важных базовых классов) теперь смешивается с jar-файлами вызывающей службы (на основе классов, сгенерированных JAXB Commons-Schema), что не вызывает никаких проблем.

Может кто-нибудь посоветовать, пожалуйста? Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...