gpt4 book ai didi

java - 从 WSDL 生成的 JAXB POJO 使用起来似乎很麻烦

转载 作者:行者123 更新时间:2023-11-30 03:47:25 24 4
gpt4 key购买 nike

我对 SOAP 以及将 WSDL 转换为 POJO 并不陌生。我已成功连接到 Web 服务并检索我需要的数据。

问题在于遍历 WSDL 创建的对象层次结构。存储在生成的类中的大多数变量的类型都是 JAXBElement<NameOfJavaClassHere> 。因此,当我想要该对象时,我需要发出类似 ListOfEntitiesType loe = ents.getListOfEntities().getValue(); 的调用.getValue()这就是我的问题所在。

是否存在一种方法可以使集成更顺畅?如果我必须继续做getValue()这将是 1000 刀的死亡。

感觉他们在客户端级别留下了他们不需要的间接级别。

我尝试使用 JAXBContent 解码 xml对象,网上有很多关于如何执行此操作的示例,但在本例中不起作用。我的对象显示为 null。

WSDL 不应该制作不需要所有这些泛型转换的 POJO 吗?

我的 wsimport 使用了错误的设置吗? java 1.7 附带的命令?

我应该使用不同的 wsimport-ish 程序来生成我的 POJO 吗?

如果我必须坚持 .getValue()事情,我想我宁愿为原始 XML 创建一个 xpath 接口(interface),或者将整个事情变成 Hashtables 和 ArrayLists,而不是处理这个问题。

至少到那时,我就可以直接访问我想要的信息。

最佳答案

这个XML schema可能是在某些官僚统治的影响下发展起来的。考虑一下,例如

<xs:element minOccurs="0" name="DUNSNumber" nillable="true" type="xs:string"/>

结果是一个字段

protected JAXBElement<String> dunsNumber;

导致您(正确地)提示的高度偶然的获取和设置过程。 - XML 模式条目的含义是什么?它表示该元素是一个字符串,可以省略,并且必须能够区分空字符串和不存在的字符串即使该元素存在

这是一个小实验:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
version="1.0">
<xs:element name="root" type="RootType"/>
<xs:complexType name="RootType">
<xs:sequence>
<xs:element maxOccurs="unbounded" name="elem" type="ElemType"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="ElemType">
<xs:sequence>
<xs:element minOccurs="0" name="str01" type="xs:string"/>
<xs:element minOccurs="1" name="str1" type="xs:string"/>
<!-- The following element compiles to a JAXBElement<String> -->
<xs:element minOccurs="0" name="str01nil" nillable="true" type="xs:string"/>
<xs:element minOccurs="1" name="str1nil" nillable="true" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:schema>

这是一个 XML 文件:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
<elem>
<str01></str01>
<str1></str1>
<str01nil></str01nil>
<str1nil></str1nil>
</elem>
<elem>
<str1>must be there</str1>
<str01nil xsi:nil="true"></str01nil>
<str1nil>must be there</str1nil>
</elem>
</root>

这是解码例程打印的内容:

str01    []
str1 []
str01Nil []
str1Nil []
str01 [null]
str1 [must be there]
str01Nil [null]
str1Nil [must be there]

如果省略 <str01nil xsi:nil="true"></str01nil> 会发生什么完全地?结果是一样的,方法JAXBElement.getValue()将返回 null,就是这样。

现在(抱歉答案太长了)我们可以讨论如何才能返回到从 XML 模式生成的“正常”Java 代码。我只需删除 nillable="true"并使用生成的代码。如果进行编码(marshal),字段中的 null 将不会生成元素。在解码时,您看到带有 xsi:nil="true"的空元素的可能性很小。 (不过,保留 minOccurs="0"是很重要的。)

关于java - 从 WSDL 生成的 JAXB POJO 使用起来似乎很麻烦,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25298969/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com