PropertyAccessException & IllegalArgumentException à l'appel d'un setter
Bonsoir,
Voilà 2 jours que je cherche une solution, sans succès. Dans ma Bdd existante (postgresql), j'ai des tables qui contiennent des champs de type Character Y ou N pour illustrer une sorte de booléens.
Du côté objet, j'ai cherché à transformer automatiquement ces java.lang.Character en booléens. J'ai donc utilisé la classe abstraite org.hibernate.type.CharBooleanType que j'ai étendue ainsi :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
import org.hibernate.type.CharBooleanType;
public class Char2BooleanType extends CharBooleanType {
@Override
public String getFalseString() {
return "N";
}
@Override
public String getTrueString() {
return "Y";
}
} |
J'ai également modifié (voir plus bas) les fichiers de mapping hbm.xml correspondant aux 2 classes impactées. À la base, j'ai généré les classes java et les fichiers de mapping depuis un reverse engineering de la base de données grâce à Hibernate Tools.
Avant de faire cette modification de Character en boolean, je n'avais pas de problème, mais depuis que j'ai rajouté cette classe et que j'ai modifié les classes et mappings j'ai une erreur. Ce qui est bizarre, c'est que lorsque j'appelle une première fois dans l'application le projetRight en question, j'ai l'erreur qui est lancée, mais les fois suivantes, le chargement de l'objet se fait correctement et l'application ne renvoie plus d'erreur.
Voici l'erreur que j'obtiens :
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 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
| getting ProticProjectRight instance with id: main.java.fr.inra.moulon.proticport.server.dao.ProticProjectRightId@7628
Debug - Entrée try/catch...
Exception de type runtime : IllegalArgumentException occurred while calling setter of main.java.fr.inra.moulon.proticport.server.dao.ProticProjectRight.canUpdate
org.hibernate.PropertyAccessException: IllegalArgumentException occurred while calling setter of main.java.fr.inra.moulon.proticport.server.dao.ProticProjectRight.canUpdate
at org.hibernate.property.BasicPropertyAccessor$BasicSetter.set(BasicPropertyAccessor.java:128)
at org.hibernate.tuple.entity.AbstractEntityTuplizer.setPropertyValues(AbstractEntityTuplizer.java:352)
at org.hibernate.tuple.entity.PojoEntityTuplizer.setPropertyValues(PojoEntityTuplizer.java:232)
at org.hibernate.persister.entity.AbstractEntityPersister.setPropertyValues(AbstractEntityPersister.java:3580)
at org.hibernate.engine.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:152)
at org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:877)
at org.hibernate.loader.Loader.doQuery(Loader.java:752)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:259)
at org.hibernate.loader.Loader.loadEntity(Loader.java:1885)
at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:71)
at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:65)
at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:3062)
at org.hibernate.event.def.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:434)
at org.hibernate.event.def.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:415)
at org.hibernate.event.def.DefaultLoadEventListener.load(DefaultLoadEventListener.java:165)
at org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:223)
at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:126)
at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:906)
at org.hibernate.impl.SessionImpl.get(SessionImpl.java:843)
at main.java.fr.inra.moulon.proticport.server.dao.ProticProjectRightHome.findById(ProticProjectRightHome.java:103)
at main.java.fr.inra.moulon.proticport.server.ServerProticPortFactory.getProject(ServerProticPortFactory.java:78)
at main.java.fr.inra.moulon.cxf.ProticPortCxf.getProject(ProticPortCxf.java:74)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:616)
at org.apache.cxf.service.invoker.AbstractInvoker.performInvocation(AbstractInvoker.java:166)
at org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:82)
at org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:117)
at org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:77)
at org.apache.cxf.interceptor.ServiceInvokerInterceptor$1.run(ServiceInvokerInterceptor.java:57)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
at java.util.concurrent.FutureTask.run(FutureTask.java:166)
at org.apache.cxf.workqueue.SynchronousExecutor.execute(SynchronousExecutor.java:37)
at org.apache.cxf.interceptor.ServiceInvokerInterceptor.handleMessage(ServiceInvokerInterceptor.java:95)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:236)
at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:89)
at org.apache.cxf.transport.servlet.ServletDestination.invoke(ServletDestination.java:99)
at org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:357)
at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:146)
at org.apache.cxf.transport.servlet.AbstractCXFServlet.invoke(AbstractCXFServlet.java:163)
at org.apache.cxf.transport.servlet.AbstractCXFServlet.doGet(AbstractCXFServlet.java:145)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:363)
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:219)
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:738)
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405)
at org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:206)
at org.mortbay.jetty.handler.HandlerCollection.handle(HandlerCollection.java:113)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at org.mortbay.jetty.Server.handle(Server.java:325)
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:535)
at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:859)
at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:514)
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:211)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:391)
at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:410)
at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:488)
Caused by: java.lang.IllegalArgumentException: argument type mismatch
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:616)
at org.hibernate.property.BasicPropertyAccessor$BasicSetter.set(BasicPropertyAccessor.java:66)
... 61 more
Exception message is:
IllegalArgumentException occurred while calling setter of main.java.fr.inra.moulon.proticport.server.dao.ProticProjectRight.canUpdate |
Voici la classe qui renvoie l'exception, ProticProjectRightHome.java :
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 32 33 34 35 36 37 38 39 40
| public class ProticProjectRightHome {
private Session session = HibernateUtil.getCurrentSession();
[...]
public ProticProjectRight findById(main.java.fr.inra.moulon.proticport.server.dao.ProticProjectRightId id) {
System.out.println("getting ProticProjectRight instance with id: " + id);
try {
System.out.println("Debug - Entrée try/catch...");
ProticProjectRight instance = (ProticProjectRight) session.get(
"main.java.fr.inra.moulon.proticport.server.dao.ProticProjectRight", id);
System.out.println("Debug - Assignation instance de ProticProjectRight effectuée.");
if (instance == null) {
log.debug("get successful, no instance found");
}
else {
log.debug("get successful, instance found");
}
return instance;
}
catch (RuntimeException re) {
System.out.println("Exception de type runtime : " + re.getMessage());
log.error("get failed", re);
throw re;
}
}
public List<ProticProjectRight> findByExample(ProticProjectRight instance) {
try {
List<ProticProjectRight> results = (List<ProticProjectRight>) sessionFactory.getCurrentSession().createCriteria(
"main.java.fr.inra.moulon.proticport.server.dao.ProticProjectRight").add(create(instance)).list();
return results;
}
catch (RuntimeException re) {
log.error("find by example failed", re);
throw re;
}
}
} |
- ProticStatus.java :
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
| public class ProticStatus implements java.io.Serializable {
private Char2BooleanType isPrivate;
private Char2BooleanType isObsolet;
[...]
public ProticStatus() {
}
public ProticStatus(Char2BooleanType isPrivate,
Char2BooleanType isObsolet) {
this.isPrivate = isPrivate;
this.isObsolet = isObsolet;
}
public Char2BooleanType getIsPrivate() {
return this.isPrivate;
}
public void setIsPrivate(Char2BooleanType isPrivate) {
this.isPrivate = isPrivate;
}
public Char2BooleanType getIsObsolet() {
return this.isObsolet;
}
public void setIsObsolet(Char2BooleanType isObsolet) {
this.isObsolet = isObsolet;
}
[...]
} |
Et le fichier de mapping :
Code:
1 2 3 4 5 6 7 8 9 10 11 12
| <hibernate-mapping>
<class name="main.java.fr.inra.moulon.proticport.server.dao.ProticStatus" table="protic_status" schema="public">
[...]
<property name="isPrivate" type="main.java.fr.inra.moulon.proticport.server.dao.utils.Char2BooleanType">
<column name="is_private" length="1" />
</property>
<property name="isObsolet" type="main.java.fr.inra.moulon.proticport.server.dao.utils.Char2BooleanType">
<column name="is_obsolet" length="1" />
</property>
[...]
</class>
</hibernate-mapping> |
- ProticProjectRight :
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
| public class ProticProjectRight implements java.io.Serializable {
private Char2BooleanType isPrivate;
private Char2BooleanType isObsolet;
private Char2BooleanType canUpdate;
private Char2BooleanType canInsert;
[...]
public ProticProjectRight() {
}
public ProticProjectRight(Char2BooleanType isPrivate, Char2BooleanType isObsolet, Char2BooleanType canUpdate, Char2BooleanType canInsert) {
this.isPrivate = isPrivate;
this.isObsolet = isObsolet;
this.canUpdate = canUpdate;
this.canInsert = canInsert;
[...]
}
public Char2BooleanType getIsPrivate() {
return this.isPrivate;
}
public void setIsPrivate(Char2BooleanType isPrivate) {
this.isPrivate = isPrivate;
}
public Char2BooleanType getIsObsolet() {
return this.isObsolet;
}
public void setIsObsolet(Char2BooleanType isObsolet) {
this.isObsolet = isObsolet;
}
public Char2BooleanType getCanUpdate() {
return canUpdate;
}
public void setCanUpdate(Char2BooleanType canUpdate) {
this.canUpdate = canUpdate;
}
public Char2BooleanType getCanInsert() {
return canInsert;
}
public void setCanInsert(Char2BooleanType canInsert) {
this.canInsert = canInsert;
}
[...]
} |
Et le fichier de mapping :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| <hibernate-mapping>
<class name="main.java.fr.inra.moulon.proticport.server.dao.ProticProjectRight" table="protic_project_right" schema="public">
<composite-id name="id" class="main.java.fr.inra.moulon.proticport.server.dao.ProticProjectRightId">
[...]
<property name="isPrivate" type="main.java.fr.inra.moulon.proticport.server.dao.utils.Char2BooleanType">
<column name="is_private" />
</property>
<property name="isObsolet" type="main.java.fr.inra.moulon.proticport.server.dao.utils.Char2BooleanType">
<column name="is_obsolet" />
</property>
<property name="canUpdate" type="main.java.fr.inra.moulon.proticport.server.dao.utils.Char2BooleanType">
<column name="can_update" />
</property>
<property name="canInsert" type="main.java.fr.inra.moulon.proticport.server.dao.utils.Char2BooleanType">
<column name="can_insert" />
</property>
[...]
</class>
</hibernate-mapping> |
Je n'ai pas trouvé ce qui bloque lors du premier appel de la fonction, si vous avez des suggestions, je suis toute ouïe.
Merci de votre aide.