복붙노트

[SPRING] mybatis 봄 mvc 응용 프로그램 가져 오기, 잘못된 바인딩 된 문 (찾을 수 없습니다)

SPRING

mybatis 봄 mvc 응용 프로그램 가져 오기, 잘못된 바인딩 된 문 (찾을 수 없습니다)

이것은 봄 3.2.4, Mybatis - 봄 - 1.2.1을 사용하여 내 첫 mybatis 봄 mvc 응용 프로그램입니다

내 webservice 호출하려고 할 때 오류가 ::

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>

해결법

  1. ==============================

    1.내 오류를 찾을 때 나는이 대답을 봤어. 실제로 OP의 문제와 관련이 없지만 예외는 동일하며이 질문은 Google에서 매우 잘 보입니다.

    내 오류를 찾을 때 나는이 대답을 봤어. 실제로 OP의 문제와 관련이 없지만 예외는 동일하며이 질문은 Google에서 매우 잘 보입니다.

    제 경우에는 매퍼 네임 스페이스를 변경하는 것을 잊었습니다.

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

    그 결과 같은 문제가 발생했습니다.

  2. ==============================

    2.이 페이지에서 구성을 읽은 후에도 동일한 문제가 발생했습니다. https://mybatis.github.io/spring/mappers.html#scan

    이 페이지에서 구성을 읽은 후에도 동일한 문제가 발생했습니다. https://mybatis.github.io/spring/mappers.html#scan

    나는 나의 구성이 옳았다는 것을 알았다. 그래서 내 응용 프로그램을 디버깅. 내 * mappers.xml 파일이 경로에없는 것을 발견했습니다. 기대하는 것이 틀림 없다.

    내 메이븐 프로젝트의 같은 폴더 src "java"에 XML 파일이 있습니다. 그래서 내 응용 프로그램을 빌드 할 때 파일이 클래스 폴더에 복사되지 않았습니다. 그래서 xml 파일을 "resources"폴더로 옮겨야합니다. 그리고 문제를 해결하십시오.

  3. ==============================

    3.xml이 mybatis에로드되지 않기 때문에 MapperScannerConfigurer는 xml이 아니라 인터페이스 만 검사합니다. 두 가지 방법이 있습니다.

    xml이 mybatis에로드되지 않기 때문에 MapperScannerConfigurer는 xml이 아니라 인터페이스 만 검사합니다. 두 가지 방법이 있습니다.

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

    4.나는 Giovanni Perea 솔루션 변종과 동일한 문제를 해결했습니다 (감사합니다). .java 매퍼 파일이있는 동일한 폴더에 .xml 매퍼 파일이 있고 maven-resources-plugin과 함께 maven을 사용하고 있습니다.

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

  5. ==============================

    5.내 봄 부팅 mybatis 응용 프로그램에 대한 비슷한 문제가 있었다. 문제는 mybatis가 구성 파일을 찾을 수 없다는 것입니다. 추가 후

    내 봄 부팅 mybatis 응용 프로그램에 대한 비슷한 문제가 있었다. 문제는 mybatis가 구성 파일을 찾을 수 없다는 것입니다. 추가 후

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

    application.properties 파일에서 문제가 해결되었습니다. 문제는 항상 구성 파일 / 매퍼 파일과 명령문 이름 주위에있는 것 같습니다.

  6. ==============================

    6.대부분 java 메소드 이름과 XML 블록의 이름이 일치하지 않습니다.

    대부분 java 메소드 이름과 XML 블록의 이름이 일치하지 않습니다.

    e.g mapper.getUser()  
    
     <select id="getUsee" resultMap="student">
        ...........
     <>
    

    getUsee와 분명히 다른 getUser

  7. ==============================

    7.예를 들어 스프링 구성에서 mapper.xml 파일이 mapperLocations라는 속성 값으로 할당 된 위치에 있는지 확인하십시오. 일단 mappers / anotherfolder / *. 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>
    
  8. ==============================

    8.내 경우에는 그것은 매퍼 XML 문을의 ID에 오타가 잘못되었습니다.

    내 경우에는 그것은 매퍼 XML 문을의 ID에 오타가 잘못되었습니다.

    <select id="getDtaa" resultType="Data">
    
    List<T> getData()
    

    XML의 id를 올바른 함수 이름으로 변경 한 후에도 제대로 작동했습니다.

  9. ==============================

    9.mapper / drugmasterDao.xml의 이름을 mapper / DrugMasterDao.xml로 변경하면 이름이 * Dao.java 파일 이름과 일치해야합니다. 그렇지 않으면 오류가 발생합니다. 또는 우리는 Ibatismapping.xml을 명시 적으로 생성하고 거기에 매퍼 구성을 추가해야합니다.

    mapper / drugmasterDao.xml의 이름을 mapper / DrugMasterDao.xml로 변경하면 이름이 * Dao.java 파일 이름과 일치해야합니다. 그렇지 않으면 오류가 발생합니다. 또는 우리는 Ibatismapping.xml을 명시 적으로 생성하고 거기에 매퍼 구성을 추가해야합니다.

  10. ==============================

    10.DrugMasters 속성 정의는 drug_id, drug_name, drug_alert_date, drug_alert_source, rownum과 연결되어야합니다.

    DrugMasters 속성 정의는 drug_id, drug_name, drug_alert_date, drug_alert_source, rownum과 연결되어야합니다.

  11. ==============================

    11.매퍼에 오버로드 방법이 있는지 확인하십시오. 대신 별도의 이름을 사용하십시오.

    매퍼에 오버로드 방법이 있는지 확인하십시오. 대신 별도의 이름을 사용하십시오.

  12. ==============================

    12.나는 또한이 문제가 내 개발에 발생했습니다. generall에서 spring, myBatis 등을 위해 xml 구성 파일을 사용한다면이 문제는 대부분 XML 구성 파일의 실수로 발생합니다.

    나는 또한이 문제가 내 개발에 발생했습니다. generall에서 spring, myBatis 등을 위해 xml 구성 파일을 사용한다면이 문제는 대부분 XML 구성 파일의 실수로 발생합니다.

    Dariusz가 가장 많이 쓴 대답은 myBatis xml 구성 파일에 몇 가지 문제가 있음을 보여 주었고, 제 경우에는 spring xml 구성 파일의 문제로 인해이 문제가 발생할 수 있음을 발견했습니다.

    이 게시물의 상황에서 applicationContext.xml (Spring의 구성 파일이어야 함)에서 MapperScannerConfigurer에 대한 basePackage 구성을 볼 수 있습니다.

        

    따라서이 속성의 값이 잘못되면 (패키지 이름이 올바르지 않은 경우)이 문제가 발생합니다.

  13. ==============================

    13.2 커버해야 할 점

    2 커버해야 할 점

  14. ==============================

    14.필자의 경우에는 여러 개의 DataSource가 있었으며 각 SessionFactory에 대해 mappler 위치를 설정해야합니다.

    필자의 경우에는 여러 개의 DataSource가 있었으며 각 SessionFactory에 대해 mappler 위치를 설정해야합니다.

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

    15.위에서 언급 한 @Dariusz를 제외하고, 매퍼 위치를 추가하는 것을 잊어 버렸습니다.

    위에서 언급 한 @Dariusz를 제외하고, 매퍼 위치를 추가하는 것을 잊어 버렸습니다.

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

    16.제 경우에는 주석의 쿼리를 사용하여 주석의 XML이 XML로 해석된다는 사실을 충분히 설명하지 못했습니다.

    제 경우에는 주석의 쿼리를 사용하여 주석의 XML이 XML로 해석된다는 사실을 충분히 설명하지 못했습니다.

    그래서 네가 가진다면

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

    <>는 XML을 엉망으로 만든다. CDATA 섹션에 넣어야합니다.

    @Select("select * from table where id <![CDATA[ <> ]]> 'blabla'")
    
  17. from https://stackoverflow.com/questions/20427210/mybatis-spring-mvc-application-getting-invalid-bound-statement-not-found by cc-by-sa and MIT license