MyBatis + MariaDB(or MySQL) 사용 시 select 결과가 resultType으로 지정한 Class에 바인딩(맵핑)이 안된다.


<mapper namespace="_mgr">

    .... 생략 ....

    <select id="view" resultType="mgrBean" parameterType="string">

        SELECT MGR_ID AS mgrId,

                  MGR_NM AS mgrNm

                  .... 생략 ....

          FROM CO_MGR

        WHERE MGR_ID = #{mgrId}

    </select>

    

    ....


위에서 'view' id를 갖는 쿼리문의 실행결과는 resultType으로 지정한 mgrBean이라는 alias로 지정된 클래스의 멤버변수에 자동으로 바인딩(맵핑) 되어야 하는데 일부 칼럼은 되고, 일부 칼럼은 안되는 경우가 발생했다.


구글신에게 물어봐도 답을 못찾아서 이것 저것 설정 파일을 건드리다가 아래와 같이 해결했다.

(구글이 못찾을 경우의 대부분은 내가 만난 문제가 매우 지엽적인 경우이다. 따라서 내 환경에 문제가 있을 가능성이 높다)


[myBatis 설정파일]


<configuration>

    .... 생략 ....

    <setting name="useColumnLabel" value="true" />


    ....


DB 칼럼명 대신에 칼럼라벨을 대신 사용하겠다는 설정이며 디폴트 값은 true이다.


이전에 오라클을 사용하면서 저 값을 fasle로 설정한 후 문제가 없었기에 다른 DB에서도 당연히 정상 동작하는 줄 알았는데 MariaDB를 사용하니 문제가 발생했다.


JDBC 드라이버 바꿔가면서 1시간 정도 삽질한 기념으로, 본 시행착오를 글로 남겨본다.




J2EE Servlet 명세에서 인코딩된(content type : application/x-www-form-urlencoded) HTTP PUT 메소드는 지원하지 않기 때문에 폼에 값을 담은 후 PUT으로 서버에 전송할 경우 Command Object 바인딩이 자동으로 되지 않는다.


해결책은 아래와 같다. 


자료 찾느라 열라 고생함 ㅠㅠ 

(아직 spring 기반의 RESTful 서비스가 많지 않아서 그런가? 아님 너무 당연해서 나만 몰랐던 건가?)


출처 : http://static.springsource.org/spring/docs/current/spring-framework-reference/html/mvc.html

16.3.3.11 Working with "application/x-www-form-urlencoded" data

The previous sections covered use of @ModelAttribute to support form submission requests from browser clients. The same annotation is recommended for use with requests from non-browser clients as well. However there is one notable difference when it comes to working with HTTP PUT requests. Browsers can submit form data via HTTP GET or HTTP POST. Non-browser clients can also submit forms viaHTTP PUT. This presents a challenge because the Servlet specification requires the ServletRequest.getParameter*() family of methods to support form field access only for HTTP POST, not for HTTP PUT.

To support HTTP PUT requests, the spring-web module provides the filter HttpPutFormContentFilter, which can be configured in web.xml:

<filter>
  <filter-name>httpPutFormFilter</filter-name>
  <filter-class>org.springframework.web.filter.HttpPutFormContentFilter</filter-class>
</filter>

<filter-mapping>
  <filter-name>httpPutFormFilter</filter-name>
  <servlet-name>dispatcherServlet</servlet-name>
</filter-mapping>

<servlet>
  <servlet-name>dispatcherServlet</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>

The above filter intercepts HTTP PUT requests with content type application/x-www-form-urlencoded, reads the form data from the body of the request, and wraps the ServletRequest in order to make the form data available through the ServletRequest.getParameter*() family of methods.


참고 : http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/web/filter/HttpPutFormContentFilter.html




+ Recent posts