Bonjour, je souhaite utiliser l'API JAXB pour sauvegarder des données semi-statiques de mon application (elles seront rarement modifiées).

Voici un premier jet de mon XML Schema représentant un modèle simplifié de mes données:

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
<?xml version="1.1"?>
 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
	<xs:element name="calendar">
		<xs:complexType>
			<xs:sequence>
				<xs:element name="annualProcesses" type="annualProcessesType" />
				<xs:element name="genericProcesses" type="genericProcessesType" />
			</xs:sequence>
		</xs:complexType>
		<xs:key name="unique-CCC">
			<xs:selector xpath="calendar/family/process"></xs:selector>
			<xs:field xpath="@id"></xs:field>
		</xs:key>
	</xs:element>
 
	<xs:complexType name="annualProcessesType">
		<xs:sequence>
			<xs:element name="family" type="familyType" minOccurs="1" maxOccurs="unbounded" />
		</xs:sequence>
	</xs:complexType>
 
	<xs:complexType name="genericProcessesType">
		<xs:sequence>
			<xs:element name="family" type="familyType" minOccurs="1" maxOccurs="unbounded" />
		</xs:sequence>
	</xs:complexType>
 
	<xs:complexType name="familyType">
		<xs:sequence>
			<xs:element name="process" type="processType" minOccurs="1" maxOccurs="unbounded" />
		</xs:sequence>
		<xs:attribute name="name" type="xs:string" use="required"/>
		<xs:attribute name="color" type="xs:string" use="required"/>
	</xs:complexType>
 
	<xs:complexType name="processType">
		<xs:sequence>
			<xs:element name="countries">
				<xs:complexType>
					<xs:sequence>
						<xs:element name="country" type="countryType" minOccurs="1" maxOccurs="unbounded" />
					</xs:sequence>
				</xs:complexType>
			</xs:element>
		</xs:sequence>
		<xs:attribute name="id" type="xs:string" use="required"/>
		<xs:attribute name="name" type="xs:string" use="required"/>
	</xs:complexType>
 
	<xs:simpleType name="countryType">
		<xs:restriction base="xs:string">
			<xs:enumeration value="FR"/>
			<xs:enumeration value="UK"/>
			<xs:enumeration value="GER"/>
			<xs:enumeration value="SP"/>
		</xs:restriction>
	</xs:simpleType>
</xs:schema>
Le problème se situe au niveau de l'enumeration countryType. Voici le code généré par xjc:

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
@XmlType(name = "countryType")
@XmlEnum
public enum CountryType {
 
    FR,
    UK,
    GER,
    SP;
 
    public String value() {
        return name();
    }
 
    public static CountryType fromValue(String v) {
        return valueOf(v);
    }
 
}

Dans mon programme principal, la toute première instruction ne s'exécute pas:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
JAXBContext jc = JAXBContext.newInstance("testjaxb"); //testjaxb est le nom du package contenant toutes mes sources
L'erreur générée à l'exécution est la suivante:
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
java.lang.TypeNotPresentException: Type CountryType not present
        at sun.reflect.generics.factory.CoreReflectionFactory.makeNamedType(CoreReflectionFactory.java:98)
        at sun.reflect.generics.visitor.Reifier.visitClassTypeSignature(Reifier.java:107)
        at sun.reflect.generics.tree.ClassTypeSignature.accept(ClassTypeSignature.java:31)
        at sun.reflect.generics.visitor.Reifier.reifyTypeArguments(Reifier.java:50)
        at sun.reflect.generics.visitor.Reifier.visitClassTypeSignature(Reifier.java:120)
        at sun.reflect.generics.tree.ClassTypeSignature.accept(ClassTypeSignature.java:31)
        at sun.reflect.generics.repository.FieldRepository.getGenericType(FieldRepository.java:67)
        at java.lang.reflect.Field.getGenericType(Field.java:223)
        at com.sun.xml.internal.bind.v2.model.nav.ReflectionNavigator.getFieldType(ReflectionNavigator.java:237)
        at com.sun.xml.internal.bind.v2.model.nav.ReflectionNavigator.getFieldType(ReflectionNavigator.java:22)
        at com.sun.xml.internal.bind.v2.model.impl.FieldPropertySeed.getRawType(FieldPropertySeed.java:38)
        at com.sun.xml.internal.bind.v2.model.impl.RuntimeClassInfoImpl$RuntimePropertySeed.getRawType(RuntimeClassInfoImpl.java:279)
        at com.sun.xml.internal.bind.v2.model.impl.RuntimeClassInfoImpl$RuntimePropertySeed.getRawType(RuntimeClassInfoImpl.java:253)
        at com.sun.xml.internal.bind.v2.model.impl.PropertyInfoImpl.getRawType(PropertyInfoImpl.java:141)
        at com.sun.xml.internal.bind.v2.model.impl.PropertyInfoImpl.getIndividualType(PropertyInfoImpl.java:147)
        at com.sun.xml.internal.bind.v2.model.impl.PropertyInfoImpl.<init>(PropertyInfoImpl.java:82)
        at com.sun.xml.internal.bind.v2.model.impl.ERPropertyInfoImpl.<init>(ERPropertyInfoImpl.java:17)
        at com.sun.xml.internal.bind.v2.model.impl.ElementPropertyInfoImpl.<init>(ElementPropertyInfoImpl.java:60)
        at com.sun.xml.internal.bind.v2.model.impl.RuntimeElementPropertyInfoImpl.<init>(RuntimeElementPropertyInfoImpl.java:23)
        at com.sun.xml.internal.bind.v2.model.impl.RuntimeClassInfoImpl.createElementProperty(RuntimeClassInfoImpl.java:129)
        at com.sun.xml.internal.bind.v2.model.impl.ClassInfoImpl.addProperty(ClassInfoImpl.java:794)
        at com.sun.xml.internal.bind.v2.model.impl.ClassInfoImpl.findFieldProperties(ClassInfoImpl.java:341)
        at com.sun.xml.internal.bind.v2.model.impl.ClassInfoImpl.getProperties(ClassInfoImpl.java:258)
        at com.sun.xml.internal.bind.v2.model.impl.RuntimeClassInfoImpl.getProperties(RuntimeClassInfoImpl.java:140)
        at com.sun.xml.internal.bind.v2.model.impl.ModelBuilder.getClassInfo(ModelBuilder.java:190)
        at com.sun.xml.internal.bind.v2.model.impl.RuntimeModelBuilder.getClassInfo(RuntimeModelBuilder.java:60)
        at com.sun.xml.internal.bind.v2.model.impl.RuntimeModelBuilder.getClassInfo(RuntimeModelBuilder.java:42)
        at com.sun.xml.internal.bind.v2.model.impl.ModelBuilder.getClassInfo(ModelBuilder.java:156)
        at com.sun.xml.internal.bind.v2.model.impl.RuntimeModelBuilder.getClassInfo(RuntimeModelBuilder.java:55)
        at com.sun.xml.internal.bind.v2.model.impl.RuntimeModelBuilder.getClassInfo(RuntimeModelBuilder.java:42)
        at com.sun.xml.internal.bind.v2.model.impl.ModelBuilder.getTypeInfo(ModelBuilder.java:262)
        at com.sun.xml.internal.bind.v2.model.impl.TypeRefImpl.calcRef(TypeRefImpl.java:56)
        at com.sun.xml.internal.bind.v2.model.impl.TypeRefImpl.getTarget(TypeRefImpl.java:33)
        at com.sun.xml.internal.bind.v2.model.impl.RuntimeTypeRefImpl.getTarget(RuntimeTypeRefImpl.java:22)
        at com.sun.xml.internal.bind.v2.model.impl.RuntimeTypeRefImpl.getTarget(RuntimeTypeRefImpl.java:15)
        at com.sun.xml.internal.bind.v2.model.impl.ElementPropertyInfoImpl$1.get(ElementPropertyInfoImpl.java:38)
        at com.sun.xml.internal.bind.v2.model.impl.ElementPropertyInfoImpl$1.get(ElementPropertyInfoImpl.java:36)
        at java.util.AbstractList$Itr.next(AbstractList.java:345)
        at com.sun.xml.internal.bind.v2.model.impl.ModelBuilder.getClassInfo(ModelBuilder.java:202)
        at com.sun.xml.internal.bind.v2.model.impl.RuntimeModelBuilder.getClassInfo(RuntimeModelBuilder.java:60)
        at com.sun.xml.internal.bind.v2.model.impl.RuntimeModelBuilder.getClassInfo(RuntimeModelBuilder.java:42)
        at com.sun.xml.internal.bind.v2.model.impl.ModelBuilder.getClassInfo(ModelBuilder.java:156)
        at com.sun.xml.internal.bind.v2.model.impl.RuntimeModelBuilder.getClassInfo(RuntimeModelBuilder.java:55)
        at com.sun.xml.internal.bind.v2.model.impl.RuntimeModelBuilder.getClassInfo(RuntimeModelBuilder.java:42)
        at com.sun.xml.internal.bind.v2.model.impl.ModelBuilder.getTypeInfo(ModelBuilder.java:262)
        at com.sun.xml.internal.bind.v2.model.impl.RegistryInfoImpl.<init>(RegistryInfoImpl.java:63)
        at com.sun.xml.internal.bind.v2.model.impl.ModelBuilder.addRegistry(ModelBuilder.java:304)
        at com.sun.xml.internal.bind.v2.model.impl.ModelBuilder.getTypeInfo(ModelBuilder.java:274)
        at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.getTypeInfoSet(JAXBContextImpl.java:416)
        at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:270)
        at com.sun.xml.internal.bind.v2.ContextFactory.createContext(ContextFactory.java:103)
        at com.sun.xml.internal.bind.v2.ContextFactory.createContext(ContextFactory.java:81)
        at com.sun.xml.internal.bind.v2.ContextFactory.createContext(ContextFactory.java:152)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:128)
        at javax.xml.bind.ContextFinder.find(ContextFinder.java:290)
        at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:372)
        at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:337)
        at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:244)
        at testjaxb.Main.main(Main.java:21)
Caused by: java.lang.ClassNotFoundException: CountryType
        at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
        at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:247)
        at sun.reflect.generics.factory.CoreReflectionFactory.makeNamedType(CoreReflectionFactory.java:95)
        ... 62 more
Je ne trouve pas la solution qui me permet d'utiliser les énumérations XML Schema, pourtant des exemples trouvés sur le net et exactement similaires sont dits fonctionnels.

J'utilise l'IDE Netbeans. Est-il possible que celui-crée un problème? Je précise que si je modifie le schéma pour ne pas y inclure d'enumeration, le programme s'exécute sans erreur, unmarshalling puis marshalling.

Merci d'avance pour toute aide que vous pourriez m'offrir.