gpt4 book ai didi

validation - JAX-WS RI 不强制执行 XSD 限制

转载 作者:行者123 更新时间:2023-12-02 02:21:55 25 4
gpt4 key购买 nike

我目前正在使用 JAX-WS 引用实现(版本 2.1.7)开发一些 Web 服务。它们是基于契约的,即 WSDL 和 XSD 文件不是由 wsgen 生成的。

这使我可以自由地使用 XSD 限制来加强对通过 SOAP 消息传递给我的服务的值的验证。以下是此类“受限”XSD 元素的两个示例:

<xsd:element name="maxResults" minOccurs="1">
<xsd:simpleType>
<xsd:restriction base="xsd:positiveInteger">
<xsd:minInclusive value="1"/>
<xsd:maxInclusive value="1000"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
<xsd:element name="lastName" minOccurs="0">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:minLength value="1"/>
<xsd:maxLength value="25"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>

我添加了 @SchemaValidation对我的服务类进行注释以强制执行模式验证。但是,JAX-WS 没有按预期强制执行验证规则。行为如下:
  • 正确报告缺少的强制性元素(例如,缺少 maxResults )。
  • 也会正确报告无效值(例如,整数字段中的字符数据)。
  • 间隔限制违规(例如,maxResults > 1000 或 maxResults < 1)通过验证过程而不被报告,并被注入(inject)到我的 JAXB 生成的 Java 结构中。尽管有 xsd:positiveInteger,即使是负值也被认为是有效的。类型!
  • 字符串长度约束违规(例如,lastName 长度超过 25 个字符)也不会报告。

  • 换句话说, <xsd:element> 中出现的限制标签已正确执行,但 <xsd:restriction>在基于 JAX-WS 的上下文中使用时,JAXB 似乎完全忽略了元素。

    我编写了一个测试类来使用裸 JAXB(无 JAX-WS)检查我的 XSD 限制。因此,所有限制都得到正确执行。

    这让我觉得 JAX-WS 在使用 JAXB 时可能存在错误......当然,除非我做错了什么......

    我在这里错过了一些基本的东西吗?!?

    提前感谢您的帮助,

    杰夫

    最佳答案

    我终于找到了问题所在...

    为了让我的 Web 服务在 JUnit 上下文中工作,即通过 Endpoint.publish() 发布,我不得不删除 wsdlLocation来自我的 @WebService 的属性注释。如果我不这样做,wsdlLocation = "WEB-INF/wsdl/SearchIndividualsV1_0.wsdl"传递给 @WebService注释与传递给 Endpoint.publish() 的 URL 值冲突方法,http://127.0.0.1:9000/rpe-ws/SearchIndividuals .

    阅读 Glen Mazza 的博客 (http://www.jroller.com/gmazza/entry/soap_xml_schema_validation) 后,附加说明 部分,我放回wsdlLocation属性和所有限制现在都已正确执行。

    换句话说,删除 wsdlLocation@WebService注解不会阻止服务本身工作,但会阻止 <xsd:restrictions> 中声明的限制要素得到适当执行。 <xsd:element> 中声明的限制然而,元素仍然被正确执行。

    因此,我不得不重新解决这个问题 wsdlLocation使我的单元测试正常工作的兼容性问题,但这比生产环境中的非工作验证更重要......

    以防万一...在非 Web 上下文中运行 Web 服务时,任何人都知道这种 WSDL 位置不兼容问题吗?

    谢谢,

    杰夫

    关于validation - JAX-WS RI 不强制执行 XSD 限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7754424/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com