如何自定义JAX-WS生成的WSDL?

时间:2011-07-12 08:09:48

标签: wsdl jaxb jax-ws customization

我正在使用JAX-WS和JAXB创建一个SOAP服务,通过注释类。我的服务实现如下:

@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 {
    ...
  }
}

在询问this question之后,我了解到无法使用JAXB注释对输入数据指定某些限制。但是,我需要将某些String属性限制为模式(主要是邮政编码和电话号码)。因此,我希望自定义上面的类生成的WSDL。我找不到访问WSDL的方法。有没有办法覆盖或自定义JAX-WS生成的WSDL?

1 个答案:

答案 0 :(得分:5)

虽然您可以安全地自动生成WSDL,但通常手动编写从WSDL引用的XSD是有意义的,这为您提供了从JAXB类生成的模式所不具备的所有表达式的丰富性,并且还确保了当您不希望架构时,架构不会更改。 (这种做法称为contract-first,而从类开始称为代码优先。)

当你签订契约时,你可以在构建过程中自动从XSD生成JAXB类,确保它们始终保持同步。您可以使用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生成。