Как настроить сгенерированный JAX-WS WSDL? - PullRequest
3 голосов
/ 12 июля 2011

Я создаю сервис SOAP, используя JAX-WS и JAXB, аннотируя классы. Моя реализация сервиса выглядит так:

@Stateless
@Local(WSApplicationService.class)
@WebService(name = "WSApplicationService", serviceName = "WSApplicationService")
@BindingType(SOAPBinding.SOAP11HTTP_BINDING)
public class WSApplicationServiceImpl implements WSApplicationService {

  @Override
  @WebMethod
  @WebResult(name = "reference")
  public long submitApplication(@WebParam(name = "application") ApplicationSubmission application) throws SOAPException {
    ...
  }
}

Задав этот вопрос , я узнал, что невозможно указать некоторые ограничения на входные данные с помощью аннотаций JAXB. Однако мне нужно ограничить определенные свойства String шаблонами (в основном почтовые индексы и номера телефонов). Поэтому я хочу настроить WSDL, сгенерированный вышеприведенным классом. Я не могу найти способ доступа к WSDL. Есть ли способ переопределить или настроить сгенерированный JAX-WS WSDL?

1 Ответ

5 голосов
/ 12 июля 2011

Хотя вы можете безопасно генерировать WSDL автоматически, обычно имеет смысл вручную кодировать XSD, на который ссылается WSDL, что дает вам все богатство выражения, которое не может создать схема, сгенерированная из классов JAXB, а также обеспечивает схема не меняется, когда вы этого не хотите. (Эта практика называется контракт-первый , тогда как начало с классов называется код-первым.)

Когда вы выполняете сначала контракт, вы можете сгенерировать свои классы JAXB из XSD автоматически как часть процесса сборки, следя за тем, чтобы они всегда были синхронизированы. Вы можете настроить сгенерированные классы, используя XJB файлы.

Если вы используете Maven, генерация классов может выглядеть следующим образом:

<plugin>
    <groupId>org.jvnet.jaxb2.maven2</groupId>
    <artifactId>maven-jaxb2-plugin</artifactId>
    <version>0.7.5</version>
    <executions>
        <execution>
            <goals>
                <goal>generate</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <schemaDirectory>src/main/resources/wsdl</schemaDirectory>
        <schemaIncludes>
            <include>*.xsd</include>
        </schemaIncludes>
        <verbose>true</verbose>
        <extension>true</extension>
    </configuration>
</plugin>

Конечно, вы также можете использовать свои классы, закодированные вручную, с определением схемы, закодированным вручную (указав маршаллеру, где его найти). Я не думаю, что вы можете повлиять на поколение WSDL другими способами.

...