Je veux expliquer mon problème avec un exemple simple:marshalling JAXB: traiter objet vide comme il est nul
Foo:
@SomeXMLAnnotations
public class Foo {
// Bar is just a random class with its own XML annotations
@XmlElement(required = true)
Bar someBarObj;
boolean chosen = true;
boolean required = true;
public Foo(){
chosen = false;
}
public Foo(Bar someBarObj){
this.someBarObj = someBarObj;
}
}
MyClass:
@SomeXMLAnnotations
public class MyClass {
@XmlElement(required = false)
Foo anyFooObj;
@XmlElement(required = true)
Foo anyFooObjRequired;
public MyClass(){ }
public MyClass (Foo anyFooObj, Foo anyFooObjRequired){
this.anyFooObj = anyFooObj;
if(anyFooObj == null)
this.anyFooObj = new Foo();
/*
* This is the reason why i can't let 'anyFooObj' be 'null'.
* So 'anyFooObj' MUST be initialized somehow.
* It's needed for some internal logic, not JAXB.
*/
anyFooObj.required = false;
this.anyFooObjRequired = anyFooObjRequired;
}
}
Exemples d'objets:
Foo fooRequired = new Foo(new Bar());
MyClass myObj = new MyClass(null, fooRequired);
Quand j'essaie de maréchal myObj
maintenant, il jette une exception comme ceci:
org.eclipse.persistence.oxm.record.ValidatingMarshalRecord$MarshalSAXParseException;
cvc-complex-type.2.4.b: The content of element 'n0:anyFooObj ' is not complete.
One of '{"AnyNamespace":someBarObj}' is expected.
Cela se produit parce que anyFooObj
est initialisé, mais il est nécessaire, membre someBarObj
n'est pas.
Solution possible:
Je sais que je pourrais ajouter cette méthode pour MyClass
:
void beforeMarshal(Marshaller m){
if(! anyFooObj.chosen)
anyFooObj= null;
}
}
Mais j'ai beaucoup de classes et les classes ont beaucoup de champs ne sont pas nécessaires. Donc, cette solution prendrait des années et ne semble pas être une bonne solution.
Ma question:
est-il un moyen de dire JAXB qu'il devrait traiter des objets vides comme ils étaient null
? Ou qu'il doit ignorer un élément lorsqu'il n'est pas correctement défini. Quelque chose comme ceci par exemple:
@XmlElement(required = false, ingnoreWhenNotMarshallable = true)
Foo anyFooObj;
REMARQUE:
Je ne suis pas le développeur du code. Je dois juste ajouter JAXB au projet et rendre tout compatible avec un fichier XSD donné. Je ne suis pas autorisé à changer la relation entre les classes.
Eh bien, someBarObj a la propriété d'annotation 'required' réglée à true. Il n'y a aucun moyen qu'un objet qui est là puisse avoir l'air de ne pas être là. La propriété d'annotation doit être définie sur false ou omise. – laune