我正在使用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
我们可以看到,目前它只有DomSourceFactory
和StringSourceFactory
。没有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>
谢谢你和最好的问候,
芽阮
尝试使用名称MessageDispatcherServlet配置
。AxiomSoapMessageFactory
bean。默认消息工厂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{
我正在使用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