Ich arbeite an einer Konfigurations-XML-Datei, die ich gerne dynamisch wäre.JAXB Vererbung dynamisch benannte Tags
Ich habe die folgenden Klassen:
Repository:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "repository")
public class Repository
implements Serializable
{
@XmlElement(name = "custom-configuration")
private CustomConfiguration customConfiguration;
...
// Constructor
// Getters and setters
}
CustomConfiguration:
@XmlAccessorType(XmlAccessType.FIELD)
public class CustomConfiguration
{
}
FooBarConfiguration:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "foo-bar-configuration")
public class FooBarConfiguration extends CustomConfiguration
{
@XmlAttribute
private String bucket;
@XmlAttribute
private String key;
public FooBarConfiguration()
{
}
public String getBucket()
{
return bucket;
}
public void setBucket(String bucket)
{
this.bucket = bucket;
}
public String getKey()
{
return key;
}
public void setKey(String key)
{
this.key = key;
}
}
Dies ist, was ich haben möchte:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<repository id="test-repository">
<foo-bar-configuration bucket="test-bucket" key="test-key"/>
<group/>
</repository>
Dies ist, was ich bin immer statt:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<repository id="test-repository">
<customConfiguration xsi:type="fooBarConfiguration" bucket="test-bucket" key="test-key" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
<group/>
</repository>
Irgendwelche Ideen, wie dies zu erreichen?
Das Problem ist, ich benutze keine XSD. Ich habe Klassen, die die 'CustomConfiguration' erweitern können, die nicht bekannt sind. Sie können oder sind nicht auf dem Klassenpfad, also kann ich nicht so einfach einen 'Objektmapper' schreiben (weil ich vorher die Namen dieser Klassen kennen müsste). Irgendwelche anderen Vorschläge? – carlspring
@carlspring Sie benötigen keine XSD und müssen die Klassen auch nicht im Voraus kennen. Platzieren Sie 'ObjectFactory', wo Ihre Erweiterungsklassen sind. Verwenden Sie es beim Erstellen des JAXB-Kontexts in Runtime. Sie müssen diese Klassen nicht in der Kompilierzeit kennen. – lexicore
Denkst du, du könntest vielleicht meinen Diff hier kurz anschauen: https://github.com/strongbox/strongbox/pull/183/files und sag mir, was ich falsch mache? (Wenn Sie den Code erstellen möchten, überprüfen Sie bitte hier: https://github.com/strongbox/strongbox/wiki/Building-the-code). Dies ist der Fehler, den ich bekomme: https://github.com/strongbox/strongbox/pull/183/commits/9bdc666c32e7ba04df2e1befe7655050c1652bc9. – carlspring