JAXB带有抽象属性的JSON(Jackson)注释类

时间:2012-09-12 20:26:07

标签: json jaxb jackson

使用以下类构成JSON消息结构,我在JAX-RS调用(CXF)后转移到客户端,我收到

org.apache.cxf.jaxrs.client.ClientWebApplicationException: .Problem with reading the response message, class : class bg.vivacom.sel.dto.SELResponse, ContentType : application/json.
...
Caused by: org.codehaus.jackson.map.JsonMappingException: Can not construct instance of bg.vivacom.sel.dto.SELDTO, problem: abstract types can only be instantiated with additional type information
 at [Source: sun.net.www.protocol.http.HttpURLConnection$HttpInputStream@16edbe39; line: 1, column: 157] (through reference chain: bg.vivacom.sel.dto.SELResponse["dto"])

返回的对象包含属性 dto ,这是一个接口

@XmlRootElement(name = "SELResponse")
public class SELResponse implements Serializable{

@XmlElement(name = "corelationID")
private String corelationID;

@XmlElement(name = "responseTimeStamp")  
private String responseTimeStamp;

@XmlElement(name = "respStatusCode")  
private String respStatusCode;

@XmlElement(name = "respStatusMessage")  
private String respStatusMessage;

@XmlElement(name = "processStatus")  
private ProcessStatus processStatus;

@XmlElement(name = "dto")  
private SELDTO dto; 

界面

public interface SELDTO extends Serializable {

是根据请求在我的答案中包含许多不同DTO的方法,例如

@XmlRootElement(name = "customerProfile")
public class CustomerProfileDTO implements SELDTO {

@XmlElement(name = "customerCode")
private String customerCode;
...

@XmlRootElement(name = "sms")
public class SmsDTO implements SELDTO {

@XmlElement(name = "From")
private String from;
...

任何想法我还需要注释类,以便可以将响应正确设置为特定的对象类型。我知道它需要额外的信息,因为它重新创建它不知道它的类型的dto对象,所以我试图按如下方式注释接口:

@XmlSeeAlso({CustomerProfileDTO.class, SmsDTO .class})
public interface SELDTO extends Serializable {

但我仍然遇到了这个问题。任何想法都会受到赞赏。

1 个答案:

答案 0 :(得分:1)

对于这种情况,我建议使用Jackson注释'@JsonTypeInfo'。

但是如果必须使用JAXB注释,请使用@XmlElements@XmlElementRefs,类似于将它们与JAXB / XML一起使用的方式:

     @XmlElements({
             @XmlElement(type=SubClass1.class, name="sub1"),
             @XmlElement(type=SubClass2.class, name="sub2")
     })

请注意,您必须在此处包含可能的子类型的特定映射。