gradle spring boot 셋팅시 error

 

spring boot 2.1.0 버전 사용시 아래와 같은 에러가 나타 날수 있다. 

에러 내용 

java.lang.NoSuchMethodError: javax.servlet.http.HttpServletRequest.getHttpServletMapping()Ljavax/servlet/http/HttpServletMapping;

ERROR o.a.c.c.C.[.[.[.[dispatcherServlet] - Servlet.service() for servlet [dispatcherServlet] in context with path [/vsql] threw exception [Handler processing failed; nested exception is java.lang.NoSuchMethodError: javax.servlet.http.HttpServletRequest.getHttpServletMapping()Ljavax/servlet/http/HttpServletMapping;] with root cause
java.lang.NoSuchMethodError: javax.servlet.http.HttpServletRequest.getHttpServletMapping()Ljavax/servlet/http/HttpServletMapping;
	at org.apache.catalina.core.ApplicationHttpRequest.setRequest(ApplicationHttpRequest.java:708)
	at org.apache.catalina.core.ApplicationHttpRequest.<init>(ApplicationHttpRequest.java:114)
	at org.apache.catalina.core.ApplicationDispatcher.wrapRequest(ApplicationDispatcher.java:917)
	at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:358)
	at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:312)

 

문제 원인 : servlet version 이 내장 서버에 맞지 않아서 발생하는 문제.

2.1.0 버전 이상 사용시 톰켓 9은 servlet version 4.0을 사용하는데 버전이 맞지 않아서 문제함

providedCompile(
  [ group: 'javax.servlet' , name: 'javax.servlet-api' , version: '4.0.0' ]
  , [ group: 'javax.servlet' , name: 'jstl' , version: '1.2' ]
  , [ group: 'javax.servlet.jsp', name: 'javax.servlet.jsp-api', version: def_version.jspApi ]
)

 

해결방법 :  java[ group: 'javax.servlet' , name: 'javax.servlet-api' , version: '4.0.0'  의 버전을 내장 서버 버전과 동일하게 하면 문제 해결됨. 

 

mybatis procedure cursor resulthandler

mybatis 프로시저 커서 resulsethandler 사용은 3.4.6 버전이 후에 추가된것 같음. 

사용할려면 3.4.6버전이후 버전으로 사용. 

------------------------------------------------------------------------------------------------------------------------------

ResultHandler파라미터는 레코드별로 다룰수 있도록 해준다. List에 추가할수도 있고 Map, Set을 만들수도 있으며 각각의 결과를 그냥 던질수도 있다. ResultHandler로 많은 것을 할 수 있고 마이바티스는 결과셋을 다루기 위해 내부적으로 사용한다.

Since 3.4.6, ResultHandler passed to a CALLABLE statement is used on every REFCURSOR output parameter of the stored procedure if there is any.

http://www.mybatis.org/mybatis-3/ko/java-api.html

 

paste.html
0.00MB

javascript paste 할 값을 얻는 방법

그리드를 만드는중에 그리드에 붙여 넣기를 구현해야 하는 방법이 필요했다

그리드는 input 이나 textarea가 아닌 div태그여서 붙여 넣기 이벤트가 통하지 않았다.

그래서 살짝 우회 방법으로 구현을 했다.

구현방법은

keydown 이벤트를 잡아서 이벤트 실행되면 input이나 textarea에 foucs를 이동시키고
이동 시킨후에 input에 paste 이벤트를 잡을수 있다 .

여기까지가 설명 이제 . 코드.

<!doctype html>

<HTML>
 <HEAD>
  <TITLE> New Document </TITLE>
  <META NAME="Generator" CONTENT="EditPlus">
  <META NAME="Author" CONTENT="">
  <META NAME="Keywords" CONTENT="">
  <META NAME="Description" CONTENT="">
  <script
  src="https://code.jquery.com/jquery-3.4.1.slim.min.js"
  integrity="sha256-pasqAKBDmFT4eHoN2ndd6lN370kFiGUFyTiUHWhU7k8="
  crossorigin="anonymous"></script>
 </HEAD>

 <BODY>
    <table style="width:100%">
        <colgroup>
            <col style="width:45%;">
            <col style="width:50px;">
            <col style="width:45%;">
        </colgroup>
        <tr>
            <td>
                <input id="hiddenPasteText" text="">

                <div id="pasteArea" tabindex="-1" style="width:100%;height:200px; border:1px solid #000;">
                    붙여 넣기 공간
                    ctrl +v
                </div>
            </td>
            <td></td>
            <td>
                <div id="textArea" style="width:100%;height:200px; border:1px solid #000;">
                    paste 장소 
                </div>
            </td>
        </tr>
    </table>



 </BODY>
</HTML>

<script>
$(function (){
    // keydown event
    $(window).on("keydown", function (e) {

        var evtKey = window.event ? e.keyCode : e.which;

        if (e.metaKey || e.ctrlKey) {
            if(evtKey==86){ // ctrl + v
                $('#hiddenPasteText').focus();
                return true; 
            }
        }
    });

    // paste 처리
    $('#hiddenPasteText').on('paste', function (e){
        var orginEvt = e.originalEvent;
        var content ='';
        if( orginEvt.clipboardData && orginEvt.clipboardData.getData ){
            content = orginEvt.clipboardData.getData('text');
        }else if( e.clipboardData && e.clipboardData.getData ){
            content = e.clipboardData.getData('text/plain');
        }else if( window.clipboardData  && window.clipboardData.getData ){
            content = window.clipboardData.getData('Text');
        }

        $('#textArea').html(content);

    })
})
</script>
mybatis 에서 입력 하는데 뜬금없이 ClassCastException 발생. 

에러 발생 쿼리. 로그 
INSERT INTO TMUSER.TEST_TBL(COL1, COL2, COL3, USER_ID, IP_ADDR) VALUES(?, ?, ?, ?, ?)  
Parameters: asdf(String), I(String), (String), admin(String), 0.0.0.1(String) 

에러 내용. 
[org.mybatis.spring.MyBatisSystemException:](org.mybatis.spring.MyBatisSystemException:) nested exception is [org.apache.ibatis.exceptions.PersistenceException:](org.apache.ibatis.exceptions.PersistenceException:)    
### Error updating database.  Cause: [java.lang.ClassCastException:](java.lang.ClassCastException:) [java.lang.String](java.lang.String) cannot be cast to [java.util.List](java.util.List)


원인. 
<configuration>
    <settings>
        <setting name="useGeneratedKeys" value="true"/>
    </settings>
</configuration>
useGeneratedKeys 이 옵션이 true 로 되어 있어서 발생. 

해결
useGeneratedKeys 를 false로 변경해서 해결. 

+ Recent posts