鉴于以下课程:
@XmlSeeAlso({A.class, B.class})
@XmlDiscriminatorNode("@type")
public abstract class Base implements Serializable {
}
让A
(和类似的B
)成为:
@XmlDiscriminatorValue("A")
public class A extends Base {
private String foo;
// constructor, getter, setter
}
包含两种类型的List<Base>
对象将导致此示例JSON:
{
"list": [
{
"@type": "A",
"bar": 123
},
{
"@type": "A",
"bar": 789
},
{
"@type": "B",
"foo": "sddadad"
},
{
"@type": "B",
"foo": "ttf4eg4gf sd"
},
{
"@type": "A",
"bar": 465
}
]
}
现在到我的问题开始的部分:当@type
属性移出“第一”位置时,解组失败:
{
"bar" : 123,
"@type" : "A"
}
Exception Description: Missing class indicator field from database row [UnmarshalRecordImpl()].
这是预期的行为吗?我是否必须确保@type
声明始终是“第一”?
我每晚都在使用EclipseLink 2.5.1.v20130619-ffd088c。
答案 0 :(得分:2)
当在unmarshaller上指定UnmarshallerProperties.JSON_ATTRIBUTE_PREFIX
时,当前EclipseLink JAXB (MOXy)要求具有属性前缀的键在没有键之前发生。我已打开以下强化请求(请参阅下面的链接),您可以使用该请求跟踪我们在此问题上的进展。
解决方法强>
仅在设置UnmarshallerProperties.JSON_ATTRIBUTE_PREFIX
属性时才会出现此问题。如果没有设置,MOXy可以解决以下问题而不会出现任何问题:
{
"bar" : 123,
"type" : "A"
}