web-dev-qa-db-ja.com

mybatis spring mvcアプリケーション、無効なバウンドステートメントの取得(見つかりません)

これは、spring 3.2.4、mybatis-spring-1.2.1を使用した私の最初のmybatis spring mvcアプリケーションです。

Webサービスを呼び出そうとすると、次のエラーが表示されます。

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

明らかな何かを見逃しているに違いない。助けてくれてありがとう

関連ファイルは次のとおりです。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>

マッパーファイル-> /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>

マッパーファイル-> /classes/org/mydomain/formulary/drugmaster/dao/DrugMasterDao.Java

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

コントローラーファイル-> /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*/;

}
}    

サービスファイル-> /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

17
randy

エラーを探しているときにこの回答をグーグルで検索しました。それは実際にはOPの問題とは無関係ですが、例外は同じであり、この質問はグーグルで非常に目に見えます。

私の場合、マッパーの名前空間を変更するのを忘れました

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

同じ問題が発生しました。

24
Dariusz

このページの設定を読んだ後、私は同じ問題を抱えていました。 https://mybatis.github.io/spring/mappers.html#scan

設定が正しいことがわかりました。アプリケーションをデバッグします。私の* mappers.xmlファイルがパスにないことがわかりました。期待する必要があります。

Mavenプロジェクトの同じフォルダーsrc "Java"にXMLファイルがありました。そのため、アプリケーションをビルドするときに、ファイルはクラスフォルダーにコピーされませんでした。そのため、xmlファイルをフォルダー「resources」に移動する必要があります。そして問題を修正します。

5
Giovanni Perea

Xmlがmybatisに読み込まれないため、MapperScannerConfigurer xmlではなく、スキャンインターフェイスのみ。 2つの方法があります:

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

または

<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>
4
Zheng Xiaodong

Giovanni Pereaの解 (ありがとう)のバリアントで同じ問題を解決しました。 .Javaマッパーファイルと同じフォルダーに.xmlマッパーファイルがあり、maven-resources-pluginでmavenを使用しています。

私のソリューションでは、すべての.xmlマッパーファイルを正しい場所(.classマッパーファイルの同じフォルダー)にコピーするための実行をmaven-resources-pluginに追加しました。

<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>

Maven-resources-pluginのその他の例: ファイルとディレクトリを含めたり除外したり

Maven-resources-pluginを使用しない場合は、以下を参照してください: https://stackoverflow.com/a/12446666/2473158

2
Marco S.

私は私の春ブートmybatisアプリケーションでも同様の問題を抱えていました。問題は、mybatisが構成ファイルを見つけられなかったことです。追加後

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

application.propertiesファイルで、問題が解決しました。問題は常に構成ファイル/マッパーファイルとステートメント名にあるようです。

2
rak22

ほとんどの場合、Javaメソッド名とXMLブロックの名前の不一致

e.g mapper.getUser()  

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

getUseeとは明らかに異なるgetUser

2
Junchen Liu

上記の@Dariuszを除き、マッパーの場所を追加することも忘れました。

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

私の場合、それはマッパーxmlステートメントのidのタイプミスでした。

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

List<T> getData()

XMLのIDを正しい関数名に変更すると、機能しました。

1
Stefan Michev

spring構成では、たとえばxmlの方法を使用して、mapper.xmlファイルがmapperLocationsという名前のプロパティの値として割り当てられた場所にあることを確認してください。 mappers/anotherfolder/*。xmlで入手できました。そして、それは痛みを引き起こします。

<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

Mapper/drugmasterDao.xmlの名前をmapper/DrugMasterDao.xmlに変更します。名前は* Dao.Javaファイル名と一致する必要があります。一致しない場合はエラーがスローされるか、Ibatismapping.xmlを明示的に作成してそこにマッパー構成を追加する必要があります

1
Palla

私の場合、複数のDataSourceがあり、それぞれのSessionFactoryにmapplerの場所を設定する必要があります。

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

また、開発中にこの問題に遭遇しました。一般に、spring、myBatisなどにxml構成ファイルを使用している場合、この問題は主にxml構成ファイルの間違いが原因です。

Dariuszによる最も投票された答えは、myBatis xml構成ファイルにいくつかの問題があるかもしれないことを示しましたが、私の場合、spring xml構成ファイルの問題もこの問題を引き起こす可能性があることがわかりました。

この投稿の状況で​​は、applicationContext.xml(Springの構成ファイルである必要があります)で、MapperScannerConfigurerのbasePackage構成を確認できます。

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

このプロパティの値が間違っている(パッケージ名が正しくない)場合、この問題も発生します。

0
ZhaoGang

マッパーにオーバーロードメソッドがあるかどうかを確認します。代わりに別の名前を使用してみてください。

0
hailinzeng

DrugMasters属性の定義は、drug_id、drug_name、drug_alert_date、drug_alert_source、rownumに関連付ける必要があります。

0
wentao_tang

私の場合、注釈でクエリを使用して、注釈内のXMLがXMLとして解釈されるという事実を十分に評価しませんでした。

あなたが持っているなら

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

<>はXMLを台無しにしています。 CDATAセクションに配置する必要があります

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

カバーする2つのポイント

  1. メソッド名がXMLメソッドとJavaメソッドの両方で同じかどうかを確認します。
  2. _Mapper:scan_は必要なパッケージをカバーします。注釈を使用している場合、@MapperScan(com.xxx)は定義されたパスになければなりません。
0
Deepak