2016-05-07 17 views
3

hatte ich folgende Fehlermeldungen ausgelöst, wenn die Zuordnerklassen auf meinem Server Startup-Registrierung,Mybatis - Mapped Statement Sammlung enthält bereits Wert für

[artifact:mvn] 2016-05-07 11:39:21,708 [ERROR] org.mybatis.spring.mapper.MapperFactoryBean - Error while adding the mapper 'interface com.sample.mappers.UserMapper' to configuration. 
[artifact:mvn] java.lang.IllegalArgumentException: Mapped Statements collection already contains value for com.sample.mappers.UserMapper.getAllUsers 
[artifact:mvn] at org.apache.ibatis.session.Configuration$StrictMap.put(Configuration.java:802) 
[artifact:mvn] at org.apache.ibatis.session.Configuration$StrictMap.put(Configuration.java:774) 
[artifact:mvn] at org.apache.ibatis.session.Configuration.addMappedStatement(Configuration.java:598) 
[artifact:mvn] at org.apache.ibatis.builder.MapperBuilderAssistant.addMappedStatement(MapperBuilderAssistant.java:300) 
[artifact:mvn] at org.apache.ibatis.builder.annotation.MapperAnnotationBuilder.parseStatement(MapperAnnotationBuilder.java:313) 
[artifact:mvn] at org.apache.ibatis.builder.annotation.MapperAnnotationBuilder.parse(MapperAnnotationBuilder.java:128) 
[artifact:mvn] at org.apache.ibatis.binding.MapperRegistry.addMapper(MapperRegistry.java:72) 
[artifact:mvn] at org.apache.ibatis.session.Configuration.addMapper(Configuration.java:671) 
[artifact:mvn] at org.mybatis.spring.mapper.MapperFactoryBean.checkDaoConfig(MapperFactoryBean.java:81) 
[artifact:mvn] at org.springframework.dao.support.DaoSupport.afterPropertiesSet(DaoSupport.java:44) 

ich Anmerkungen für meine Mapper-Schnittstellen verwendet und es gibt keine XML-Konfiguration.

Unten ist mein UserMapper Schnittstelle,

public interface UserMapper { 

    @Select("SELECT * FROM customer") 
    List<User> getAllUsers(); 

    @Select("SELECT * FROM customer where userId = #{userId} ") 
    List<User> getAllUsers(Long userId); 

} 

Antwort

6

ich die Ursache der Fehlermeldung herausgefunden. Wenn Sie den gleichen Methodennamen haben, löst mybatis die Mapped Statements collection already contains value Fehlermeldung aus. Die Lösung besteht also darin, unterschiedliche Methodennamen für unterschiedliche Zuordnungsanweisungen zu verwenden, auch wenn die Methodensignaturen unterschiedlich sind.

Also in meiner Mapper-Schnittstelle die Methode Namen zweite getAllUsers() Name sollte getUserById(); sein. Der gleiche Fehler wird ausgelöst, wenn Sie in einer der mapper.xml Dateien denselben Methodennamen haben. Daher ist es erforderlich, eindeutige Methodennamen oder Mapper-Namespaces für unterschiedliche SQL-Anweisungen für mybatis zu verwenden, um diese zur Laufzeit zuzuordnen.

-1

Vielleicht ist Ihr Parametertyp falsch. wie resultType oder resultMap, parameterType etc ...

+0

Möglicherweise nicht die beste Antwort. Eine Antwort wurde bereits gepostet und es handelt sich nicht um einen falschen Parametertyp –

1

In meinem Fall war das Vorkommen von resultMaps nach dem Hinzufügen von Mapper zur Konfiguration hinzugefügt.

ZB:

Configuration configuration = new Configuration(environment); 
configuration.addMappers("com.hemant.data.mapper"); 
configuration.addResultMap(getResultMapForRoles(configuration)); 

Wenn wir beobachten, ist Mybatis Quellcode, dann auf configuration.addMappers (..) ..... Parse() ausgeführt. org.apache.ibatis.builder.annotation.MapperAnnotationBuilder.parse() org.apache.ibatis.builder.annotation.MapperAnnotationBuilder.parseStatement (Methode)

for (Method method : methods) { 
     try { 
      // issue #237 
      if (!method.isBridge()) { 
      parseStatement(method); 
      } 
     } catch (IncompleteElementException e) { 
      configuration.addIncompleteMethod(new MethodResolver(this, method)); 
     } 
     } 

Wenn es ein Problem ist, das mit Parsen Anweisung (die in mycase auftrat, da die Anweisung @ResultMap-Annotation hatte, aber resultMap nicht zur Konfiguration bereitgestellt wurde), wird die Methode in INCOMPLETE_METHODS in der Konfiguration hinzugefügt, die später die Ausnahme auslöst.

@Select("select role_id, role_name, allowed_actions::bigint, denied_actions::bigint from acm_role") 
    @ResultMap("com.hemant.data.mapper.RoleMapper." + PermissionDBHook.ROLE_MAP) 
    public List<Role> getAllRoles(); 

Auf resultMap zu Konfiguration vor Mapper Zugabe löste es

Configuration configuration = new Configuration(environment); 
    //Hemant - result map should be added before mappers 
    configuration.addResultMap(getResultMapForRoles(configuration)); 
    configuration.addMappers("com.hemant.data.mapper"); 
0

Diese Antwort auf die Frage nicht direkt relevant ist, könnte aber für andere nützlich sein, einen ähnlichen Fehler konfrontiert:

Diese Es scheint ein Fehler zu sein, wenn MyBatis mehrere Definitionen für eine der Methoden im Mapper findet. In meinem Fall hatte ich sowohl die Annotation als auch eine Definition in der XML für eine Methode. Durch das Entfernen eines dieser Probleme wurde das Problem behoben.

+0

Dies habe ich bereits in meiner Antwort erwähnt. – Lucky