gpt4 book ai didi

java - 在 Weblogic Server 中使用 JAXB 解码

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:17:55 25 4
gpt4 key购买 nike

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

你好,

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

我们一直在寻找使用 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 元素都没有问题。

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

这是构建内容:

<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结构。

最佳答案

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

如果不是,那么邮件服务中的 xml blob 根本无法直接发送到网络服务中。不过没关系,这就是您的代理 bean 的用途。

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

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

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

请记住,这很重要,以下两个 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>

关于java - 在 Weblogic Server 中使用 JAXB 解码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4521313/

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