Unmarshaller un singleton
Bonjour,
Voici mon problème : j'ai un fichier XML qui contient différentes données de configuration. Je souhaite gérer (lire/écrire) ce fichier simplement. Pour cela il me semble que JAXB est adapté.
Dans mon application j'ai donc un objet (Param) qui reprend les différentes données de configuration sous forme d'attributs.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
|
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "param")
@XmlAccessorType(XmlAccessType.FIELD)
public class Param {
private static Param instance;
@XmlElement
private String data;
private Param(){
}
public static synchronized Param getInstance() {
if (null == Param.instance) {
Param.instance = new Param();
}
return Param.instance;
}
public String getData() {
return this.data;
}
} |
Je veux que cet objet soit un singleton car les paramétres de l'appli sont communs à toute l'appli et je veux y avoir accès depuis n'importe où sans avoir à me trainer un lien vers cet objet.
J'arrive à faire le unmarshal de mon fichier XML mais si je fais un getInstance() de celui-ci un nouvel objet est créé.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
|
import java.io.File;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
public class TestJaxb {
public static void main(String args[]) {
// Read xml config file.
JAXBContext jaxbContext;
try {
jaxbContext = JAXBContext.newInstance(Param.class);
Unmarshaller um = jaxbContext.createUnmarshaller();
File _configFile = new File("param.xml");
Param param = (Param)um.unmarshal(_configFile);
System.out.println("Param 1 : " + param + "(" + param.getData() + ")");
param = Param.getInstance();
System.out.println("Param 2 : " + param + "(" + param.getData() + ")");
} catch (JAXBException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} |
Effectivement, lors du unmarshal l'attribut instance prend la valeur par défaut (null). Du coup le getInstance() créé un nouvel objet.
Ma question est donc : comment faire pour que lors du unmarshal mon attribut instance soit mis à jour.
Merci pour vos suggestions.
S. Combes