JAXB 没有选择 @XmlJavaTypeAdapter

标签 jaxb

我有以下需要序列化为 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/

相关文章:

java - Jaxb 解码返回空值

java - 使用 JAX-RS 和 MOXy 处理无效枚举

jaxb - 如何在 osgi (Liferay DXP) 中使用 JAXB 2.2.11

java - 无法让 JAXB 解析来自 Yahoo! 的 XML金融到 java

java - 使用 JAXB 从 XML 字符串创建对象

java - JAX-WS @WebMethod 返回用户定义的数据类型

java - JAXB 中的更改未反射(reflect)在 SOAP 响应中

java - JAXB 忽略 package-info.java 中的 @XmlAccessorFactory

java - JAXB 2.1 - 自定义 xs :any binding

java - JAXB 编码器和反编码器