当前位置: 首页 > 知识库问答 >
问题:

用Apache CXF实现的JAX-WS服务上的验证器错误

沈骞仕
2023-03-14

我正在使用Apache CXF开发一个JAX-WS服务,它的类型定义来自两个来源。XSD模式文件在.../types/namespace中定义各种类型,并且有与JAXB注释相匹配的java类。endpoint是在Java inteface中定义的,在.../service/命名空间中有@WebService相关的注释。WSDL由Apache CXF生成,它使用XSD模式文件中的类型定义以及从@WebServiceendpoint生成的请求/响应消息和参数的类型定义。

我在.../service/命名空间中遇到了以下关于Apache CXF生成的类型的验证器错误。

Caused by: org.xml.sax.SAXParseException; lineNumber: 5; columnNumber: 10; cvc-elt.1: Cannot find the declaration of element 'ser:subscriberId'.
@WebService(name="gatewayService",
    targetNamespace="http://www.mydomain.com/gateway/schema/service/")
public interface GatewayEndpoint {
    // ...
    @WebMethod(operationName="addService")
    @XmlElement(required=true) public Response addService(
            @XmlElement(required=true) @WebParam(name="subscriberId") long subscriberId,
            @XmlElement(required=true) @WebParam(name="service") Service service)
            throws GatewayException;
    // ...
}

JAX-WSendpoint在spring配置文件中定义如下:

<!-- Apache CXF endpoint -->
<import resource="classpath:META-INF/cxf/cxf.xml"/>
<jaxws:endpoint id="gatewayndpoint" implementor="#gatewayEndpointImpl" address="/gateway">
     <jaxws:schemaLocations>
        <jaxws:schemaLocation>classpath:/schemas/gateway_schema.xsd</jaxws:schemaLocation>
    </jaxws:schemaLocations>
    <jaxws:properties>
        <entry key="schema-validation-enabled" value="true" />
    </jaxws:properties>
</jaxws:endpoint>

gateway_schema.xsd包含各种complexType定义,其中包括.../types/命名空间中的服务定义:

<xs:complexType name="Service">
<xs:sequence>
  <xs:element name="name">
    <xs:simpleType>
        <xs:restriction base="xs:string">
            <xs:maxLength value="10"/>
        </xs:restriction>
    </xs:simpleType>
  </xs:element>
  <xs:element name="deviceLimit" type="xs:int"/>
  <xs:element maxOccurs="unbounded" minOccurs="0" name="subscription" nillable="true" type="gateway:Subscription"/>
  <xs:element maxOccurs="unbounded" minOccurs="0" name="package" nillable="true" type="gateway:Package"/>
</xs:sequence>
</xs:complexType>

与之匹配的JAXB注释类是:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Service")
public class Service {

    @XmlElement(required=true)
    private String name;
    private int deviceLimit;
    @XmlElement(name="subscription", nillable=true)
    private List<Subscription> subscriptions;
    @XmlElement(name="package", nillable=true)
    private List<Package> packages;

    //.. getters and setters
}
<?xml version="1.0" ?>
<wsdl:definitions
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
    xmlns:tns="http://www.mydomain.com/gateway/schema/service/"
    xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
    xmlns:ns2="http://schemas.xmlsoap.org/soap/http"
    xmlns:ns1="http://www.mydomain.com/gateway/schema/services/"
    name="GatewayService"
    targetNamespace="http://www.mydomain.com/gateway/schema/service/">
    <wsdl:types>
        <xs:schema
            xmlns:xs="http://www.w3.org/2001/XMLSchema"
            xmlns:gateway="http://www.mydomain.com/gateway/schema/types/"
            elementFormDefault="qualified"
            targetNamespace="http://www.mydomain.com/gateway/schema/types/"
            version="1.0">
            <!--
                Various type definitions available in the gateway_schema.xsd
                Among them the typ:Service definition
            -->
        </xs:schema>
        <xsd:schema
            xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            xmlns:tns="http://www.mydomain.com/gateway/schema/services/"
            xmlns:ns0="http://www.mydomain.com/gateway/schema/types/"
            attributeFormDefault="unqualified"
            elementFormDefault="qualified"
            targetNamespace="http://www.mydomain.com/gateway/schema/services/">

            <xsd:import namespace="http://www.mydomain.com/gateway/schema/types/"></xsd:import>

            <!--
                Definitions generated by Apache CXF
            -->
            <xsd:element name="addService" type="tns:addService"></xsd:element>
            <xsd:complexType name="addService">
                <xsd:sequence>
                    <xsd:element name="subscriberId" type="xsd:long"></xsd:element>
                    <xsd:element name="service" type="ns0:Service"></xsd:element>\
                </xsd:sequence>
            </xsd:complexType>
            <!-- .... -->
        </xsd:schema>
    </wsdl:types>
    <wsdl:message name="addService">
        <wsdl:part element="tns:addService" name="parameters"></wsdl:part>
    </wsdl:message>
    <!... rest of messages, portTypes, bindings and wsdl:service -->
</wsdl:definitions>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser="http://www.mydomain.com/gateway/schema/service/" xmlns:typ="http://www.mydomain.com/gateway/schema/types/">
   <soapenv:Header/>
   <soapenv:Body>
      <ser:addService>
         <ser:subscriberId>100</ser:subscriberId>
         <ser:service>
            <typ:name>12345678</typ:name>
            <typ:deviceLimit>1</typ:deviceLimit>
            <!--Zero or more repetitions:-->
            <typ:subscription name="a"/>
            <!--Zero or more repetitions:-->
            <typ:package name="b"/>
         </ser:service>
      </ser:addService>
   </soapenv:Body>
</soapenv:Envelope>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
   <soap:Body>
      <soap:Fault>
         <faultcode>soap:Client</faultcode>
         <faultstring>Unmarshalling Error: cvc-elt.1: Cannot find the declaration of element 'ser:subscriberId'.</faultstring>
      </soap:Fault>
   </soap:Body>
</soap:Envelope>

共有1个答案

毋玺
2023-03-14

您有命名空间问题...在wsdl中,AddService/SubscriberID元素的命名空间为“http://www.mydomain.com/gateway/schema/services/”,但发送的是“http://www.mydomain.com/gateway/schema/service/”。注意末尾缺少“s”。

 类似资料:
  • 我有一个基于ofbizsoap的web服务,它是公开的(可以接受请求),并且生成了WSDL代码和WSDL URL。我的问题是,有没有一种方法可以使用CXF Java客户端或JAX-WS客户端使用此web服务? 总的来说,我希望能够将客户机添加到Mule esb组件中,作为Mule流的一部分。我可以使用AXIS2调用Obiz web服务,但Mule ESB似乎不支持AXIS2,这给我带来了另一个问题

  • 问题内容: 我有一个已导入xsd的wsdl,此xsd具有类似如下的限制: 因此,我想细想一下,当我通过netbeans将这个耳朵部署到glassfish上时,将对传入的数据进行验证,但事实并非如此。在将数据传递给我的@WebService对象并转换为Java对象之前,是否需要进行任何调用以确保数据经过验证。 问题答案: 使用SchemaValidation批注。 请注意,它仅适用于文档/文字样式的

  • 你好,我曾与JAX-WS合作开发基于SOAP的网络服务。现在我想使用REST,因为正如我从这里学习的那样,REST比SOAP有优势。 但从不同的文章中,我知道我们也可以从JAX-WS创建RESTful Web服务。但是大多数人说我们应该使用JAX-RS而不是JAX-WS。 我的问题是JAX-WS RESTful webservice和JAX-RS(泽西)之间有什么区别。JAX-RS相对于JAX-W

  • 在Tomcat上部署基于JAX-WS的Web服务时,我试图最小化所需的配置。随着Servlet3.0的引入(由Tomcat7+支持),可以抛出,但仍然存在。这篇博文很有趣:

  • 问题内容: 我找不到解决方案,发现更多人陷入同一问题,因此我将其发布在这里。 默认情况下,JAX-WS服务器(至少用于WebLogic)将不验证通过其关联架构接收到的消息。 由于任何无效值(错误的xsd:dateTime格式,数字字段中的字母等)都将导致Java对象(包括必填字段)中的 空 值,从而导致很多问题。 我需要做的是由服务器提供的简单验证。 由于某些原因,当我尝试使用提供的架构验证时,出

  • 我需要调用WildFly 8上可用的JAX-WS Web服务。我从一个简单的例子开始。这是我的网络服务: WSDL 可在以下网址获得: http://localhost:8080/DemoWS/HelloWorld?wsdl 看看Tomcat-CXF的例子,我编写了以下路由: 通过在 Camel 上下文中运行上述代码,将返回以下错误: serviceClass=com.sample。HelloWo