SpringBoot 통합 MybatisPlus 모듈 관리 에 부 딪 힌 bug 해결

머리말
이 Bug 는 이틀 을 꼬박 꼬박 뒤 져 서 야 답 을 찾 았 습 니 다.비록 완전히 이틀 의 근무 시간 에 이 문 제 를 디 버 깅 하 는 것 은 아니 지만 과정 도 확실히 우여곡절 이 있 기 때문에 기록 을 한 번 해 보 는 것 도 자기 반성 이 라 고 생각 합 니 다.
배경
SpringBoot 와 MyBatis-Plus 의 pom 의존

<!-- SpringBoot    -->
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.9.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>
<!-- MyBatis-plus    -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.1.0</version>
</dependency>
프로젝트 모듈 구조
1-项目结构
스프링 부 트 가 다른 프레임 워 크 를 통합 해 작은 프로젝트 를 하 는 데 머 물 렀 기 때문에 코드 를 한 프로젝트 에 두 었 고 모듈 관리 도 하지 않 았 다.
회사 에서 신제품 을 개발 하려 고 하기 때문에 저 는 SpringBoot 프로젝트 에서 모듈 별 개발(Maven 공정)을 시도 하고 MyBatis-Plus 로 지구 층 프레임 워 크 를 만 들 고 싶 습 니 다.즉,SpringBoot 를 웹 모듈 로 만 들 고 실체 와 Mapper 를 persistence 모듈 로 나 누 어 mapper.xml 파일 을 persistence 모듈 의 resources/mapper 디 렉 터 리 에 두 고 싶 습 니 다.
프로젝트 모듈 이 완 료 된 후에 코드 이식 을 할 때 문제 가 발견 되 지 않 았 습 니 다.이 때 는 사용자 정의 mapper.xml 의 sql 조회 데이터 베 이 스 를 호출 할 필요 가 없 기 때 문 입 니 다.그러나 코드 를 보완 하면 서 mapper.xml 의 sql 조회 도 필요 합 니 다.이때 디 버 깅 할 때 다음 과 같은 오 류 를 발 견 했 습 니 다.

즉,대응 하 는 sql 을 찾 을 수 없습니다.
원인 을 조사 하 다
mapper.xml 쓰기 오류 제거
먼저 mapper.xml 에서 namespace 나 sql 의 id 오 류 를 제거 합 니 다.제 개발 도구 가 MybatisX 플러그 인 을 다운로드 하 였 기 때문에 mapper.java 와 mapper.xml 에는 플러그 인의 작은 아이콘 이 있 습 니 다.아래 그림 과 같 습 니 다.
mapper.java有Mybats的插件小图标 mapper.xml有Mybats的插件小图标
의심:모듈 로 인해
그 다음으로 이전에 저 는 SpringBoot 와 MyBatis-Plus 단일 프로젝트 의 공 사 를 통합 한 적 이 있 습 니 다.이런 문제 가 없 었 습 니 다.그래서 저 는 모듈 로 인해 발생 한 원인 이 라 고 의심 합 니 다.그래서 모듈 을 나 누 지 않 는 공사 와 차이 가 있다 고 생각 합 니 다.
모듈 mapper.xml 파일 은 프로젝트 classes 아래 mapper 에 있 고 모듈 을 나 눈 후 mapper.xml 파일 은 persistence 모듈 에서 나 온 jar 에 있 습 니 다.
오류 사고방식:pom 파일 설정 리 소스 디 렉 터 리 수정
그래서 이 점 을 발견 한 후에 반드시 해결 방안 을 해결 해 야 합 니 다.그러나 처음에 제 생각 은 틀 렸 습 니 다.프로젝트 를 포장 한 후에 persistence 모듈 의 resources 아래 의 mapper 디 렉 터 리 를 jar 에 포장 하지 않 았 다 고 생각 합 니 다.시간 을 낭비 한 후에 야 나 는 persistence 모듈 에서 나 온 jar 에 가서 resources 아래 의 mapper/mapper.xml 를 포장 하 였 는 지 확인 해 야 한다 고 생각 했다.
确认persistence模块打出的jar中有没有mapper目录
의심:Spring Resource 시 jar 의 mapper.xml 를 불 러 오지 않 았 습 니 다.
위의 문 제 는 자신 에 게 한 과목 을 가 르 쳤 고 눈 으로 본 것 이 사실 입 니 다.Bug 를 해결 하 는 과정 에서 합 리 적 인 추측 이 필요 하지만 유한 한 결과 에 집중 하여 잘못된 방향 을 제거 하 는 것 을 검증 하 는 것 이 더욱 중요 합 니 다.마치 누군가가 나 에 게'왜 내 가 운행 하 는 지 항상 이런 오 류 를 찾 지 못 하 는 지'라 고 물 어 보 는 것 처럼 나 는 네가 tomcat 의 발표 경로 에 가서 jar 가방 이 보 내지 못 하 는 지 보 는 것 은 사실 일리 가 있다 고 말 했다.
질문 으로 돌아 갑 니 다.왜 Spring Resource 에 jar 의 mapper.xml 를 불 러 오지 않 았 습 니까?해결 방안 을 찾 아야 합 니 다.반드시 대응 하 는 과정 에서 저 는 Spring 의 Resource 로드 파일,classpath 와 classpath*의 차이 점 을 생각 했 습 니 다.오랫동안 직접 프로젝트 를 작성 하지 않 았 는데 이것 을 잊 어 버 렸 습 니 다.
springboot的yml的mybatisplus配置
그래서 이때 저 는 application.xml 에서 my batis-plus.mapper-locations 의 값 을 classpath*:mapper/*Mapper.xml 로 바 꾸 면 됩 니 다.다음 과 같 습 니 다.

#mapper plus
mybatis-plus:
  mapper-locations: classpath*:mapper/*Mapper.xml
의심:SpringBoot 와 MyBatis-Plus 가 통 합 된 설정 이 어디 가 잘못 되 었 습 니까?
위의 설정 을 수정 한 후에 다시 실행 합 니까?아니면 같은 오 류 를 보고 합 니까?!!

What The Fuck!!!이 bug 는 classpath:mapper/*Mapper.xml Spring 의 Resource 가 현재 응용 중인 classpath 의 mapper 디 렉 터 리 의 mapper.xml 파일 만 스 캔 할 수 있 기 때문에 저 는 SpringBoot 와 Mybati-plus 의 통합 설정 에 다시 응 해 야 합 니 다.결국 이 프레임 워 크 에 대해 잘 모 르 고 많은 시행 착 오 를 겪 었 습 니 다.그리고 문제 가 생 겼 을 때...자신의 판단 을 굳 게 믿 지 않 고 끊 임 없 는 시도 가 반드시 나 와 야 할 결 과 는 이 문제 에 시간 을 낭비 하 게 만 들 었 다.
마지막 으로 한 바퀴 돌 았 지만 해결 방안 을 찾 지 못 했 습 니 다.그리고 이와 관련 된 문제 도 많 지 않 습 니 다.저 는 막막 하고 조급해 지기 시 작 했 습 니 다.이렇게 많은 시간 을 낭 비 했 기 때문에 저 는 먼저 제 가 믿 는 것-Spring 의 Resource 로드 파일,classpath 와 classpath*의 차 이 를 검증 하기 로 했 습 니 다.그래서...sqlSession Factory 를 만 들 기로 했 습 니 다.코드 는 다음 과 같 습 니 다.

@Bean("sqlSessionFactory")
public SqlSessionFactory sqlSessionFactory() throws Exception {
    MybatisSqlSessionFactoryBean sqlSessionFactory = new MybatisSqlSessionFactoryBean();
    sqlSessionFactory.setDataSource(datasource);
    ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
    Resource[] resources = resolver.getResources("classpath*:mapper/*Mapper.xml");
    sqlSessionFactory.setMapperLocations(resources);
    MybatisConfiguration configuration = new MybatisConfiguration();
    configuration.setJdbcTypeForNull(JdbcType.NULL);
    configuration.setMapUnderscoreToCamelCase(true);
    configuration.setCacheEnabled(false);
    sqlSessionFactory.setConfiguration(configuration);
    //      
    sqlSessionFactory.setPlugins(new Interceptor[]{
        paginationInterceptor()
    });
    return sqlSessionFactory.getObject();
}
결국 운행 이 통 과 됐 습 니 다!!그러나 이것 도 당연 하 다.이것 은 내 가 application.xml 에서 my batis-plus 의 설정 이 효력 이 발생 하지 않 았 다 는 것 을 설명 하고 다시 이전 문제 로 돌아 간 것 과 같다.여기까지 와 서 야 나 는 my batis-plus-boot-starter 안의 소스 코드 를 보 러 갈 생각 을 했다!!
생각 지도 못 한 것 은 소스 코드 가 상당히 쉽게 볼 수 있 습 니 다.우선 jar 패키지 의 디 렉 터 리 구 조 는 다음 과 같 습 니 다.이름 을 보고 MybatisPlus AutoConfiguration 이라는 설정 류 를 직접 선택 하 십시오.
mybatis-plus-boot-starter的源码结构
MybatisPlus AutoConfiguration 의 원본 코드 를 열 고 SqlSession Factory 의 생 성 을 직접 보십시오.다음 과 같 습 니 다.mapper-locations 를 설정 한 판단 에서 정지점 을 두 고 디 버 깅 을 진행 합 니 다.
MybatisPlusAutoConfiguration的部分源码
또한 앞에서 사용자 정의 로 만 든 SqlSession Factory 의 코드 주석 을 지 웁 니 다.application.yml 에 mapper-locations:classpath*:mapper/*Mapper.xml 를 설정 하여 다시 실행 하고 소스 디 버 깅 을 진행 하 였 습 니 다.위의 그림 정지점 의 논 리 를 발견 하고 if 의 판단 에 들 어가 지 않 았 습 니 다.디 버 깅 한 MybatisPlus Properties 대상 결 과 는 다음 과 같 습 니 다.
MybatisPlusProperties中mapper-locations的值
!!!What The Fuck!!!내 가 설정 한 것 은 분명히 classpath*:mapper/*Mapper.xml 인 데 어떻게 classpath:mapper/*Mapper.xml 이 되 었 습 니까?
의심:yml 의 설정 문법 은 classpath*:mapper/*Mapper.xml 에 문제 가 있 습 니 다.
나 는 모두 나 자신 에 게 복종 했다.그러나 이번 수정 으로 나 는 마지막 답 을 찾 았 다.원래 의 설정 과 쓰기 방법 을 배열 로 바 꾸 었 다.쓰기 방법 은 다음 과 같다.

#mapper plus
mybatis-plus:
  mapper-locations: [classpath*:mapper/*Mapper.xml]
이러한 설정 형식 에 대해 서도 깊이 연구 하지 않 았 기 때문에 이전 에는 1 대 1 의 설정 항목 이 었 고 배열 의 작성 방법 을 시도 하지 않 았 기 때문에 올 라 와 서 보고 가 잘못 되 었 으 나 application.yml 의 문법 형식 이 잘못 되 었 습 니 다.그래서 값 에 따 옴 표를 붙 여 묶 으 면

#mapper plus
mybatis-plus:
  mapper-locations: ["classpath*:mapper/*Mapper.xml"]
다시 운행 하 다 보 니 통과!!!원본 디 버 깅 의 mapperLocations 값 도 classpath*:mapper/*Mapper.xml 입 니 다.이때 저 는 문제 의 소 재 를 찾 은 줄 알 았 습 니 다.바로 yml 의 설정 문법 이 classpath*:mapper/*Mapper.xml 에 대해 문제 가 있다 고 믿 습 니 다.
결론:개발 도구 가 동기 화 설정 되 지 않 았 습 니 다.
이 노트 를 쓰기 전에 문 제 는 yml 의 문법 이 값 에 대해 가짜 로 해석 할 때 값 을 따옴표 로 싸 야 한 다 는 것 이 라 고 믿 습 니 다.그러나 필 기 를 써 서 기록 하 는 과정 에서 장면 을 복원 해 야 한다.디 버 깅 을 할 때 짝 퉁 이 있 는 값 에 따옴표 로 싸 야 한 다 는 말 을 하지 않 았 다.그 제야 나 는 개발 도구 의 문제 가 아 닌 지 생각 났 다.실행 할 때 수 정 된 배치 파일 을 동기 화하 지 않 았 다.여러 차례 의 테스트 를 통 해 이 점 을 증명 했다.어떤 때 는 프로젝트 를 너무 오래 뛰 면 개발 도구 가 갑자기 어려움 을 겪 는 다.
한참 동안 했 는데 application.yml 설정 classpath*:mapper/*Mapper.xml 가 유효 합 니 다!!유효 하 다유효 하 다개발 도구 의 방해 에 해당 하여 저 는 이틀 의 시간 을 헛되이 낭비 하 게 되 었 습 니 다.그러나 그 동안 에 도 자신의 문 제 를 발 견 했 습 니 다.너무 오랫동안 잘못 을 만 나 지 않 고 검색엔진 을 믿 고 생각 하지 않 았 습 니 다.마지막 에 잘못된 인식 으로 원래 의 정확 한 것 을 부정 할 뻔 했 습 니 다.

#mapper plus
mybatis-plus:
  mapper-locations: classpath*:mapper/*Mapper.xml
application.yml 설정 이 수정 되 지 않 은 것 을 발견 한 첫 번 째 시간 에 발표 경로 의 파일 을 검사 하거나 원본 코드 를 디 버 깅 해 야 합 니 다.중간 에 너무 많은 시간 을 낭비 하고 맹목적 인 필 답 에 빠 지면 필 기 를 해서 자신 을 반성 해 야 한다.안정 되면 퇴보 하고 꾸준히 공부 하 며 생각 을 포기 하지 말 아야 한다.
이상 은 개인 적 인 경험 이 므 로 여러분 에 게 참고 가 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.

좋은 웹페이지 즐겨찾기