2012-11-07 4 views
1

Je reçois cette exception dans mybatis tout en essayant d'exécuter l'instruction de mise à jour (UpdateUser):mybatis: ClassCastException: java.lang.Integer ne peut pas être jeté à java.lang.Boolean

java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Boolean 
at $Proxy6.updateUser(Unknown Source) 
at com.nortal.pirs.persistence.dbmybatis.UserDaoMyBatisImpl.updateUser(UserDaoMyBatisImpl.java:60) 
at com.nortal.pirs.test.persistence.UserDaoAbstractTest.testUpdateUser(UserDaoAbstractTest.java:117) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
at java.lang.reflect.Method.invoke(Unknown Source) 
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45) 
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) 
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42) 
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) 
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28) 
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:30) 
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47) 
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231) 
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60) 
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229) 
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50) 
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222) 
at org.junit.runners.ParentRunner.run(ParentRunner.java:300) 
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) 
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 

Mon type de données L'utilisateur avec qui je travaille ressemble à ceci:

public class User { 
private String firstName = ""; 
private String lastName = ""; 
private String personCode = ""; 
private Date birthDate = new Date(); 
private Gender gender = Gender.MALE; 
private String email = ""; 
private String password = ""; 
private UserState userState = UserState.UNAPPROVED; 

public User() { 
} 

avec les correcteurs et les setters bien sûr.

Mon interface UserMapper.java pour mybatis se présente comme suit:

public interface UserMapper { 

public User getUserByEmail(String email); 

public void addUser(User user); 

public void removeUser(String email); 

public int getNumberOfUsers(); 

public int userExists(String email); 

public boolean updateUser(@Param ("oldUser") User oldUser, @Param("newUser") User newUser); 

public Map<String, User> getAllUsers(); 

}

Et mon UserMapper.xml ressemble à ceci:

<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE mapper 
    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 
<mapper namespace="com.nortal.pirs.persistence.dbmybatis.UserMapper"> 

    <!-- QUESTION: Is the <cache /> needed as described in one of your examples? And what is it meant to do? --> 

    <resultMap id="UserMap" type="com.nortal.pirs.datamodel.User"> 
     <result property="firstName" column="firstName"/> 
     <result property="lastName" column="lastName"/> 
     <result property="personCode" column="personCode"/> 
     <result property="birthDate" column="birthDate" javaType="Date"/> 
     <result property="gender" column="gender" javaType="com.nortal.pirs.datamodel.Gender"/> 
     <result property="email" column="email"/> 
     <result property="password" column="password"/> 
     <result property="userState" column="userState" javaType="com.nortal.pirs.datamodel.UserState"/>   
    </resultMap> 

    <select id="getUserByEmail" parameterType="String" resultMap="UserMap"> 
     SELECT 
     firstName, 
     lastName, 
     personCode, 
     birthDate, 
     gender, 
     email, 
     password, 
     userState  
     FROM USER 
     WHERE email = #{email} 
    </select> 

    <insert id="addUser" parameterType="User" > 
     INSERT INTO user 

     (firstName, 
     lastName, 
     personCode, 
     birthDate, 
     gender, 
     email, 
     password, 
     userState) 

     VALUES 
     (#{firstName}, 
     #{lastName}, 
     #{personCode}, 
     #{birthDate}, 
     #{gender}, 
     #{email}, 
     #{password}, 
     #{userState})   
    </insert> 

    <delete id="removeUser" parameterType="String"> 
     DELETE FROM user 
     WHERE email = #{email} 
    </delete> 


    <select id="getNumberOfUsers" resultType="int"> 
     SELECT 
     COUNT(email) 
     FROM USER 
    </select> 

    <select id="userExists" parameterType="String" resultType="int"> 
     SELECT CASE WHEN EXISTS (
      SELECT 
      COUNT(email) 
      FROM USER) 
    </select> 

    <update id="updateUser" parameterType="map"> 
     UPDATE user 
     SET 
     firstName = #{newUser.firstName}, 
     lastName = #{newUser.lastName}, 
     personCode = #{newUser.personCode}, 
     birthDate = #{newUser.birthDate}, 
     gender = #{newUser.gender}, 
     email = #{newUser.email}, 
     password = #{newUser.password}, 
     userState = #{newUser.userState} 
     WHERE email = #{oldUser.email} 
    </update> 

</mapper> 

comme je l'ai mentionné l'exception est lancé lorsque updateUser est appelé. La chose étrange est que je ne peux même pas voir quelque chose lié à Integer ici. Je veux dire que j'ai même essayé de tester en mettant juste à jour un champ. C'est tout pareil. Je ne reçois l'exception que si la requête est totalement supprimée, j'obtiendrais l'erreur de requête ou quelque chose d'erreur ...

Des suggestions? Merci d'avance. Edit: si les gens votent ma question sans rien dire, ils devraient au moins dire ce qui n'allait pas avec la question, ce serait plus utile ... Je n'ai pas posté cette question par plaisir. En effet je suis un peu coincé sur ce sujet depuis un certain temps maintenant ...

+2

Avez-vous essayé d'examiner votre déclaration de méthode 'updateUser' qui retourne' boolean' (peut-être est-elle configurée pour renvoyer 'int' à la place). –

+0

@LuiggiMendoza Merci, c'était, en fait, je suppose que parfois vous devenez aveugle ...;) Merci encore. –

Répondre

6

UPDATE La requête ne retourne pas un type boolean. Il renvoie un integer représentant le numéro de rows mis à jour avec succès. Et vous avez donné un type de retour de boolean à votre updateUser qui utilise la requête UPDATE.

Modifiez le type de retour de updateUser à int. J'espère que cela fonctionnerait alors.

Questions connexes