Jackson XML mit interfaces

Joreyk

Mitglied
Hallo zusammen,
Nach langem wieder mal da.


Das ist mein Versuch mit jackson eine liste von interfaces zu exportieren.
Ich will in der xml eine reihenfolge an commands haben und diese in xml schreiben und lesen.
aber aktuell kommt das raus
Java:
<ArrayList>
  <item>
    <schemaName/>
  </item>
</ArrayList>
obwohl ich das haben möchte
Code:
<ArrayList>
  <CreateSchema>
    <schemaName/>
    .....
  <CreateSchema/>
  <DropSchema>
  ....
  </DropSchema>
</ArrayList>
es wird beim wrapping nicht der typ verwendet das ist ein problem und es wird item verwendet als wrapping das will ich auch nicht
ich komm mit den 100 tausend annotationen nicht klar, war zu lange in der C# welt

wegen der "ordnung" muss ich die liste in java so füllen wies in der xml steht

was noch oben drein dann dazu kommt ist ich will eine art ?factory? bauen damit die entwickler nicht abhängig von meinen commands implementierungen sind
am ende soll das erst mal eine bibliothek werden die main ist einfach mal da
 
Zuletzt bearbeitet:

Joreyk

Mitglied
gut das hat soweit funktioniert

hab das auch gepusht
Java:
<DbCommands>
  <Command _type="CreateSchema">
    <schemaName/>
  </Command>
  <Command _type="DropSchema"/>
</DbCommands>
das kommt jetzt raus, aber ich will ja in der xsd auch beschreiben wie drop schema aussehen muss oder create schema
dass zb CreateSchema einen schema namen braucht das geht ja so noch nicht
 

Joreyk

Mitglied
Java:
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = As.WRAPPER_OBJECT)
das hat jetzt bewirkt dass der typ als wrapper gneommen wird soweit so gut aber die listen elemente werden immer noch mit command gewrapped
 

mihe7

Top Contributor
Also für mich sieht das falsch aus. Du willst XML erzeugen und verwendest JSON-Annotations. Warum benutzt du keine XML-Annotations?
Weil Jackson für JSON ist (ironischerweise von einer Firma FasterXML) und die XML-Verarbeitung praktisch nur ien Add-On ist. Ich muss allerdings dazusagen, dass ich mich mit Jackson nicht auskenne. Die Projektseite zum Projekt jackson-dataformat-xml liefert:

https://github.com/FasterXML/jackson-dataformat-xml hat gesagt.:
Polymorphic Type Handling works, but only some of inclusion mechanisms are supported (WRAPPER_ARRAY, for example is not supported due to problems wrt mapping of XML, Arrays)
  • JAXB-style "compact" Type Id where property name is replaced with Type Id is not supported.

Vielleicht sollte man den Spaß in FasterJSON with CrappyXML umbenennen 😀
 

Joreyk

Mitglied
gut dann ist halt der wrapper pro element zusätzlich da, die xsd wird das schon regeln


der typ wird jetzt als wrapper verwendet das passt

dann zu meinen nächsten problem
wie kann das da hinkriegen
Java:
was noch oben drein dann dazu kommt ist ich will eine art ?factory? bauen damit die entwickler nicht abhängig von meinen commands implementierungen sind
die commands haben unterschiedliche fields also zb bei command1 brauch ich dsa passwort bei command2 brauch ich kein passwort

wie kann ich da eine geschmeidige api anbieten? oder wie könnte so ein konstrukt aussehen?
 

Joreyk

Mitglied
Wo kommt das Passwort denn her? Soll das vom Entwickler beim Bauen des Command-Objekts angegeben werden oder kennt die Factory das Passwort?
das kommt aus einem vault pfad

das ist in der umgebung eingebettet wo man das ausführt, also da msus ich nix extra machen
geht eher darum dass entwickler commands erstellen können per code und ich nicht meine commands public machen muss
 

mihe7

Top Contributor
Was ist mit der zweiten Frage? Ich brauche ein paar Infos, um das Problem zu verstehen. So wie es sich im Moment anhört, sind das ja einfach zwei simple Methoden:
Java:
public Command create() { return new CreateCommand(getPasswordFromVault()); }
public Command drop() { return new DropCommand(); }
 

Joreyk

Mitglied
jeder command hat 3 gleiche fields ( client nummer , bundesland , entwicklungs ebene )
aber auch noch extra felder wie zb beim CopyCommand da kopier ich ein schema ins andere also zwei schemen namen
der drop command hat das nich

ich hab insgesamt 7 commands als anforderung und jeder von denen hat mindestens ein feld unterschied zu einem anderen


soooo und jetz vom design her ist es aktuell so, das command interface ist annotiert mit den typen, damit ist jegliche code erweiterung eh schon hinfällig weil die entwickler mein interface ja nicht extra annotieren können

die commands sind alle public klassen.. muss das sein? soll das so?
sollte man da nicht abstract factory oder sowas machen?
 
Zuletzt bearbeitet:

mihe7

Top Contributor
Wenn wir mal das XML-Gedöns außer Acht lasssen, dann brauchen die Implementierungen natürlich nicht public zu sein (ob Jackson damit umgehen kann, weiß ich nicht).

aber auch noch extra felder wie zb beim CopyCommand da kopier ich ein schema ins andere also zwei schemen namen
der drop command hat das nich
Das sind aber doch keine Implementierungsdetails, sondern Anforderungen an den "abstrakten Datentyp". Du könntest also z. B. eine Factory haben:
Java:
interface CommandFactory {
    Command create();
    Command drop();
    Command copy(String sourceSchema, String destSchema);
    // usw.

Java:
class MyCommandFactory implements CommandFactory {
    private String clientId;
    private String bundesland;
    private String entwicklungsEbene;

    public MyCommandFactory(String clientId, String bundesland, String entwicklungsEbene) {
        this.clientId = clientId;
        this.bundesland = bundesland;
        this.entwicklungsEbene = entwicklungsEbene;
    }

    public Command create() { return new MyCreateCommand(getPasswordFromVault()); }
    public Command drop() { return new MyDropCommand(); }
    public Command copy(String sourceSchema, String destSchema) { return new MyCopyCommand(sourceSchema, destSchema); }
}

Java:
CommandFactory factory = new MyCommandFactory("IDXY132", "BW", "E29-1-2");
Command command = factory.copy("A", "B");
command.execute();

Nachtrag: und wenn Du nicht willst, dass der Entwickler die Factory selbst erzeugt, kannst Du ja z. B. auf einen ServiceLoader zurückgreifen.
 

Ähnliche Java Themen


Oben