2017-08-30 20 views
0

我想知道是否有人可以帮助我解决JAXB问题。JAXB解组到具体类而不使用xsi:在xml中键入类型但使用实际的具体类名称

如果我有2所具体实现的抽象类:例如(我已经离开了大部分的标记为简洁/ XML):

public abstract class Vehicle{} 

public class Car extends Vehicle{} 

public class Van extends Vehicle{} 

有一种方法,以具有以下XML和解组正确到相应的具体类

<request> 
    <car>...</car> 
</request> 

,而不是执行以下操作:

<request> 
    <vehicle xsi:type="car"></vehicle> 
</request> 

我需要这个的原因是为了与我们已经发布的API向后兼容。

在此先感谢。

+0

您可以使用注释并注释具体的实现。在这种情况下@XmlType()上面的车或范 –

回答

0

我刚刚在类似问题的俄语社区回答。也许你在寻找这样的事情:

@XmlElements({ 
     @XmlElement(name = "car", type = Car.class), 
     @XmlElement(name = "van", type = Van.class) 
}) 
public List<Vehicle> getVehicles() { 
     return vehicles; 
} 

一些简单的例子:

import javax.xml.bind.JAXBContext; 
import javax.xml.bind.JAXBException; 
import javax.xml.bind.Unmarshaller; 
import javax.xml.bind.annotation.*; 
import java.io.StringReader; 
import java.util.List; 

public class Test { 

    public static void main(String... args) throws JAXBException { 
     String xmldata = "<request><car></car><van></van></request>"; 
     StringReader reader = new StringReader(xmldata); 

     JAXBContext jaxbContext = JAXBContext.newInstance(Request.class); 
     Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); 

     Request request = (Request) unmarshaller.unmarshal(reader); 

     for (Vehicle object : request.getVehicles()) { 
      System.out.println(object.getClass()); 
     } 
    } 
} 

@XmlRootElement(name = "request") 
class Request { 
    private List<Vehicle> vehicles; 

    @XmlElements({ 
      @XmlElement(name = "car", type = Car.class), 
      @XmlElement(name = "van", type = Van.class) 
    }) 
    public List<Vehicle> getVehicles() { 
     return vehicles; 
    } 

    public void setVehicles(List<Vehicle> vehicles) { 
     this.vehicles = vehicles; 
    } 
} 

abstract class Vehicle { 
} 

class Van extends Vehicle { 
} 

class Car extends Vehicle { 
} 

输出将是:

class Car 
class Van 

UPD:评论后

更新。对于单个条目它无论如何都会正常工作只是删除List

@XmlRootElement(name = "request") 
class Request { 
    private Vehicle vehicles; 

    @XmlElements({ 
      @XmlElement(name = "car", type = Car.class), 
      @XmlElement(name = "van", type = Van.class) 
    }) 
    public Vehicle getVehicles() { 
     return vehicles; 
    } 

    public void setVehicles(Vehicle vehicles) { 
     this.vehicles = vehicles; 
    } 
} 

希望这会有所帮助。

+0

谢谢你的回应。我不能有一个清单。我需要的XML是“”或“”,并有JAXB它在请求对象分别解组要么“汽车”或“范”。 – Osramadus

+0

@Osramadus无论如何它会工作。这是一个通用的解决方案。只用单一条目更新了答案。 =) –

+0

非常感谢。这工作。感谢所有回复的人。非常感激。 – Osramadus

0

您可以使用注释并注释具体的实现。在这种情况下,@XmlType()在Car或Van上面。这样你将保持你的xml通用。

相关问题