3

Especifications: - 服务器:Weblogic 9.2 由客户修复。- 由客户修复的 wsdl 和 xsd 文件定义的 Web 服务;不允许修改。

你好,

在项目中我们需要开发一个邮件系统。这必须与 web 服务共同工作。我们创建一个 Bean,它从非根 xsd 元素(不是 wsdl)接收自动生成的类;这个 bean 做这个共同的工作。邮件系统收到一个包含在 xsd 文件中定义的元素的 xml,我们需要将此元素信息放到 wsdlc 生成的类中。有了这个对象,我们就可以使用这个通用 bean。无法将邮件请求重定向到 Web 服务。

我们一直在寻找使用 WL9.2 资源执行此操作的代码,但没有找到任何东西。目前,我们尝试使用 JAXB 进行这种解组:

JAXBContext c = JAXBContext.newInstance(new Class[]{WasteDCSType.class});
Unmarshaller u = c.createUnmarshaller();
WasteDCSType w = u.unmarshal(waste, WasteDCSType.class).getValue();

废物变量是一个 DOM 元素对象。它不是根元素,因为根不包含在 XSD 中

首先,我们需要在一些自动生成的类中添加无参数构造函数。没问题,我们解决了这个问题,最后我们解组了没有错误异常的 xml。但是我们在属性方面遇到了问题。解组没有设置属性;它们都不是任何类,不是简单的属性,不是大的或短的枚举属性。任何类型的 xml 元素都没有问题。

我们无法从“上下文字符串”(包名)创建解组器,因为 wsldc 没有创建 ObjectFactory。如果我们设置模式,则不会建立元素描述并且解组崩溃。

这是构建内容:

<taskdef name="jwsc" classname="weblogic.wsee.tools.anttasks.JwscTask" />
<taskdef name="wsdlc" classname="weblogic.wsee.tools.anttasks.WsdlcTask"/>    

 <target name="generate-from-wsdl">
        <wsdlc
            srcWsdl="${src.dir}/wsdls/e3s-environmentalMasterData.wsdl"
            destJwsDir="${src.dir}/webservices"
            destImplDir="${src.dir}/webservices"
            packageName="org.arc.eterws.generated"
            />
        <wsdlc
            srcWsdl="${src.dir}/wsdls/e3s-waste.wsdl"
            destJwsDir="${src.dir}/webservices"
            destImplDir="${src.dir}/webservices"
            packageName="org.arc.eterws.generated"
            />
    </target>

<target name="webservices" description="">
        <jwsc srcdir="${src.dir}/webservices" destdir="${dest.dir}" classpathref="wspath">
            <module contextPath="E3S" name="webservices">

                <jws file="org/arc/eterws/impl/IE3SEnvironmentalMasterDataImpl.java"
                        compiledWsdl="${src.dir}/webservices/e3s-environmentalMasterData_wsdl.jar"/>

                <jws file="org/arc/eterws/impl/Ie3SWasteImpl.java"
                        compiledWsdl="${src.dir}/webservices/e3s-waste_wsdl.jar"/>

                <descriptor file="${src.dir}/webservices/META-INF/web.xml"/>
            </module>

        </jwsc>
</target>

我的问题是:

  • Weblogic 如何使用 JAX-RPC 技术“解组”xml,我们可以对 xsd 元素做同样的事情吗?
  • 如果是,我们该怎么做?
  • 如果没有,这个问题是否存在任何不复杂的解决方案?
  • 如果不是,我们必须使用 XMLBean 技术。还是使用 JAXB 技术重新生成 XSD。什么是最好的解决方案?

注意:实际上不是一个单一的 xsd,而是一个复杂的 xsd 结构。

4

1 回答 1

1

如果指定邮件服务器正在接收的 xml 的 XSD 与包含在 wsdl 中的 xsd 相同(字面意思是相同的文件或语义上具有相同的完全限定名称),则 jaxb 生成的类应该可以直接通过。

如果没有,那么来自邮件服务的 xml blob 根本无法直接发送到 Web 服务中。但这没关系,这就是您的代理 bean 的用途。

您在做时解组 xml,然后根据邮件服务器解组对象手动构造一个新对象(wsdl 生成的 jaxb 对象)。

我知道对象(邮件和 Web 服务)在逻辑上可能是相同的,您希望有一些神奇的粘合剂,但 XML 比这要严格得多。

如果您尝试使用 Web 服务生成的类中的 JAXB 解组器从邮件服务中解组 XML,同样,如果模式不相同,这将完全失败

请记住,这很重要,以下两个 xml 片段并不相同,无论您希望它们是多少。

<blob xmlns="urn:mailserver.schema.generated">
   <from>blah</from>
   <to>wop</to>
   <message>this is a message</message>
</blob>

<blob xmlns="urn:webservice.wsdl.generated">
   <from>blah</from>
   <to>wop</to>
   <message>this is a message</message>
</blob>
于 2011-02-02T15:51:03.983 回答