IT 성장일기

[Spring] There is no getter for property named 'url' in 'class java.lang.String' 본문

Java/Spring

[Spring] There is no getter for property named 'url' in 'class java.lang.String'

고 양 2025. 3. 11. 13:28
반응형
There is no getter for property named 'url' in 'class java.lang.String'

문제

MyBatis 사용 중 아래와 같은 오류가 발생했습니다.

ReflectionException: There is no getter for property named 'url' in 'class java.lang.String'

원인

이 예외는 MyBatis가 #{url}과 같이 프로퍼티를 처리하는 과정에서 String 타입의 url 변수에 대한 getter를 찾으려 하기 때문에 발생한다고 합니다.

 

MyBatis는 프로퍼티를 매핑하는 표현식을 사용할 때, 해당 프로퍼티가 객체의 필드라고 가정하고 getter 메서드를 찾습니다.
그런데 매개변수로 전달한 url은 단순한 String 타입이고, String 클래스에는 getUrl() 같은 메서드가 없기 때문에 예외가 발생한 것입니다.

String findIdByUrl(String url);
<select id="findIdByUrl" resultType="String">
    SELECT id FROM url_table WHERE url = #{url}
</select>

실패한 방법들

아래 방법들은 구글에서 찾아낸, 신뢰성이 높은 다양한 해결방법이었습니다.

모두 시도해봤고 모두 제 문제를 해결하는데엔 실패했습니다.

#{url} 대신 #{value} 사용하기

<select id="findIdByUrl" resultType="String">
    SELECT id FROM url_table WHERE url = #{value}
</select>

parameterType 지정하기

<select id="findIdByUrl" parameterType="String" resultType="String">
    SELECT id FROM url_table WHERE url = #{value}
</select>

Mapper에서 @Param 어노테이션 사용하기

String findIdByUrl(@Param("url") String url);
<select id="findIdByUrl" resultType="String">
    SELECT id FROM url_table WHERE url = #{url}
</select>

찾아낸 진짜 원인

resultType에서의 대소문자 구분

resultType을 "String"이 아닌, "string"으로 변경하자 마치 아무 일도 없었던 것처럼 깔끔하게 해결되었습니다...

<select id="findIdByUrl" resultType="string">
    SELECT id FROM url_table WHERE url = #{url}
</select>

그게 문제인 이유

MyBatis의 resultType 처리 방식은 내부적으로 자바의 FQCN(Fully Qualified Class Name)으로 변환되는데,

resultType엔 패키지 경로를 포함한 전체 클래스 명 또는 별칭이 되어야 한다고 합니다.

결국 제가 입력했던 String은 경로를 제외한 클래스 명이 되었던 것이고,

MyBatis가 요구했던 값은 "java.lang.String" 또는 "string"이 되었어야 한다는 것입니다.

결론

실패한 방법들은 틀린 방법이 아니었습니다. 원인이 아예 달랐었던 것 뿐.

그리고 저는 바보입니다.

 

출처 및 인용

https://java119.tistory.com/45
https://mybatis.org/mybatis-3/ko/sqlmap-xml.html#Result_Maps
반응형