【问题标题】:Use JAXB unmarshalling in Weblogic Server在 Weblogic Server 中使用 JAXB 解组
【发布时间】:2011-05-30 02:38:24
【问题描述】:

E 规格: - 服务器:客户修复的 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 如何“解组” xml 使用 JAX-RPC 技术,我们能做到吗 xsd 元素也一样?
  • 如果是,我们该怎么做?
  • 如果不存在,则存在任何不复杂的 解决这个问题?
  • 如果不是,我们必须使用 XMLBean 技术。要么 使用 JAXB 技术重新生成 XSD。? 最好的解决方案是什么?

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

【问题讨论】:

    标签: java xsd jaxb weblogic9.x wsdlc


    【解决方案1】:

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

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

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

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

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

    请记住,这很重要,以下两个 xml sn-ps 相同,无论您希望它们是多少。

    <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>
    

    【讨论】:

    • wsdl 使用 Schema,我们将其命名为 A.xsd,其中定义了几个复杂类型。另一方面,邮件服务接收使用另一个模式的文件,我们将其命名为 B.xsd,它将元素定义为 A.xsd 类型元素的序列。我需要这个 A.xsd 类型元素信息,并且我认为如果我将正确的 dom 节点传递给 JAXB,它将起作用并且解组将完成。我从您的话中了解到,即使元素是在同一架构中定义的,JAXB 也无法做到这一点,因为这不是完成代码生成的根文档。
    • 如果“A.xsd 类型元素的序列”真正与 A.xsd 中的相同,那么是的,创建了一个 jaxb 上下文从 B.xsd 架构应该可以工作。但是您可能需要添加元素定义,(不仅仅是类型)如果没有看到 xml 和两种模式,很难说更多。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-17
    • 2012-12-21
    • 2011-01-15
    • 1970-01-01
    • 2017-10-23
    相关资源
    最近更新 更多