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.
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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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; } }
J'arrive à faire le unmarshal de mon fichier XML mais si je fais un getInstance() de celui-ci un nouvel objet est créé.
Effectivement, lors du unmarshal l'attribut instance prend la valeur par défaut (null). Du coup le getInstance() créé un nouvel objet.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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(); } } }
Ma question est donc : comment faire pour que lors du unmarshal mon attribut instance soit mis à jour.
Merci pour vos suggestions.
S. Combes
Partager