使用CXF在运行时生成的WSDL中键入未加前缀的类型

时间:2014-04-14 23:06:11

标签: web-services jax-ws cxf

我有一个与Spring集成的Java优先Web服务。服务界面很简单:

@WebService
public interface ContactService {

    public void addContact(@WebParam(name="contact") Contact contact);
    public List<Contact> listContact();
    public void removeContact(@WebParam(name="id") Integer id);
}

实施:

@WebService(endpointInterface = "com.foobar.contact.service.ContactService")
@Service
public class ContactServiceImpl implements ContactService {
    // methods
}

模特:

@XmlAccessorType( XmlAccessType.FIELD )
public class Contact {
    private Integer id;
    private String firstname;
    private String lastname;
    private String email;
    private String telephone;
}

如果我使用Maven插件cxf-java2ws-plugin,则生成的WSDL是正确的。但是,如果没有指定WSDL,那么运行时生成的CXF就不起作用了。

例如,在cxf-java2ws-plugin生成的那个中,返回类型正确地以tns为前缀:

<xs:complexType name="listContactResponse">
<xs:sequence>
  <xs:element maxOccurs="unbounded" minOccurs="0" name="return" type="tns:contact"/>
</xs:sequence>

在运行时生成的那个中,contact没有前缀,因此无法解析:

<xsd:complexType name="listContactResponse">
<xsd:sequence>
  <xsd:element maxOccurs="unbounded" minOccurs="0" name="return" type="contact"/>
</xsd:sequence>

两个WSDL都包含正确的复杂类型contact

如何告诉CXF / JAX-WS contact是否在WSDL中定义的类型?

1 个答案:

答案 0 :(得分:1)

查看xsd,使用wsdl自动生成:

schemaLocation="http://<server>:<port>/<app>/<webservice>?xsd=1