我正在使用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?
答案 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生成。