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

3

我正在使用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 {
    ...
  }
}

在提出这个问题后,我了解到使用JAXB注释无法指定输入数据的某些限制。但是,我需要将某些字符串属性限制为模式(主要是邮政编码和电话号码)。因此,我正在寻找自定义上述类生成的WSDL。然而,我找不到访问WSDL的方法。是否有一种方法可以覆盖或自定义JAX-WS生成的WSDL?
1个回答

5
虽然您可以安全地自动生成WSDL,但通常最好手动编写从WSDL引用的XSD,这样可以获得比从JAXB类生成的模式更丰富的表达方式,并确保在不需要更改模式时模式不会发生变化。(这种做法称为合同优先,而以类为基础的做法称为代码优先。)
当您进行合同优先时,您可以将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>

当然,您也可以使用手工编写的类与手工编写的模式定义一起使用(通过告诉marshaller在哪里找到它)。我认为您不能通过其他方式影响WSDL生成。

谢谢,你知道我怎么告诉编组程序在哪里找到模式吗? - Sietse
2
这将取决于您如何初始化JAXB(使用Spring-WS、RI或其他方式?),但最终,javax.xml.bind.Marshallerjavax.xml.bind.Unmarshaller接口都有一个setSchema()方法。 - Henning
谢谢你的帮助。老实说,我不知道如何初始化JAXB,我只是在类上注释并在JBoss AS中部署。 - Sietse

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接