IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Hibernate Java Discussion :

java.lang.IllegalArgumentException: Unknown name value for enum class


Sujet :

Hibernate Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2010
    Messages : 23
    Points : 22
    Points
    22
    Par défaut java.lang.IllegalArgumentException: Unknown name value for enum class
    Bonjour,


    J'ai une classe DepenseBeneficiaire.java, avec une clef composée d'attributs provenant d'une classe DepenseBeneficiaireId.java. Parmi ces attributs de DepenseBeneficiaireId se trouve une énumération permettant de déterminer le type de dépense.

    Ma classe se sauvegarde en base sans problème, mais la relecture bloque au moment où il faut matcher depense_id (champ de ma BDD) avec l'enum NatureDepense.


    DepenseBeneficiaire.java
    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
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    @Entity
    @Table(name="dep_beneficiaire")
    public class DepenseBeneficiaire implements Serializable
    {
     
     
    	private static final long serialVersionUID = 3872180192633198521L;
    	public static final String FIELD_IDBENEFICIAIRE	= "identifier";
    	public static final String FIELD_BENEFICIAIRE	= "beneficiaire";
     
    	private DepenseBeneficiaireId identifier;
     
    	@EmbeddedId
    	@AssociationOverrides
    	({
    		@AssociationOverride
    		(
    			name="beneficiaire",
    			joinColumns=
    			{
    				@JoinColumn(name="dossier_id", referencedColumnName="dossier_id"),
    				@JoinColumn(name="action_id", referencedColumnName="action_id"),
    				@JoinColumn(name="beneficiaire_id", referencedColumnName="id")
    			}
    		),
    		@AssociationOverride
    		(
    			name="depense_id",
    			joinColumns=
    			{
    				@JoinColumn(name="depense_id", referencedColumnName="depense_id")
    			}
    		)
    	})
    	public DepenseBeneficiaireId getIdentifier() {
    		return identifier;
    	}
    	public void setIdentifier(DepenseBeneficiaireId identifier) {
    		this.identifier = identifier;
    	}
    	@ManyToOne
    	@JoinColumns
    	({
    		@JoinColumn(name="dossier_id", referencedColumnName="dossier_id", insertable=false, updatable=false),
    		@JoinColumn(name="action_id", referencedColumnName="action_id", insertable=false, updatable=false),
    		@JoinColumn(name="beneficiaire_id", referencedColumnName="id", insertable=false, updatable=false)
    	})
    	public Beneficiaire getBeneficiaire()
    	{
    		return identifier.getBeneficiaire();
    	}
    	public void setBeneficiaire(Beneficiaire beneficiaire)
    	{
    		identifier.setBeneficiaire(beneficiaire);
    		if(beneficiaire.getAdherent_Id() 	!= null) setBeneficiaire_type("A");
    		if(beneficiaire.getFournisseur_Id() != null) setBeneficiaire_type("F");
    		if(beneficiaire.getOrganisme_Id() 	!= null) setBeneficiaire_type("O");
    		if(beneficiaire.getStagiaire_Id() 	!= null) setBeneficiaire_type("S");
    	}
    	@Column(name="depense_id", length=3, insertable=false, updatable=false)
    	public NatureDepense getDepense_id() {
    		return identifier.getDepense_id();
    	}
    	public void setDepense_id(NatureDepense depense_id) {
    		this.identifier.setDepense_id(depense_id);
    	}
     
    	public DepenseBeneficiaire()
    	{
    		identifier = new DepenseBeneficiaireId();
    	}
     
    	public DepenseBeneficiaire(NatureDepense natureDepense)
    	{
    		this();
    		setDepense_id(natureDepense);
    	}
     
    	@Override
    	public boolean equals(Object obj)
    	{
    		if(!(obj instanceof DepenseBeneficiaire))
    			return false;
    		DepenseBeneficiaire depenseBeneficiaire = (DepenseBeneficiaire)obj;
    		return
    			new EqualsBuilder()
    			.append(depenseBeneficiaire.getIdentifier(), getIdentifier())
    			.isEquals();
    	}
     
    	@Override
    	public int hashCode()
    	{
    		return
    			new HashCodeBuilder()
    			.append(getIdentifier())
    			.toHashCode();
    	}
    }
    et DepenseBeneficiaireId.java

    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
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    @Embeddable
    public class DepenseBeneficiaireId implements Serializable
    {
    	public enum NatureDepense
    	{
    		REMUNERATION			("01", "REMUNERATION"),
    		FORMATION				("03", "FORMATION"),
    		REPAS					("07", "REPAS"),
    		HEBERGEMENTREPAS		("08", "HEBERGEMENT ET REPAS"),
    		TRANSPORT				("09", "TRANSPORT"),
    		DIVERS					("10", "DIVERS"),
    		REMUNERATIONHTT			("16", "REMUNERATION HTT"),
    		ALLOCATIONFORMATION		("17", "ALLOCATION FORMATION"),
    		LOCATIONSALLE			("18", "LOCATION SALLE"),
    		LOCATIONMATERIEL		("19", "LOCATION MATERIEL");
     
    		private String identifier;
    		private String libelle;
     
    		public String getIdentifier() {
    			return identifier;
    		}
    		public String getLibelle() {
    			return libelle;
    		}
     
    		private NatureDepense(String identifier, String libelle)
    		{
    			this.identifier = identifier;
    			this.libelle = libelle;
    		}
     
    		public static NatureDepense value(String identifier)
    		{
    			NatureDepense result = null;
    			for(NatureDepense natureDepense: values())
    			{
    				if(natureDepense.getIdentifier().equals(identifier))
    				{
    					result = natureDepense;
    					break;
    				}
    			}
    			return result;
    		}
    	}
     
     
    	private static final long serialVersionUID 		= -4762088849677965696L;
    	public static final String FIELD_BENEFICIAIRE	= "beneficiaire";
     
    	private Beneficiaire beneficiaire;
    	private NatureDepense depense_id;
     
     
    	@Type
    	(
    		type="fr.site.hibernate.utils.GenericEnumUserType",
    		parameters=
    		{
    			@Parameter(name="enumClassName", value="fr.site.hibernate.classes.DepenseBeneficiaireId$NatureDepense"),
    			@Parameter(name="valueOfMethod", value="value")
    		}
    	)
    	public NatureDepense getDepense_id() {
    		return depense_id;
    	}
    	public void setDepense_id(NatureDepense depense_id) {
    		this.depense_id = depense_id;
    	}
    	@ManyToOne
    	public Beneficiaire getBeneficiaire() {
    		return beneficiaire;
    	}
    	public void setBeneficiaire(Beneficiaire beneficiaire) {
    		this.beneficiaire = beneficiaire;
    	}
     
     
    	@Override
    	public boolean equals(Object obj)
    	{
    		if(!(obj instanceof DepenseBeneficiaireId))
    			return false;
    		DepenseBeneficiaireId id = (DepenseBeneficiaireId)obj;
    		return
    			new EqualsBuilder()
    			.append(id.getBeneficiaire().getId(), getBeneficiaire().getId())
    			.append(id.getDepense_id().getIdentifier(), getDepense_id().getIdentifier())
    			.isEquals();
    	}
     
    	@Override
    	public int hashCode()
    	{
    		return
    			new HashCodeBuilder()
    			.append(getBeneficiaire().getId())
    			.append(getDepense_id().getIdentifier())
    			.toHashCode();
    	}
    }

    J'obtiens l'exception suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    java.lang.IllegalArgumentException: Unknown name value for enum class fr.site.hibernate.classes.DepenseBeneficiaireId$NatureDepense: 16
    [...]
    Caused by: java.lang.IllegalArgumentException: No enum const class fr.site.hibernate.classes.DepenseBeneficiaireId$NatureDepense.16


    Je vois bien qu'Hibernate essaie de charger la constante NatureDepense.16 qui n'existe pas, mais la fonction public static NatureDepense value(String identifier) devrait pallier à ce problème, non ? En tout cas, je sais qu'Hibernate passe dans cette fonction et trouve bien une NatureDepense matchant le String mis en paramètre.

    Je ne sais pas si c'est lié au fait que mon identifier soit de type String (je n'ai pas conservé l'EnumType par défaut), ou s'il me manque une annotation (j'ai essayé de mettre @Enumerated(EnumType.STRING), sans résultat), ou si je dois surcharger une méthode dans mon enum : une idée ?

  2. #2
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    C'est curieux, après avoir lu rapidement le code fourni, et celui que j'ai trouvé pour le GenericEnumUserType, j'ai l'impression qu'il devrait se passer le contraire : ça devrait trouver en base mais pas sauvegarder, vu qu'il manque le paramètre "identifierName" - par défaut, ça sauvegarde sous l'attribut name(), donc ici pour la valeur "16" => "REMUNERATIONHTT".

    Maintenant, j'ai regardé vraiment rapidement ...

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2010
    Messages : 23
    Points : 22
    Points
    22
    Par défaut
    Mon enum utilise la classe ci-dessous pour se sauver et se recharger :

    http://desgeeksetdeslettres.com/blog...ister-les-enum

    J'utilise cette même classe pour d'autres enum de mon appli, par exemple :

    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
    public enum Categorie
    	{
    		ADAPTATION	("1", "Adaptation"),
    		DEVELOPPEMENT	("2", "Développement des compétences"),
    		NULLCATEGORIE	("0", "Catégorie à null");
    		
    		private String identifier;
    		private String libelle;
    		
    		public String getIdentifier() {
    			return identifier;
    		}
    		public String getLibelle() {
    			return libelle;
    		}
    		
    		private Categorie(String identifier, String libelle)
    		{
    			this.identifier = identifier;
    			this.libelle = libelle;
    		}
    		
    		public static Categorie value(String identifier)
    		{
    			Categorie result = null;
    			for(Categorie categorie: values())
    			{
    				if(categorie.getIdentifier().equals(identifier))
    				{
    					result = categorie;
    					break;
    				}
    			}
    			return result;
    		}
    	}
    
    
    --------------------------------------
    
    
    	@Column(name="categorie", length=3)
    	@Type
    	(
    		type="fr.site.hibernate.utils.GenericEnumUserType",
    		parameters=
    		{
    			@Parameter(name="enumClassName", value="fr.site.hibernate.classes.Stagiaire$Categorie"),
    			@Parameter(name="valueOfMethod", value="value")
    		}
    	)
    	public Categorie getCategorie() {
    		return categorie;
    	}
    	public void setCategorie(Categorie categorie) {
    		this.categorie = categorie;
    	}
    Mes Categorie se sauvegardent dans un char(3), et sont relues par Hibernate puis par Dojo, qui effectue correctement la conversion entre les identifiers et les labels à afficher sur ma page .jsp.


    Les NatureDepense sont les seules enum à bloquer lors de la relecture : est-ce parce qu'elles sont définies dans une classe et enregistrées dans une autre ?

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2010
    Messages : 23
    Points : 22
    Points
    22
    Par défaut
    Pardon, j'ai oublié de préciser que j'avais changé deux-trois détails dans la classe GenericEnumUserType, entre autres :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private static final String DEFAULT_IDENTIFIER_METHOD_NAME = "getIdentifier";

    D'après ma stacktrace, l'erreur se situe dans la fonction nullSafeGet de la classe GenericEnumUserType. Je teste avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public Object nullSafeGet(ResultSet rs, String[] names, Object owner) throws HibernateException, SQLException
    	{  
    		Object identifier = type.get(rs, names[0]);	
    		System.out.println("identifier = " + identifier.toString());
    Et je vois que pour toutes les enum, y compris NatureDepense, l'identifier est bien le String enregistré en base.


    Mais si je bidouille avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(identifier.equals((Object)new String("19"))) identifier = (Object)new String("FORMATION");
    je n'ai plus d'exception !

  5. #5
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    Citation Envoyé par MNDev Voir le message
    Les NatureDepense sont les seules enum à bloquer lors de la relecture : est-ce parce qu'elles sont définies dans une classe et enregistrées dans une autre ?
    Je pense que c'est bien de là que vient le problème !

    Etant dans une autre classe, la méthode "getIdentifier" ne doit pas renvoyer le bon type - a priori vu la stack trace, ça doit renvoyer DepenseBeneficiaireId$NatureDepense, au lieu de String. Et de là, il ne sait pas faire le get sur "16".
    EDIT : Zut, lu trop vite, ce n'est pas cet endroit qui plante. Cela dit, ça doit être le même genre de souci.

    EDIT Bis : Est-ce que tu peux mettre un log dans NullSafeGet sur valueOfMethod.getName ?

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2010
    Messages : 23
    Points : 22
    Points
    22
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    try
    {
    	System.out.println("valueOfMethod.getName() = " + valueOfMethod.getName());
    	return valueOfMethod.invoke(enumClass, new Object[] { identifier });
    }
    catch (Exception e)
    {
    	throw new HibernateException("Exception while invoking valueOf method '" + valueOfMethod.getName() + "' of " + "enumeration class '" + enumClass + "'", e);
    }
    me renvoit valueOfMethod.getName() = value (pareil que pour les autres enums).

  7. #7
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    Tu pourrais fournir la stacktrace complète de l'exception ? Ça devient mystérieux ...

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2010
    Messages : 23
    Points : 22
    Points
    22
    Par défaut
    Stacktrace :

    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
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    java.lang.IllegalArgumentException: Unknown name value for enum class fr.site.hibernate.classes.DepenseBeneficiaireId$NatureDepense: 19
    	at org.hibernate.type.EnumType.nullSafeGet(EnumType.java:113)
    	at org.hibernate.type.CustomType.nullSafeGet(CustomType.java:128)
    	at org.hibernate.type.AbstractType.hydrate(AbstractType.java:105)
    	at org.hibernate.persister.entity.AbstractEntityPersister.hydrate(AbstractEntityPersister.java:2114)
    	at org.hibernate.loader.Loader.loadFromResultSet(Loader.java:1404)
    	at org.hibernate.loader.Loader.instanceNotYetLoaded(Loader.java:1332)
    	at org.hibernate.loader.Loader.getRow(Loader.java:1230)
    	at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:603)
    	at org.hibernate.loader.Loader.doQuery(Loader.java:724)
    	at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:259)
    	at org.hibernate.loader.Loader.loadCollection(Loader.java:2019)
    	at org.hibernate.loader.collection.CollectionLoader.initialize(CollectionLoader.java:59)
    	at org.hibernate.persister.collection.AbstractCollectionPersister.initialize(AbstractCollectionPersister.java:587)
    	at org.hibernate.event.def.DefaultInitializeCollectionEventListener.onInitializeCollection(DefaultInitializeCollectionEventListener.java:83)
    	at org.hibernate.impl.SessionImpl.initializeCollection(SessionImpl.java:1744)
    	at org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:366)
    	at org.hibernate.collection.AbstractPersistentCollection.read(AbstractPersistentCollection.java:108)
    	at org.hibernate.collection.AbstractPersistentCollection.readSize(AbstractPersistentCollection.java:131)
    	at org.hibernate.collection.PersistentSet.size(PersistentSet.java:162)
    	at fr.site.action.services.json.BeneficiairesAction.getBeneficiairesJson(BeneficiairesAction.java:82)
    	at fr.site.action.services.json.BeneficiairesAction.execute(BeneficiairesAction.java:107)
    	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 com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:441)
    	at com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:280)
    	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:243)
    	at com.googlecode.s2hibernate.struts2.plugin.s2hibernatevalidator.interceptor.HibernateValidator4Interceptor.intercept(HibernateValidator4Interceptor.java:85)
    	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    	at com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:165)
    	at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
    	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    	at com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:252)
    	at org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:68)
    	at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
    	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    	at com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:122)
    	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    	at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:195)
    	at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
    	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    	at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:195)
    	at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
    	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    	at com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:179)
    	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    	at org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:94)
    	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    	at org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:235)
    	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    	at com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:89)
    	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    	at com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:130)
    	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    	at org.apache.struts2.interceptor.ProfilingActivationInterceptor.intercept(ProfilingActivationInterceptor.java:104)
    	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    	at org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:267)
    	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    	at com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:126)
    	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    	at com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:138)
    	at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
    	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    	at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:195)
    	at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
    	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    	at fr.site.interceptor.LoginInterceptor.intercept(LoginInterceptor.java:58)
    	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    	at com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:165)
    	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    	at org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164)
    	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    	at com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:179)
    	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    	at com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:176)
    	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    	at com.googlecode.s2hibernate.struts2.plugin.interceptors.SessionTransactionInjectorInterceptor.intercept(SessionTransactionInjectorInterceptor.java:191)
    	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    	at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:52)
    	at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:488)
    	at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
    	at org.apache.struts2.dispatcher.ng.filter.StrutsExecuteFilter.doFilter(StrutsExecuteFilter.java:88)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    	at com.opensymphony.sitemesh.webapp.SiteMeshFilter.obtainContent(SiteMeshFilter.java:129)
    	at com.opensymphony.sitemesh.webapp.SiteMeshFilter.doFilter(SiteMeshFilter.java:77)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    	at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareFilter.doFilter(StrutsPrepareFilter.java:82)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
    	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:857)
    	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
    	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
    	at java.lang.Thread.run(Thread.java:619)
    Caused by: java.lang.IllegalArgumentException: No enum const class fr.site.hibernate.classes.DepenseBeneficiaireId$NatureDepense.19
    	at java.lang.Enum.valueOf(Enum.java:196)
    	at org.hibernate.type.EnumType.nullSafeGet(EnumType.java:110)
    	... 101 more



    J'ai fait un quickfix pour mon appli :

    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
    public Object nullSafeGet(ResultSet rs, String[] names, Object owner) throws HibernateException, SQLException
    {  
    	Object identifier = type.get(rs, names[0]);
    	Object natureDepenseClassName = (Object)new String("fr.site.hibernate.classes.DepenseBeneficiaireId$NatureDepense");
    	if(enumClassName.equals(natureDepenseClassName)) {
    		for(NatureDepense natureDepense: NatureDepense.values())
    		{
    			if(natureDepense.getIdentifier().equals(identifier)) identifier = (Object)new String(natureDepense.toString());
    		}
    	}
     
    	if (rs.wasNull())
    	{
    		return null;
    	}
     
    	try
    	{
    		return valueOfMethod.invoke(enumClass, new Object[] { identifier });
    	}
    	catch (Exception e)
    	{
    		throw new HibernateException("Exception while invoking valueOf method '" + valueOfMethod.getName() + "' of " +
    			"enumeration class '" + enumClass + "'", e);
    	}
    }


    L'exception n'apparaît plus, mais je ne récupère aucune DepenseBeneficiaire (depenses.size() = 0). J'enquête, mais je sens que c'est aussi lié à l'enum contenue dans une classe et sauvée par l'autre...

  9. #9
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    C'est curieux que la stacktrace n'indique pas ta classe custom mais org.hibernate.type.EnumType.

    En debug tu passes bien dans ta classe ?

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2010
    Messages : 23
    Points : 22
    Points
    22
    Par défaut
    Je ne sais plus dans quel ordre ça se fait, mais je sais que :

    - je passe dans la méthode nullSafeGet de la classe GenericEnumUserType, avec identifier qui contient 19, de type String, et
    - j'appelle la méthode value de l'enum NatureDepense, et elle me renvoit l'objet de type NatureDepense correspondant à l'identifier 19.

    A noter que je passe 2 fois dans nullSafeGet pour l'identifier 19, et que l'exception apparaît uniquement pour la première dépense trouvée en base (les autres sont ignorées, du coup).



    J'ai résolu mon problème, mais je laisse ce topic ouvert vu que l'origine du bug n'a pas encore été déterminée.

Discussions similaires

  1. Réponses: 1
    Dernier message: 16/09/2013, 14h10
  2. Réponses: 6
    Dernier message: 18/04/2013, 13h19
  3. Probleme de persistance : java.lang.IllegalArgumentException: Unknown entity.
    Par silverfab34 dans le forum Persistance des données
    Réponses: 0
    Dernier message: 28/07/2011, 17h57
  4. Réponses: 1
    Dernier message: 18/08/2010, 11h36
  5. Réponses: 9
    Dernier message: 03/06/2007, 21h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo