代码之家  ›  专栏  ›  技术社区  ›  Tiger

如何在ApacheCXF中向SoapMessage的SoapBody中添加XML模式?

  •  1
  • Tiger  · 技术社区  · 15 年前

    有没有办法使用ApacheCXF修改SoapBody消息?我已经尝试过在Phase中使用拦截器特性。发送模式,尝试添加结果为SoapBody的xml架构。我一点运气都没有。

    问题是我想用xml模式验证结果消息。SoapBody的当前输出发送了一条结果消息,其中包含使用模式位置引用的xml模式,该模式位置在目标位置不可用。

    为了验证结果响应消息,我在BindingProvider的ResponseContext中添加了“schema validation enabled”作为true;但是,我不确定它是否有效。

    我试图添加/附加原始模式,而不是将其引用用于SoapBody的响应消息。是否有任何方法可以使用注释或任何其他方法来使用给定的xml模式进行验证?

    如有任何想法,欢迎回复。

    <?xml version="1.0" encoding="utf-8"?>
        <xs:schema id="resultSet" targetNamespace="http://www.xxx.com/" xmlns:mstns="http://www.xxx.com/" xmlns="http://www.xxx.com/" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" attributeFormDefault="qualified" elementFormDefault="qualified" xmlns:app1="http://www.xxx.com/ResultSet.xsd">
          <xs:import namespace="http://www.xxx.com/ResultSet.xsd" schemaLocation="RalsDeviceService_app1.xsd" />
          <xs:element name="resultSet" msdata:IsDataSet="true" msdata:Locale="en-US">
            <xs:complexType>
              <xs:choice minOccurs="0" maxOccurs="unbounded">
                <xs:element ref="app1:ResultSet" />
              </xs:choice>
            </xs:complexType>
          </xs:element>
        </xs:schema>
        <resultSet xmlns="http://www.xxx.com/">
          <ns2:ResultSet xmlns:ns2="http://www.xxx.com/ResultSet.xsd">
            <ns2:Results>
             ...
             ..
             .
        </resultSet>
    
    1 回复  |  直到 14 年前
        1
  •  0
  •   moohkooh    15 年前

    在这个问题上,我工作了三天(译者注:译者注:译者注:译者注:译者注:译者注:译者注:译者注:译者注:译者注:译者注:译者注:译者注:译者注:译者注:译者注:译者注:译者注:译者注:译者注。这是我的简单演示实现

     public static class MySendingReturn extends AbstractPhaseInterceptor<Message> {
    
        public MySendingReturn() {
            super(Phase.SEND);
        }
    
        @Override
        public void handleMessage(Message message) throws Fault {
            XMLStreamWriter content = message.getContent(XMLStreamWriter.class);
            try {
    
                MySchema context = new MySchema();
                content.writeStartElement("testOperationWithParameter");
                content.writeStartElement("returnValue");
                content.writeCharacters("Halllllo-Return");
            } catch (XMLStreamException e) {
                e.printStackTrace();
            }
        }
    }
    

    XMLStreamWriter的当前元素是SoapMessage的BODY元素。我在我的服务实例上注册的侦听器:

     service.getOutInterceptors().add(new MySendingReturn());
    
    推荐文章