【问题标题】:JAX-WS Handling nested SOAP elementsJAX-WS 处理嵌套的 SOAP 元素
【发布时间】:2021-06-30 11:17:19
【问题描述】:

你好 Stack 社区,

我最近发现了将 SOAP 消息映射到 Java 对象的问题。我想自动化 SOAP 测试,其中消息体的问题部分如下所示:

<jobData>

 <entryList>
     <name>Key#1</name>
     <entryList>
       <value>Key#1ChildValue</value>
       <name>Key#1ChildKey</name>
     </entryList>
 </entryList>

 <entryList>
   <name>Key#2</name>
   <entryList>
    <value>Key#2ChildValue</value>
    <name>Key#2ChildKey</name>
   </entryList>
 </entryList>
  .
  . // POSSIBLE MORE <entryList> elements
  . 
</jobData>

我使用 wsimport 工具 (JDK 8) 来解析 WSDL。这是我得到的:

jobData 元素

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "DataDto", propOrder = {
    "recordedEntries"
})
public class DataDto
    extends DataRowDto
{

    protected RecordedEntriesDto recordedEntries;
    // getter and setter
}

RecordedEntriesDto

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "RecordedEntriesDto", propOrder = {
    "entries"
})
public class RecordedEntriesDto
    extends AbstractVersionableDto
{

    @XmlElement(nillable = true)
    protected List<RecordedEntryDto> entries;
}

RecordetEntryDto

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "RecordedEntryDto", propOrder = {
    "key",
    "value"
})
public class RecordedEntryDto
    extends AbstractVersionableDto
{

    protected String key;
    protected Object value;

看起来,entryList 元素可能包含自身作为值。 我不知道如何将一个嵌套在另一个中,因为无论我尝试什么,发送请求时总是会出现以下错误:

field not serializable: private java.lang.Object com.whateverpackage.RecordedEntryDto.value

现在...经过几天的搜索堆栈,谷歌,公司的人,我放弃了,我感觉就像站在巨大的砖墙旁边。 我对 SOAP 请求结构没有影响,我只能处理处理它的 Java 代码。 你知道如何处理它吗?

最好的问候,

Java Auto Tester 新手

【问题讨论】:

    标签: java jaxb jax-ws wsimport


    【解决方案1】:

    如果我理解正确,您想要多个条目? 根据您的错误,我认为您正在尝试添加多个 RecordedEntryDto,但您需要为此使用 RecordedEntriesDto 类。


    • 假设您有 2 个条目
    RecordedEntryDto entry1 = new RecordedEntryDto();
    RecordedEntryDto entry2 = new RecordedEntryDto();
    
    • 现在您想将它们放在一个列表中
    List<RecordedEntryDto> allEntriesList = new ArrayList<>();
    allEntriesList.add(entry1);
    allEntriesList.add(entry2);
    
    • 现在您将列表放入 RecordedEntriesDto 对象
    RecordedEntriesDto entriesDto = new RecordedEntriesDto();
    entriesDto.setEntries(allEntriesList);
    
    • 然后您可以完成 DataDto
    DataDto dataDto = new DataDto();
    dataDto.setRecordedEntries(entriesDto);
    

    【讨论】:

    • 嗨格罗乔斯。谢谢你的回复。不幸的是,这并不容易,我一直在尝试这样的动作。我仍然会遇到同样的错误。看来我无法将 DataEntryDto 值设置为 DataEntryDto。
    • 我在你的帖子中没有看到 DataEntryDto,所以我不确定我是否能像这样帮助你。我认为上传完整的 wsdl 是不可能的?也许只有这个例子的类的版本?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-09
    • 2011-08-13
    • 1970-01-01
    • 2016-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多