#마이바티스 Cause: org.apache.ibatis.ognl.ExpressionSyntaxException Malformed OGNL expression 에러 해결 방법
-에러 발생 코드
-mybatis .xml
-mybatis if문에 AND연산자를 대문자로 사용해서 발생
MyBatis의 `<if>` 문에서 `AND` 및 `OR`을 대문자로 사용하면 오류가 발생할 수 있습니다.
이는 MyBatis의 내부 파싱 및 처리 규칙 때문입니다.
MyBatis에서는 SQL 문을 파싱 하기 위해 문자열 비교를 수행하고, 동적 쿼리를 생성하는 데 `<if>` 문을 사용합니다. 이때 문자열 비교는 대소문자를 구분합니다.
따라서, `<if>` 문에서 `AND` 및 `OR`과 같은 논리 연산자를 사용할 때 소문자로 작성해야 합니다.
예를 들어, `<if test="condition1 and condition2">`와 같이 소문자로 작성해야 합니다.
만약 대문자로 작성한다면, MyBatis는 이를 문자열로 처리하고, SQL 파싱에 문제가 발생할 수 있습니다.
따라서, 대문자 `AND` 및 `OR`을 사용하지 않도록 주의해야 합니다.
소문자로 작성한 후 다시 실행해 보세요. 이렇게 수정하면 MyBatis가 정상적으로 동작할 것입니다.
<if test='name = "A" AND name = "B"'>
</if>
-에러 내용
16:18:43.192 [33mWARN [0;39m [31mdrs-common[0;39m [36mc.d.d.c.e.GlobalExceptionHandler[0;39m.[33mexceptionHandler[0;39m(line:[31m69[0;39m) [31m:[0;39m exceptionHandler : org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.builder.BuilderException: Error evaluating expression '(menuTabDvCd != "" AND menuTabDvCd != null) OR menuTabDvCd != "5"'. Cause: org.apache.ibatis.ognl.ExpressionSyntaxException: Malformed OGNL expression: (menuTabDvCd != "" AND menuTabDvCd != null) OR menuTabDvCd != "5" [org.apache.ibatis.ognl.ParseException: Encountered " <IDENT> "AND "" at line 1, column 20.
Was expecting one of:
"," ...
"=" ...
"?" ...
"||" ...
"or" ...
"&&" ...
"and" ...
"|" ...
"bor" ...
"^" ...
"xor" ...
"&" ...
"band" ...
"==" ...
"eq" ...
"!=" ...
"neq" ...
"<" ...
"lt" ...
">" ...
"gt" ...
"<=" ...
"lte" ...
">=" ...
"gte" ...
"in" ...
"not" ...
"<<" ...
"shl" ...
">>" ...
"shr" ...
">>>" ...
"ushr" ...
"+" ...
"-" ...
"*" ...
"/" ...
"%" ...
"instanceof" ...
"." ...
"(" ...
")" ...
"[" ...
<DYNAMIC_SUBSCRIPT> ...
]
at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:96)
at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:441)
at jdk.proxy2/jdk.proxy2.$Proxy103.selectList(Unknown Source)
at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:224)
at org.apache.ibatis.binding.MapperMethod.executeForMany(MapperMethod.java:147)
at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:80)
at org.apache.ibatis.binding.MapperProxy$PlainMethodInvoker.invoke(MapperProxy.java:145)
at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:86)
at jdk.proxy2/jdk.proxy2.$Proxy328.findCmuStdyMngList(Unknown Source)
at com.daekyo.dreams.sfd.stdy.cmu.service.CmuStdyMngService.findCmuStdyMngList(CmuStdyMngService.java:88)
at com.daekyo.dreams.sfd.stdy.cmu.service.CmuStdyMngService$$FastClassBySpringCGLIB$$a767260f.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:793)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763)
at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:388)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:708)
at com.daekyo.dreams.sfd.stdy.cmu.service.CmuStdyMngService$$EnhancerBySpringCGLIB$$b96275a.findCmuStdyMngList(<generated>)
at com.daekyo.dreams.sfd.stdy.cmu.controller.CmuStdyMngController.findCmuStdyMngList(CmuStdyMngController.java:83)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:568)
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1071)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:964)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:517)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:584)
at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:74)
at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:129)
at com.daekyo.dreams.core.filter.CorsFilter.doFilterInternal(CorsFilter.java:60)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
at org.springframework.session.web.http.SessionRepositoryFilter.doFilterInternal(SessionRepositoryFilter.java:142)
at org.springframework.session.web.http.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:82)
at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
at io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)
at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)
at io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68)
at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)
at io.undertow.servlet.handlers.RedirectDirHandler.handleRequest(RedirectDirHandler.java:68)
at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:117)
at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)
at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)
at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)
at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)
at io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at io.undertow.servlet.handlers.SendErrorPageHandler.handleRequest(SendErrorPageHandler.java:52)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:275)
at io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:79)
at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:134)
at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:131)
at io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)
at io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)
at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:255)
at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:79)
at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:100)
at io.undertow.server.Connectors.executeRootHandler(Connectors.java:387)
at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:852)
at org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)
at org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:2019)
at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1558)
at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1423)
at org.xnio.XnioWorker$WorkerThreadFactory$1$1.run(XnioWorker.java:1282)
at java.base/java.lang.Thread.run(Thread.java:833)
#OGNL이란?
OGNL은 "Object-Graph Navigation Language"의 약자로, Java 기반의 표현 언어입니다. OGNL은 주로 프레임워크인 Apache Struts, Apache Tapestry, 그리고 Java 객체 그래프를 다루는 기타 프로젝트에서 사용됩니다.
OGNL은 객체 그래프 내에서 속성에 접근하고 조작하기 위한 강력한 기능을 제공합니다. 이 언어를 사용하면 객체의 속성에 대한 값을 검색하거나 설정하고, 메서드를 호출하고, 수치 연산, 논리 연산, 조건문, 반복문 등을 수행할 수 있습니다.
예를 들어, OGNL을 사용하여 Java 객체의 속성에 접근하고 값을 가져올 수 있습니다:
```java
String name = (String) Ognl.getValue("user.name", context, root);
```
위의 예시에서 `user` 객체의 `name` 속성에 접근하여 값을 가져오고 있습니다.
OGNL은 객체 그래프 내에서 복잡한 작업을 수행할 수 있는 강력하고 유연한 언어입니다. 많은 Java 기반 프레임워크에서 OGNL을 사용하여 데이터의 동적인 처리를 지원하고 있습니다.
#Cause: org.apache.ibatis.ognl.ExpressionSyntaxException 에러 해결 방법
`org.apache.ibatis.ognl.ExpressionSyntaxException` 에러는 OGNL 표현식 구문 오류를 나타내는 예외입니다. 이 오류는 OGNL 표현식을 평가하는 동안 구문 오류가 발생했을 때 발생할 수 있습니다.
해결 방법은 다음과 같습니다:
1. OGNL 표현식을 다시 확인하십시오: 표현식에 올바른 구문이 있는지 확인하고, 문법 오류가 있는지 확인합니다. OGNL 문법에 대해 자세히 알아보고, 문제가 있는 부분을 수정하십시오.
2. OGNL 문법에 맞게 사용하십시오: OGNL 문법은 Java의 문법과 유사하지만 약간의 차이가 있을 수 있습니다. OGNL 문법에서 사용하는 연산자, 표현식 구조 등을 확인하고, 정확하게 사용하십시오.
3. 변수나 속성의 존재 여부를 확인하십시오: OGNL 표현식에서 사용하는 변수나 속성이 실제로 존재하는지 확인하십시오. 변수나 속성의 이름이 올바른지, 대소문자가 일치하는지 등을 확인합니다.
4. OGNL 버전을 확인하십시오: 사용 중인 라이브러리의 OGNL 버전을 확인하고, 최신 버전인지 확인하십시오. 버그나 구문 오류가 최신 버전에서 수정되었을 수 있습니다.
5. 문제가 지속되면 커뮤니티나 지원 채널에 도움을 요청하십시오: 만약 위의 해결 방법으로 문제를 해결할 수 없다면, 관련 커뮤니티나 지원 채널에서 도움을 요청하십시오. 해당 프레임워크나 라이브러리의 공식 문서, 포럼, 이슈 트래커 등을 확인하여 도움을 받을 수 있습니다.
위의 방법들을 시도해 보고도 문제가 지속된다면, 더 구체적인 오류 메시지나 코드 예시를 제공하여 도움을 요청하는 것이 좋습니다.
#표현식
"," ...
"=" ...
"?" ...
"||" ...
"or" ...
"&&" ...
"and" ...
"|" ...
"bor" ...
"^" ...
"xor" ...
"&" ...
"band" ...
"==" ...
"eq" ...
"!=" ...
"neq" ...
"<" ...
"lt" ...
">" ...
"gt" ...
"<=" ...
"lte" ...
">=" ...
"gte" ...
"in" ...
"not" ...
"<<" ...
"shl" ...
">>" ...
"shr" ...
">>>" ...
"ushr" ...
"+" ...
"-" ...
"*" ...
"/" ...
"%" ...
"instanceof" ...
"." ...
"(" ...
")" ...
"[" ...
<DYNAMIC_SUBSCRIPT> ...
]
댓글