gpt4 book ai didi

java - SOAP 响应在 CXF + 简单前端 + Aegis 数据绑定(bind)中错误地反序列化为 null

转载 作者:太空狗 更新时间:2023-10-29 22:58:33 25 4
gpt4 key购买 nike

我正在为 SOAP Web 服务编写客户端。我正在使用 CXF 库。使用简单的前端。以及宙斯盾数据绑定(bind)。服务器为 Web 方法提供一个 Java 接口(interface)(名为 MediaService),我将该接口(interface)导入到客户端项目中。然后,我使用 MediaService.aegis.xml 文件为方法参数提供名称(因为它们不被命名以及在序列化请求时)。

这是我在客户端使用的代码:

ClientProxyFactoryBean factory = new ClientProxyFactoryBean();
factory.setDataBinding(new AegisDatabinding());
factory.setServiceClass(MediaService.class);
factory.setAddress(urlMediaServer);
MediaService service = (MediaService) factory.create();
final List<Reference> listeReferences = service.sendMedia(bu, media);

服务接口(interface)是这样的:

public interface MediaService
{
public List sendMedia(String bu, Media media) throws Exception;
}

我启用了 XML 流日志记录,这样我就可以看到发送到服务器的 XML 流及其返回的流。

这是流:

要求:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<ns1:sendMedia xmlns:ns1="http://service.soclemedia.mycompany.com/">
<ns1:bu>sc_phx</ns1:bu>
<ns1:media>
<ns2:productId xmlns:ns2="http://bo.soclemedia.mycompany.com">TEST_CODE</ns2:productId>
<ns2:mediaName xmlns:ns2="http://bo.soclemedia.mycompany.com">test.png</ns2:mediaName>
</ns1:media>
</ns1:sendMedia>
</soap:Body>
</soap:Envelope>

响应:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soap:Body>
<sendMediaResponse xmlns="http://service.soclemedia.mycompany.com">
<out xmlns="http://service.soclemedia.mycompany.com">
<ns1:Reference xmlns:ns1="http://bo.soclemedia.mycompany.com">
<subType xmlns="http://bo.soclemedia.mycompany.com">standard</subType>
<typeMedia xmlns="http://bo.soclemedia.mycompany.com">photo</typeMedia>
</ns1:Reference>
<ns1:Reference xmlns:ns1="http://bo.soclemedia.mycompany.com">
<subType xmlns="http://bo.soclemedia.mycompany.com">standard</subType>
<typeMedia xmlns="http://bo.soclemedia.mycompany.com">photo</typeMedia>
</ns1:Reference>
</out>
</sendMediaResponse>
</soap:Body>
</soap:Envelope>

服务被调用,它回复并且客户端收到正确的回复。但在客户端中,进行 Web 服务调用的行 service.sendMedia(bu, media) 返回 null。反序列化回复有问题。您是否知道出了什么问题以及如何解决?

最好的问候。

更新:

调用这个方法的时候忘了说:

MediaService service = (MediaService) factory.create();

我收到这个错误:

INFO: Creating Service {http://service.soclemedia.mycompany.com/}MediaService from class com.mycompany.soclemedia.service.MediaService
24 nov. 2011 15:18:37 org.apache.cxf.aegis.type.XMLTypeCreator <clinit>
INFO: Could not set aegis schema. Not validating.
java.lang.UnsupportedOperationException: This parser does not support specification "null" version "null"
at javax.xml.parsers.DocumentBuilderFactory.setSchema(DocumentBuilderFactory.java:489)
at org.apache.cxf.aegis.type.XMLTypeCreator.<clinit>(XMLTypeCreator.java:125)
at org.apache.cxf.aegis.AegisContext.createRootTypeCreator(AegisContext.java:122)
at org.apache.cxf.aegis.AegisContext.createTypeCreator(AegisContext.java:111)
at org.apache.cxf.aegis.AegisContext.initialize(AegisContext.java:153)
at org.apache.cxf.aegis.databinding.AegisDatabinding.initialize(AegisDatabinding.java:229)
at org.apache.cxf.service.factory.AbstractServiceFactoryBean.initializeDataBindings(AbstractServiceFactoryBean.java:86)
at org.apache.cxf.service.factory.ReflectionServiceFactoryBean.buildServiceFromClass(ReflectionServiceFactoryBean.java:438)
at org.apache.cxf.service.factory.ReflectionServiceFactoryBean.initializeServiceModel(ReflectionServiceFactoryBean.java:501)
at org.apache.cxf.service.factory.ReflectionServiceFactoryBean.create(ReflectionServiceFactoryBean.java:241)
at org.apache.cxf.frontend.AbstractWSDLBasedEndpointFactory.createEndpoint(AbstractWSDLBasedEndpointFactory.java:101)
at org.apache.cxf.frontend.ClientFactoryBean.create(ClientFactoryBean.java:90)
at org.apache.cxf.frontend.ClientProxyFactoryBean.create(ClientProxyFactoryBean.java:153)
...

这是我的 cxf.xml:

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:cxf="http://cxf.apache.org/core"
xsi:schemaLocation="http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd">
<cxf:bus>
<cxf:features>
<cxf:logging/>
</cxf:features>
</cxf:bus>
</beans>

更新 2:

这是我的 MediaService.aegis.xml:

<mappings>
<mapping>
<method name="sendMedia">
<parameter index="0" mappedName="bu"/>
<parameter index="1" mappedName="media"/>
<return-type componentType="com.mycompany.soclemedia.bo.Reference" />
</method>
</mapping>
</mappings>

最佳答案

只是一个想法:

在我最近的一个项目中,我发现 CXF web 服务在 Jetty 中本地运行时工作正常,而在 Weblogic 容器中运行时所有顶级集合的反序列化为 null。

显然这是由 JAXB 中的一个已知错误引起的(抱歉,手头没有引用),解决方法是以这种方式包装集合:

public class Wrapper 
{
private List<Reference> references;
...
}

并让 web 服务在线上处理这个对象。

我希望这也适用于您的问题,如果运气不好 :-)

/安德斯/

关于java - SOAP 响应在 CXF + 简单前端 + Aegis 数据绑定(bind)中错误地反序列化为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8254948/

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