簡體   English   中英

Java-WS:是否可以將原始XML用作一個參數,而其余參數仍使用JAXB對象?

[英]Java-WS: is it possible to use raw XML for one argument and still use JAXB objects for the rest?

我正在編寫一個將在WebSphere上運行的Java Web服務客戶端。 我在RAD Developer中創建了一個新的“ Web Service Client”項目,為其提供了WSDL,指定了“ Top down Java Bean”,並自動生成了一堆文件。

操作之一是“ GetAddressData”。 RAD Developer自動生成的“ GetAddressData.java”和“ GetAddressDataResonse.java”都用“ XmlRootElement”注釋。

“ GetAddressData”中的參數之一是“ RequestData”,它是由四個字符串組成的簡單對象:worfklow,module,username和id。 RAD Developer也為我生成了一個“ RequestData.java”。

問:有什么方法可以代替JAXB“ RequestData”對象的原始XML,而不是一次打包和拆包記錄的字段?

我嘗試過這樣的事情:

private static String theXml =   
    "<requestOptions>\n" +  
    "  <WorkflowName>unmarshalTestWorkflow</WorkflowName>\n" +  
    "  <ModuleName>unmarshalTestModule</ModuleName>\n" +  
    "  <UserName>unmarshalTestName</UserName>\n" +  
    "  <TransactionId>0099</TransactionId>\n" +  
    "</requestOptions>\n";  

private RequestOptions mkRequestOptions () throws Exception {  
    JAXBContext context = JAXBContext.newInstance(RequestOptions.class);  
    Unmarshaller unmarshaller = context.createUnmarshaller();  
    Object obj = unmarshaller.unmarshal(new StringReader (theXml));  
    RequestOptions requestOptions = (RequestOptions)obj;
    ...

但我不斷得到:

error: Unexpected element "requestOptions". Expected elements are "".

任何幫助將不勝感激! 先感謝您。

您需要做兩件事。

  1. 根目錄中的xmlns: <requestOptions xmlns=\\"http://www.company.com/ns\\"> 這可以追溯到您的XSD。
  2. 因為聽起來RequestData不是@XmlRootElement,所以您必須解組將其包裝在JAXBElement中

圖示在這里:

public class Test
{
  static String randomXml =
      "<divisionRequestHeader xmlns=\"http://www.company.com/ns/\">"
        + "<id>fake id</id>"
        + "<CoName>My Co Name</CoName>" + "<User>"
        + "<Type>EXTERNAL</Type>" + "<Value>me</Value>" + "</User>"
        + "<Count>100</Count>"
        + "<Requestor>My App Requesting</Requestor>"
        + "</divisionRequestHeader>";

  public static void main(String[] args) throws Exception
  {
    JAXBContext context = JAXBContext.newInstance(DivisionRequestHeader.class);
    Unmarshaller unmarshaller = context.createUnmarshaller();
    Source source = new StreamSource(new StringReader(randomXml));

    JAXBElement<DivisionRequestHeader> jaxbElement = unmarshaller.unmarshal(source,
            DivisionRequestHeader.class);
    DivisionRequestHeader header = jaxbElement.getValue();

    System.out.println(header.toString());
  }
}

使用jaxb toString插件輸出:

com.company.ns.DivisionRequestHeader@620c620c[id=fake id, coName=My Co Name,
    user=com.company.ns.User@79e479e4[type=EXTERNAL, value=me], count=100,
    requestor=My App Requesting]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM