web-dev-qa-db-fra.com

mybatis spring mvc application, obtention d'une instruction liée non valide (introuvable)

c’est ma première application mybatis spring mvc avec Spring 3.2.4, mybatis-spring-1.2.1.

Quand j'essaie d'appeler mon webservice, j'obtiens l'erreur :: 

org.springframework.web.util.NestedServletException: Request processing failed; 
nested exception is org.Apache.ibatis.binding.BindingException: Invalid bound 
statement (not found): 
org.mydomain.formulary.drugmaster.dao.DrugMasterDao.getDrugsWithAlert

Il me manque quelque chose d’évident ... Merci pour toute aide

Voici mes fichiers associés: applicationContext.xml

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="formularyDb" />
    <property name="configLocation"  value="file:/web/sites/drugformulary-spring/config/mybatis-config.xml" />
</bean>

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage" value="org.mydomain.formulary.mappers" />
</bean>
<bean id="DrugMasterDao" class="org.mybatis.spring.mapper.MapperFactoryBean">
    <property name="mapperInterface" value="org.mydomain.formulary.drugmaster.dao.DrugMasterDao" />
    <property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>

<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
    <constructor-arg index="0" ref="sqlSessionFactory" />
</bean>

Fichier de mappage -> /classes/org/mydomain/formulary/mappers/drugmasterDao.xml

<mapper namespace="org.mydomain.formulary.drugmaster.dao.DrugMasterDao">

<select id="getDrugsWithAlert" parameterType="int" resultType="org.mydomain.formulary.drug_master.model.DrugMasters">
    Select drug_id,drug_name,drug_alert_date,drug_alert_source, rownum
    from (select drug_id,drug_name,to_char(drug_alert_datetime,'MM/DD/YYYY') as drug_alert_date ,drug_alert_source, rownum
    from drug_master
    where drug_status ='A' and length(drug_alert) > 0
    order by drug_alert_datetime DESC )
    where
    <if test="_parameter != null">
        rownum &lt; #{count}
    </if>
</select>
</mapper>

Fichier de mappage -> /classes/org/mydomain/formulary/drugmaster/dao/DrugMasterDao.Java

public interface DrugMasterDao {
    public List<DrugMasters> getDrugsWithAlert(int count);
}

fichier de contrôleur -> /classes/org/mydomain/formulary/drugmaster/controller/DrugMasterController.Java

@Controller
public class DrugMasterController {
@Autowired
DrugMasterService drugMasterService;


@RequestMapping(value = "/drugmaster/withalerts/count/{count}", method = RequestMethod.GET)
public String withAlerts(ModelMap model, @PathVariable int count) {

    List<DrugMasters> drugs = drugMasterService.getDrugsWithAlert(count);

    return null/*for now*/;

}
}    

fichier de service -> /classes/org/mydomain/formulary/drugmaster/service/DrugMasterServiceImpl.Java

@Service
public class DrugMasterServiceImpl implements DrugMasterService {

    @Autowired
    DrugMasterDao drugMasterDao;

    public List<DrugMasters> getDrugsWithAlert(int count){
        return drugMasterDao.getDrugsWithAlert(count);
    }
}

mybatis-configfile ->

<configuration>
<settings>
    <setting name="cacheEnabled" value="false" />
    <setting name="lazyLoadingEnabled" value="false" />
</settings>
</configuration>

enter image description here

14
randy

J'ai googlé cette réponse en cherchant mon erreur. En réalité, cela n'a rien à voir avec le problème d'OP, mais l'exception est la même et cette question est très visible dans Google.

Dans mon cas, j'ai oublié de changer l'espace de noms du mappeur

<mapper namespace="pl.my.package.MyNewMapper">

Ce qui a entraîné le même problème.

21
Dariusz

J'ai eu le même problème, donc après avoir lu les configurations de cette page. https://mybatis.github.io/spring/mappers.html#scan

J'ai vu que ma configuration était correcte. donc déboguer mon application. trouvé que mes fichiers * mappers.xml n'étaient pas dans le chemin. cette attente doit être. 

J'ai eu les fichiers XML dans le même dossier src "Java" dans mon projet maven. Ainsi, lorsque je construis mes applications, le fichier n'était pas copié dans le dossier classes. Je dois donc déplacer les fichiers xml dans le dossier "ressources". et résoudre le problème.

5
Giovanni Perea

Parce que votre fichier xml ne se charge pas dans mybatis, MapperScannerConfigurer uniquement une interface de numérisation, pas de xml .

<mappers>
    <mapper resource="org/mydomain/formulary/mappers/drugmasterDao.xml"/>
</mappers>

ou

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="configLocation" value="classpath:mybatis-config.xml"/>
    <property name="dataSource" ref="dataSource"/>
    <property name="mapperLocations" value="classpath*:org/mydomain/**/*.xml"/>
</bean>
3
Zheng Xiaodong

J'ai résolu le même problème avec une variante de la solution de Giovanni Perea (merci). J'ai les fichiers .xml mapper dans le même dossier avec les fichiers .Java mapper et j'utilise maven avec maven-resources-plugin. 

Dans ma solution, j'ai ajouté une exécution dans maven-resources-plugin pour copier tout le fichier mappeur .xml à l'emplacement correct (même dossier que les fichiers .class mapper):

<execution>
    <id>copy-mappers-xml</id>
    <phase>validate</phase>
    <goals>
        <goal>copy-resources</goal>
    </goals>
    <configuration>
        <outputDirectory>${project.build.directory}/classes/com/myapplication/mapper</outputDirectory>
        <resources>          
            <resource>
                <directory>${project.basedir}/src/main/Java/com/myapplication/mapper/</directory>
                <filtering>false</filtering>
                <includes>
                    <include>*.xml</include>
                </includes>
            </resource>
        </resources>              
     </configuration>
</execution>

Autres exemples avec maven-resources-plugin: Inclusion et exclusion de fichiers et de répertoires

Si vous n'utilisez pas maven-resources-plugin, voir: https://stackoverflow.com/a/12446666/2473158

2
Marco S.

j'avais un problème similaire pour mon application print-boot mybatis . Le problème était que mybatis ne pouvait pas trouver le fichier de configuration. Après avoir ajouté 

mybatis.config-location=classpath:mybatis-config.xml

dans le fichier application.properties, le problème a été résolu. On dirait que le problème est toujours lié aux fichiers de configuration/fichiers de mappeur et aux noms des instructions.

2
rak22

très probablement le nom de la méthode Java et le nom du bloc XML ne correspondent pas 

e.g mapper.getUser()  

 <select id="getUsee" resultMap="student">
    ...........
 <>

getUser évidemment différent de getUsee 

2
Junchen Liu

Dans mon cas, il s'agissait d'une erreur de frappe dans l'id de l'instruction mapper xml, par exemple.

<select id="getDtaa" resultType="Data">

List<T> getData()

Après avoir changé l'identifiant dans le XML en le nom de fonction correct, cela a fonctionné.

1
Stefan Michev

dans la configuration printanière, en prenant l'exemple XML, assurez-vous que les fichiers mapper.xml sont situés à l'emplacement attribué comme valeur de la propriété nommée mapperLocations. Une fois, je l'ai eu chez mappers/anotherfolder/*. Xml. Et cela cause la douleur.

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="typeAliasesPackage" value="somepackage.model"/>
    <property name="mapperLocations" value="classpath*:mappers/*.xml"/>
</bean>
1
Tiina

À l'exception de @Dariusz mentionné ci-dessus, j'ai également oublié d'ajouter l'emplacement du mappeur.

<property name="mapperLocations" value="classpath:mybatis/mappers/*.xml"/>
1
Hailin Tan

Renommez mapper/drugmasterDao.xml en mappeur/DrugMasterDao.xml, le nom doit correspondre au nom du fichier * Dao.Java, sinon il y aura une erreur.

1
Palla

Dans mon cas, j'avais plusieurs DataSource et devais définir les emplacements du mappler pour chaque SessionFactory.

SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(mysqlDataSource);
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
sessionFactory.setMapperLocations(resolver.getResources("classpath:mappers/**/*Mapper.xml"));
0
Ayano

J'ai également rencontré ce problème dans mon développement. En général, si vous utilisez des fichiers de configuration XML pour spring, myBatis, etc., ce problème est principalement dû à une erreur dans vos fichiers de configuration XML. 

La réponse la plus votée de Dariusz a montré que le fichier de configuration XML de myBatis présentait peut-être des problèmes, alors que dans mon cas, j’ai constaté que des problèmes liés au fichier de configuration XML de spring pouvaient également entraîner ce problème. 

Dans le cas de cet article, dans le fichier applicationContext.xml (qui devrait être un fichier de configuration de Spring), nous pouvons voir une configuration de basePackage pour le MapperScannerConfigurer:

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="org.mydomain.formulary.mappers" /> </bean>

par conséquent, si la valeur de cette propriété est incorrecte (le nom du package n'est pas correct), cela entraînera également ce problème.

0
ZhaoGang

Vérifiez s'il y a une méthode de surcharge dans le mappeur. Essayez d'utiliser un nom distinct à la place.

0
hailinzeng

Les attributs définis par DrugMasters doivent être associés aux drug_id, drug_name, drug_alert_date, drug_alert_source, rownum.

0
wentao_tang

Dans mon cas, en utilisant une requête dans une annotation, je n’ai pas accordé suffisamment de crédit au fait que le XML de l’annotation est interprété comme XML.

Donc si vous avez

@Select("select * from table where id <> 'blabla'")

Le <> est en train de bousiller le XML. Vous devez le mettre dans une section CDATA

@Select("select * from table where id <![CDATA[ <> ]]> 'blabla'")
0
reallynice

2 points à couvrir

  1. Vérifiez si le nom de la méthode est identique dans les méthodes XML et Java.
  2. Mapper:scan couvre le paquet requis. Si vous utilisez une annotation, alors @MapperScan(com.xxx) doit figurer dans le chemin défini.
0
Deepak