JAXB没有接收@XmlJavaTypeAdapter

JAXB没有接收@XmlJavaTypeAdapter,jaxb,Jaxb,我需要将以下类序列化为XML: @XmlAccessorType(XmlAccessType.FIELD) public class Position { @XmlElement(name = "Quantity", required = true) private DecimalQuantity quantity; ... } 我在DecimalQuantity类上放了一个XmlJavaTypeAdapter,因为我希望它可以简单地序列化为BigDecimal,而

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

@XmlAccessorType(XmlAccessType.FIELD)
public class Position {

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

    ...
}
我在DecimalQuantity类上放了一个XmlJavaTypeAdapter,因为我希望它可以简单地序列化为BigDecimal,而不需要DecimalQuantity包装器

@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();
    }
}
如下所示进行序列化-十进制数周围没有包装-生活很好

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Order>
    <Quantity>10.2</Quantity>
</Order>
我已经尝试在属性本身上添加@XmlJavaTypeAdapter注释,但JAXB没有选择它。消除该异常的唯一方法是在Position类本身上放置一个@xmlseeals({DecimalQuantity.class})。但是,这会禁用适配器,我会得到以下(不希望的)序列化:

<Quantity xsi:type="ns2:decimalQuantity" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>

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

谢谢


Naresh

您确定问题出在小数的
XmlJavaTypeAdapter
上,而不是
DecimalQuantity
类型。因为您发布的异常是当JAXB遇到未知类的值时发生的异常

如果省略
@XmlJavaTypeAdapter
注释会发生什么?我知道它可能无法按您希望的方式工作,但错误消息是什么?不一样吗

在编写时,添加以下内容时,异常消失:

@XmlSeeAlso({DecimalQuantity.class})
我会将注释留在代码中,并尝试找出适配器无法工作的原因


您能否在XML适配器中调试和/或添加一些跟踪输出,以确保适配器真正返回非空字符串?

好的,我终于找到了问题所在。我的单元测试是在Java运行时获取JAXB实现,而我的实际应用程序(一个web服务)是从GlassFish获取JAXB实现。显然,与GlassFish(2.2.1.1)捆绑的实现无法处理我的用例。我通过强制我的单元测试使用jaxb-impl-2.2.1.1.jar证明了这一点。另外,在最新的JAXB实现(2.2.3-1)中,这个错误似乎已经修复,但我正在努力找出如何用这个新版本替换GlassFish的实现(参见我的文章)。

它可能忽略了一个无效的适配器。显示您的
DecimalQuantityAdapter
代码。该适配器有效。它正在我的单元测试中工作。我已经在帖子中添加了DecimalQuantityAdapter代码,并试图广泛地澄清这个问题。请你再看一看,我试着在两个适配器中添加跟踪。正如所料,DecimalQuantityAdapter甚至没有被调用,而DateTimeAdapter正在被调用。
<Quantity xsi:type="ns2:decimalQuantity" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
@XmlSeeAlso({DecimalQuantity.class})