-1

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

其中一项操作是“GetAddressData”。RAD 开发人员自动生成“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 "".

任何帮助将不胜感激!先感谢您。

4

1 回答 1

4

你需要做两件事。

  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]
于 2013-02-06T03:41:35.420 回答