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

Spring集成Web服务-Jaxb2Marshaller-如何使用SAX解析器?

楮庆
2023-03-14

我正在使用Jaxb2Marshaller与Spring集成。我有一个入站网关web服务,当有人调用它时,它将自动解析为JAXB生成的类。

但是当我调试到源代码中时,我看到使用DOM的Jaxb2Marshaller。我认为它会使用SAX将XML数据绑定到Java对象,SAX更快。为什么默认情况下使用DOM?如何将其配置为使用SAX?

当我检查文件时

解组器需要源的实例。如果消息负载不是源的实例,将尝试转换。当前为字符串、文件和组织。w3c。多姆。支持文档有效负载。通过注入SourceFactory的实现,还支持到源的自定义转换。注意:如果未显式设置SourceFactory,则默认情况下,UnmarshallingTransformer上的属性将设置为DomSourceFactory

关于源工厂

http://docs.spring.io/spring-integration/api/org/springframework/integration/xml/source/SourceFactory.html

我们可以看到,目前它只有DomSourceFactoryStringSourceFactory。没有SaxSourceFactory

所以我们不能将SAX与Jaxb2Marshaller一起使用,对吗?

它将来会有SaxSourceFactory吗?或者永远不会?

奇怪的是,当我检查Jaxb2Marshaller时,我看到代码已经处理了SAX

XMLReader xmlReader = null;
    InputSource inputSource = null;

    if (source instanceof SAXSource) {
        SAXSource saxSource = (SAXSource) source;
        xmlReader = saxSource.getXMLReader();
        inputSource = saxSource.getInputSource();
    }
    else if (source instanceof StreamSource) {
        StreamSource streamSource = (StreamSource) source;
        if (streamSource.getInputStream() != null) {
            inputSource = new InputSource(streamSource.getInputStream());
        }
        else if (streamSource.getReader() != null) {
            inputSource = new InputSource(streamSource.getReader());
        }
        else {
            inputSource = new InputSource(streamSource.getSystemId());
        }
    }

所以,最后一个问题是,我可以配置使用SpringIntegrationWebService和JAXB以及SAX吗?我错过什么了吗?

这是我的配置:

<ws:inbound-gateway id="inbound-gateway" request-channel="RequestChannel" reply-channel="ResponseChannel" 
        marshaller="marshaller"        unmarshaller="marshaller"  />
<int:channel id="RequestChannel" />
<int:channel id="ResponseChannel" />

<bean id="marshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
    <property name="contextPath" value="com.example.webservice.api"/>
</bean>

谢谢你和最好的问候,

芽阮

共有2个答案

龚承嗣
2023-03-14

尝试使用名称MessageDispatcherServlet配置AxiomSoapMessageFactorybean。默认消息工厂BEAN名称

默认情况下,它是SaajSoapMessageFactory,它在解组之前执行以下操作:

public Source getPayloadSource() {
    SOAPElement bodyElement = SaajUtils.getFirstBodyElement(getSaajBody());
    return bodyElement != null ? new DOMSource(bodyElement) : null;
}

公理是基于STaX的:

XMLStreamReader streamReader = getStreamReader(payloadElement);
return StaxUtils.createCustomStaxSource(streamReader);

类statxSource扩展了SAXSource{

史商震
2023-03-14

我正在使用WebServiceGatewaySupport类,并尝试将AxiomSoapMessageFactory作为Bean添加到应用程序上下文中,直到我发现WebServiceTemplate没有从应用程序上下文加载WebServiceMessageFactory。因此,我最终添加了一个构造函数:

public class SomeServiceImpl extends WebServiceGatewaySupport implements SomeService {

    public SomeServiceImpl(WebServiceMessageFactory messageFactory) {
        super(messageFactory);
    }
}

并使用@配置类自己构建服务:

@Configuration
public class WebServicesConfiguration {

    private WebServiceMessageFactory webServiceMessageFactory = new AxiomSoapMessageFactory();

    @Bean
    public SomeService someService() {
        return new SomeServiceImpl(webServiceMessageFactory);
    }
}
 类似资料:
  • null 如何在transform()步骤中添加Jaxb2Marshaller?

  • 问题内容: 它很好用,但是我希望它返回一个包含所有字符串的数组,而不是最后一个元素返回一个字符串。 任何想法如何做到这一点? 问题答案: 因此,你想构建一个XML解析器来解析这样的RSS feed。 现在,你可以使用两个SAX实现。你可以使用org.xml.sax或android.sax实现。在发布简短的示例后,我将解释两者的优点和缺点。 android.sax Implementation 让我

  • 问题内容: 它很好用,但是我希望它返回一个包含所有字符串的数组,而不是最后一个元素返回一个字符串。 任何想法如何做到这一点? 问题答案: 因此,你想构建一个XML解析器来解析这样的RSS feed。 现在,你可以使用两个SAX实现。你可以使用org.xml.sax或android.sax实现。在发布简短的示例后,我将解释两者的优点和缺点。 android.sax实现 让我们从实现开始。 你首先必须

  • 我需要从REST服务调用SOAP Webservice。我在我的项目中使用Spring集成。目前,我正在使用基于xml的配置来实现目标。但我想用java dsl编写代码。请帮助我如何使用Spring集成DSL从REST服务调用SOAP服务。 一个例子会很有帮助。

  • 问题内容: 我正在从REST服务接收XML文档,该文档将使用SAX进行解析。请参见以下示例,它是从XSD生成的。 设置解析器不是问题。我的主要问题是在实际的处理,方法等,我不知道如何提取我需要的项目,并将其作为他们有些“嵌套”。 例 所述可发生一次或两次,并且可以包含任意数量的其-in了转向有关于一个连接的信息的元素。基本上,我需要与他们的所有连接的列表,和。我必须为每个元素创建一个类吗? 就我所

  • 目前,我们的应用程序没有利用spring集成提供的xml转换器。相反,它创建一个JaxbContext,然后从该JaxbContext创建一个JAXB解组器/封送器池,并将其连接到服务活动器中。我们创建池是为了不产生为每个操作创建封送器和解封送器的成本。 作为重构工作的一部分,我们决定使用xml变压器。在尝试实现时,我们发现org.spring.oxm.封送器实现不支持封送器/反封送器的池,因为S