[SPRING] mybatis 봄 mvc 응용 프로그램 가져 오기, 잘못된 바인딩 된 문 (찾을 수 없습니다)
SPRINGmybatis 봄 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 < #{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.내 오류를 찾을 때 나는이 대답을 봤어. 실제로 OP의 문제와 관련이 없지만 예외는 동일하며이 질문은 Google에서 매우 잘 보입니다.
내 오류를 찾을 때 나는이 대답을 봤어. 실제로 OP의 문제와 관련이 없지만 예외는 동일하며이 질문은 Google에서 매우 잘 보입니다.
제 경우에는 매퍼 네임 스페이스를 변경하는 것을 잊었습니다.
<mapper namespace="pl.my.package.MyNewMapper">
그 결과 같은 문제가 발생했습니다.
-
==============================
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.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.나는 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.내 봄 부팅 mybatis 응용 프로그램에 대한 비슷한 문제가 있었다. 문제는 mybatis가 구성 파일을 찾을 수 없다는 것입니다. 추가 후
내 봄 부팅 mybatis 응용 프로그램에 대한 비슷한 문제가 있었다. 문제는 mybatis가 구성 파일을 찾을 수 없다는 것입니다. 추가 후
mybatis.config-location=classpath:mybatis-config.xml
application.properties 파일에서 문제가 해결되었습니다. 문제는 항상 구성 파일 / 매퍼 파일과 명령문 이름 주위에있는 것 같습니다.
-
==============================
6.대부분 java 메소드 이름과 XML 블록의 이름이 일치하지 않습니다.
대부분 java 메소드 이름과 XML 블록의 이름이 일치하지 않습니다.
e.g mapper.getUser() <select id="getUsee" resultMap="student"> ........... <>
getUsee와 분명히 다른 getUser
-
==============================
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.내 경우에는 그것은 매퍼 XML 문을의 ID에 오타가 잘못되었습니다.
내 경우에는 그것은 매퍼 XML 문을의 ID에 오타가 잘못되었습니다.
<select id="getDtaa" resultType="Data"> List<T> getData()
XML의 id를 올바른 함수 이름으로 변경 한 후에도 제대로 작동했습니다.
-
==============================
9.mapper / drugmasterDao.xml의 이름을 mapper / DrugMasterDao.xml로 변경하면 이름이 * Dao.java 파일 이름과 일치해야합니다. 그렇지 않으면 오류가 발생합니다. 또는 우리는 Ibatismapping.xml을 명시 적으로 생성하고 거기에 매퍼 구성을 추가해야합니다.
mapper / drugmasterDao.xml의 이름을 mapper / DrugMasterDao.xml로 변경하면 이름이 * Dao.java 파일 이름과 일치해야합니다. 그렇지 않으면 오류가 발생합니다. 또는 우리는 Ibatismapping.xml을 명시 적으로 생성하고 거기에 매퍼 구성을 추가해야합니다.
-
==============================
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.매퍼에 오버로드 방법이 있는지 확인하십시오. 대신 별도의 이름을 사용하십시오.
매퍼에 오버로드 방법이 있는지 확인하십시오. 대신 별도의 이름을 사용하십시오.
-
==============================
12.나는 또한이 문제가 내 개발에 발생했습니다. generall에서 spring, myBatis 등을 위해 xml 구성 파일을 사용한다면이 문제는 대부분 XML 구성 파일의 실수로 발생합니다.
나는 또한이 문제가 내 개발에 발생했습니다. generall에서 spring, myBatis 등을 위해 xml 구성 파일을 사용한다면이 문제는 대부분 XML 구성 파일의 실수로 발생합니다.
Dariusz가 가장 많이 쓴 대답은 myBatis xml 구성 파일에 몇 가지 문제가 있음을 보여 주었고, 제 경우에는 spring xml 구성 파일의 문제로 인해이 문제가 발생할 수 있음을 발견했습니다.
이 게시물의 상황에서 applicationContext.xml (Spring의 구성 파일이어야 함)에서 MapperScannerConfigurer에 대한 basePackage 구성을 볼 수 있습니다.
bean> 따라서이 속성의 값이 잘못되면 (패키지 이름이 올바르지 않은 경우)이 문제가 발생합니다.
-
==============================
13.2 커버해야 할 점
2 커버해야 할 점
-
==============================
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.위에서 언급 한 @Dariusz를 제외하고, 매퍼 위치를 추가하는 것을 잊어 버렸습니다.
위에서 언급 한 @Dariusz를 제외하고, 매퍼 위치를 추가하는 것을 잊어 버렸습니다.
<property name="mapperLocations" value="classpath:mybatis/mappers/*.xml"/>
-
==============================
16.제 경우에는 주석의 쿼리를 사용하여 주석의 XML이 XML로 해석된다는 사실을 충분히 설명하지 못했습니다.
제 경우에는 주석의 쿼리를 사용하여 주석의 XML이 XML로 해석된다는 사실을 충분히 설명하지 못했습니다.
그래서 네가 가진다면
@Select("select * from table where id <> 'blabla'")
<>는 XML을 엉망으로 만든다. CDATA 섹션에 넣어야합니다.
@Select("select * from table where id <![CDATA[ <> ]]> 'blabla'")
from https://stackoverflow.com/questions/20427210/mybatis-spring-mvc-application-getting-invalid-bound-statement-not-found by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 봄 IDREF 사용법 (0) | 2019.01.22 |
---|---|
[SPRING] Spring에서 @ComponentScan으로 모든 bean을 느리게로드하는 방법? (0) | 2019.01.22 |
[SPRING] 응답을 추출 할 수 없습니다 : 응답 유형에 적합한 HttpMessageConverter가 없습니다. (0) | 2019.01.22 |
[SPRING] 스프링 빈 파괴 메소드, 싱글 톤 및 프로토 타입 스코프 (0) | 2019.01.22 |
[SPRING] JPA와 Spring을 사용하여 목록에서 필드가있는 고유 한 행을 찾는 방법? (0) | 2019.01.22 |