이번에 만난 오류는..

웹페이지로 test를 해보려 Swagger 접속주소(http://localhost:[사용포트번호]/swagger-ui.html)에 접근했는데 

코드에도 문제가 없고, 심지어 콘솔에서도 오류가 없는데 안열리는 경우였다.

 

 

그럴 때는 코드 상의 오류가 아니라 설정 파일이 잘못 되었다는 것인데 

swagger를 사용하기 위해서는 

1. pom.xml에 의존성을 추가해야 한다.

	<!-- Swagger2 -->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.9.2</version>
        </dependency>

        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.9.2</version>
        </dependency>

 

2. SwaggerConfiguration 파일을 만들어주어야 한다.

SwaggerConfiguration

package com.springboot.valid_exception.config.annotation;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

/** Swagger 환경 설정 **/

@Configuration // 환경(설정)에 관한 일을 함
@EnableSwagger2 // swagger를 활성화 시키겠습니다(enable)
public class SwaggerConfiguration {
    @Bean
    public Docket api() {

        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.springboot.valid_exception")) 
                // 어디부터 어디까지 component-scan 역할
                .paths(PathSelectors.any())
                .build();
    }

    /** ui에 뿌려주는 부분 **/
    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("Spring Boot Open API Test with Swagger")
                .description("설명")
                .version("1.0.0")
                .build();
    }
}

 

그리고 특히나 여기 주의할 점은

Config파일 특성한 이전 프로젝트나 따로 정리해둔 코드를 그대로 사용하는 경우가 많은데

basePackage에서 설정한 패키지를 test하는 데 사용하므로 현재 사용 중인 프로젝트로 설정되어 있는지 꼭 확인하자!

 

필자는 이 부분이 문제였다..ㅎ

문제의 오류 메세지

 

해결 방법

괄호 개수 확인해보세요 

{}} []] ()) 이런 식으로 되어있을 가능성 매우 다분함

콘솔 창의 오류 메세지를 살펴 보자.. 

Request processing failed; 
nested exception is org.mybatis.spring.MyBatisSystemException: 
nested exception is org.apache.ibatis.reflection.ReflectionException: 
There is no getter for property named 'zipnum' in 'class com.team6.sts.vo.MemberVO'

 

 

VO 객체의 멤버 변수에 설정해놓은 변수명과  쿼리문 안의 파라미터 명이 달라서 생긴 오류였다. n N ..ㅎ

콘솔 창을 살펴보자..

심각: 경로 [/sts]의 컨텍스트 내의 서블릿 [appServlet]을(를) 위한 Servlet.service() 호출이, 근본 원인(root cause)과 함께, 예외 [Request processing failed; 
nested exception is org.mybatis.spring.MyBatisSystemException: 
nested exception is org.apache.ibatis.reflection.ReflectionException: 
There is no getter for property named 'id' in 'class java.lang.String']을(를) 발생시켰습니다.

 

결론적으로 xml의 반환 타입과 DAO의 반환 타입이 맞지 않았기 때문이였다....ㅎ

 


 

수정된 코드

왼쪽은 DAO     |    오른쪽은 member.xml

 

 

콘솔 창에 뜬 오류를 살펴보자..

ERROR: org.springframework.web.context.ContextLoader - Context initialization failed
org.springframework.beans.factory.BeanCreationException: 
Error creating bean with name 'sqlSessionFactory' defined in ServletContext resource [/WEB-INF/spring/action-mybatis.xml]: 
Invocation of init method failed; nested exception is org.springframework.core.NestedIOException: Failed to parse mapping resource: 
'file [C:\work_sts.metadata.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\shopTranSpring\WEB-INF\classes\mybatis\mappers\address.xml]'; nested exception is java.lang.RuntimeException: 
Error parsing Mapper XML. Cause: org.apache.ibatis.builder.BuilderException: 
Error resolving class . Cause: org.apache.ibatis.type.TypeException: 
Could not resolve type alias ''.  Cause: java.lang.ClassNotFoundException: 
Cannot find class:

 

오류 메세지를 보면

MyBatis의 매퍼 XML 파일(address.xml)을 파싱하는 도중에 문제가 발생했다고 한다.

 

java.lang.ClassNotFoundException: Cannot find class:를 보면 특정 클래스를 찾지 못했다고 한다.

매퍼 XML 파일 내에서 사용된 type alias가 잘못 지정되었을 가능성이 크다.

address.xml 파일을 확인해보자.

VO 클래스를 불러오는 과정과 반환 타입을 설정하는 부분 오타 실수가 있었다..ㅎ 
가장 많이 내는 오타로 인한 실수 주의하자!

 


수정된 코드

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
      PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
   "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="mapper.address">
	<resultMap id="addResult" type="com.team6.sts.vo.AddressVO">
		<result property="zip_num" column="zip_num" />
		<result property="sido" column="sido" />
		<result property="gugun" column="gugun" />
		<result property="dong" column="dong" />
		<result property="zip_code" column="zip_code" />
		<result property="bunji" column="bunji" />
	</resultMap>
	
	<!-- findZip -->	
 	<select id="selectZip" parameterType="String" resultMap="addResult" > 
			<![CDATA[
				select * from address
				where dong like '%'||#{dong}||'%'
			]]>			
 	</select> 
</mapper>

 

콘솔 창에 뜬 오류를 살펴보자. 

ERROR: org.springframework.web.context.ContextLoader - Context initialization failed
org.springframework.beans.factory.BeanCreationException: 
Error creating bean with name 'sqlSessionFactory' defined in ServletContext resource [/WEB-INF/spring/action-mybatis.xml]: 
Invocation of init method failed; 
nested exception is java.io.FileNotFoundException: class path resource [mybatis/model/parcelConfig.xml] cannot be opened because it does not exist

 


오류 메세지를 보면 

'sqlSessionFactory' 라는 이름의 bean을 생성하는 도중 문제가 발생했다고 한다.

java.io.FileNotFoundException 오류라고 나오는 것을 보니 해당 파일을 찾지 못하는 상황이다.

 

그리고 class path로 지정한 resource 경로인 [mybatis/model/parcelConfig.xml] 가 존재하지 않는다고 나온다.

 

아.. 저건 내가 사용하고 있는 Config.xml 파일이 아니다... 바보.. 

수정해주면 말끔히 해결된다..ㅎ

 

+ Recent posts