gpt4 book ai didi

JAXB 没有选择 @XmlJavaTypeAdapter

转载 作者:行者123 更新时间:2023-12-01 15:55:09 28 4
gpt4 key购买 nike

我有以下需要序列化为 XML 的类:

@XmlAccessorType(XmlAccessType.FIELD)
public class Position {

@XmlElement(name = "Quantity", required = true)
private DecimalQuantity quantity;

...
}

我在 DecimalQuantity 类上放了一个 XmlJavaTypeAdapter,因为我希望它在没有 DecimalQuantity 包装器的情况下简单地序列化为 BigDecimal。
@XmlJavaTypeAdapter(DecimalQuantityAdapter.class)
@Embeddable
public class DecimalQuantity {

private BigDecimal value;

...

}

这是非常简单的 DecimalQuantityAdapter 类:
public class DecimalQuantityAdapter
extends XmlAdapter<BigDecimal, DecimalQuantity> {

public DecimalQuantity unmarshal(BigDecimal val) throws Exception {
return new DecimalQuantity(val);
}

public BigDecimal marshal(DecimalQuantity val) throws Exception {
return val.getValue();
}
}

我有一个单元测试表明适配器工作正常。以下具有 DecimalQuantity 的 Order 对象被正确序列化(请注意,这个测试类看起来与上面的 Position 类几乎相同):
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "Order")
public class Order {

@XmlElement(name = "Quantity", required = true)
private DecimalQuantity quantity;

...

}

这将被序列化,如下所示 - 十进制数周围没有包装 - 生活很好!
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Order>
<Quantity>10.2</Quantity>
</Order>

当我尝试在其他 Maven 项目中使用 DecimalQuantity 时,麻烦就开始了。例如,本文开头显示的 Position 类位于不同的 maven 项目中。使用 Position 类的 Web 服务位于另一个 maven 项目中。当 Web 服务尝试反序列化 DecimalQuantity 时,它不知道 DecimalQuantity 是什么并且无法获取 DecimalQuantityAdapter。这是我得到的错误:
Caused by: javax.xml.bind.JAXBException:
class org.archfirst.common.quantity.DecimalQuantity nor any of its super class is known to this context.
at com.sun.xml.bind.v2.runtime.JAXBContextImpl.getBeanInfo(JAXBContextImpl.java:594)
at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:648)
... 53 more

我有事件试图在属性本身上添加 @XmlJavaTypeAdapter 注释,但 JAXB 没有选择它。摆脱异常的唯一方法是将 @XmlSeeAlso({DecimalQuantity.class}) 放在 Position 类本身上。但是,这会禁用适配器,我会得到以下(不需要的)序列化:
<Quantity xsi:type="ns2:decimalQuantity" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>

知道问题出在哪里吗?我觉得这与跨包/项目的 DecimalQuantity 和 DecimalQuantityAdapter 上的 JAXB 注释的可见性有关。

谢谢。

纳雷什

最佳答案

好的,我终于找到了问题所在。我的单元测试是在 Java 运行时中选择 JAXB 实现,而我的真实应用程序(一个 Web 服务)是从 GlassFish 中选择 JAXB 实现。显然,与 GlassFish (2.2.1.1) 捆绑的实现无法处理我的用例。我通过强制我的单元测试使用 jaxb-impl-2.2.1.1.jar 来证明这一点。此外,似乎该错误已在最新的 JAXB 实现 (2.2.3-1) 中得到修复,但我正在努力弄清楚如何用这个新版本替换 GlassFish 的实现(请参阅我的帖子 here )。

关于JAXB 没有选择 @XmlJavaTypeAdapter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4894692/

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