Java-WS:是否可以将原始XML用于一个参数,并仍然使用JAXB对象?

时间:2013-02-05 05:08:33

标签: java web-services jaxb jax-ws

我正在编写一个将在WebSphere上运行的Java Web服务客户端。我在RAD Developer中创建了一个新的“Web服务客户端”项目,给它我的WSDL,指定了“自上而下的Java Bean”,它自动生成了一堆文件。

其中一个操作是“GetAddressData”。 RAD Developer自动生成“GetAddressData.java”和“GetAddressDataResonse.java”,两者都注释为“XmlRootElement”。

“GetAddressData”中的一个参数是“RequestData”,一个由四个字符串组成的简单对象:worfklow,module,username和id。 RAD Developer也为我生成了“RequestData.java”。

问:有没有办法可以将原始XML替换为JAXB“RequestData”对象,而不是一次打包和解压缩一个字段?

我试过这样的事情:

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 个答案:

答案 0 :(得分:3)

你需要做两件事。

  1. 根目录中的xmlns:<requestOptions xmlns=\"http://www.company.com/ns\">。这会回到您的XSD。
  2. 由于听起来像RequestData不是@XmlRootElement,你必须解组它将它包装在JAXBElement中
  3. 这里有说明:

    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]