2010-12-23 73 views
3

Especifications: - 服務器:WebLogic 9.2上固定的客戶。 - 由客戶修正的wsdl和xsd文件定義的Web服務;不允許修改。使用JAXB解組在WebLogic Server

嗨,

在項目中我們需要開發一個郵件系統。這必須與web服務共同完成。我們創建一個從非根xsd元素(不是wsdl)接收自動生成的類的Bean;這個bean做這個普通的工作。郵件系統收到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元素的問題。

我們不能創建「上下文字符串」(包名)的解組「會造成不的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結構。

回答

1

如果指定郵件服務器所接收的xml的XSD與wsdl中包含的xsd相同(字面意思是,通過具有相同的文件或具有相同完全限定名稱的語義),則在JAXB生成的類應該能夠按直線通過。

如果沒有,那麼從郵件服務的XML BLOB簡直是不能夠被髮送直入web服務。但沒關係,這就是您的代理bean的用途。

如果您正在解析xml,那麼您將手動構建一個基於郵件服務器解組對象的新對象(wsdl生成的jaxb對象)。我知道對象(郵件和webservices)可能是邏輯上是一樣的,而你希望有一些魔術膠,但是XML比這個更嚴格。

如果你想使用JAXB解組從生成的類Web服務從郵件服務解組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> 
+0

wsdl使用Schema,我們將其命名爲A.xsd,其中定義了一對複雜類型。另一方面,郵件服務接收使用其他Schema的文件,我們將其命名爲B.xsd,它將一個元素定義爲一系列A.xsd類型元素。我需要這個A.xsd types元素信息,並且我認爲如果我將正確的dom節點傳遞給JAXB,它將起作用,解組將完成。從我的理解中可以明白,即使元素是在同一個模式中定義的,JAXB也不能這樣做,因爲這不是代碼生成的根文檔。 – Leo 2011-02-11 15:06:41