2

IBM MobileFirst Platform Studio (이전 IBM Worklight)를 사용하여 하이브리드 애플리케이션을 개발 중입니다.IBM MobileFirst - NoClassDefFoundError

OUT 매개 변수가 포함 된 Oracle 저장 PL/SQL 프로 시저를 호출해야한다는 요구 사항 때문에 여기서 제공된 How to get OUT parameter when invoking a stored procedure? 솔루션을 사용합니다. Java에서 저장 프로 시저를 호출하고 어댑터 프로 시저에서 Java 클래스를 호출합니다.

내 프로젝트의 server/java 폴더에 StoredProcedure.java src 파일을 추가했습니다. 나는 또한 commons-dbutils-1.6.jar와 ojdbc6.jar을 server/lib 폴더에 추가했다. StoredProcedure 클래스는 MobileFirst 개발 서버에서 저장 및 배포되도록 구축되었습니다. 또한 server.xml에 필요한 datasource를 정의했지만 구현 한 어댑터 프로 시저 (R-click on adapter -> Deploy MobileFirstAdapter, R-Click 어댑터 실행 -> MobileFirst 프로 시저 호출)를 테스트하려고하면이 오류가 발생합니다. 메시지 :

나는 그래서 백엔드 서비스가 평민 - dbutils-1.6.jar를 발견해야 할 다른 무엇
[ERROR ] FWLSE0099E: An error occurred while invoking procedure [project MxP]StoredProcedure/pretragaVozilaFWLSE0100E: parameters: [project MxP] 
invocation of javascript function 'pretragaVozila' has failed: ResultSetHandler 
FWLSE0101E: Caused by: [project MxP]java.lang.NoClassDefFoundError: ResultSetHandlerjava.lang.RuntimeException: 
    invocation of javascript function 'pretragaVozila' has failed: ResultSetHandler 
    at com.worklight.integration.js.JavaScriptProcedureInvoker.invoke(JavaScriptProcedureInvoker.java:52) 
    at com.worklight.integration.model.ProcedureInvoker.invokeProcedure(ProcedureInvoker.java:54) 
    at com.worklight.integration.model.Procedure.invoke(Procedure.java:166) 
    at com.worklight.integration.services.impl.DataAccessServiceImpl.callProcedureInternal(DataAccessServiceImpl.java:593) 
    at com.worklight.integration.services.impl.DataAccessServiceImpl.callProcedure(DataAccessServiceImpl.java:539) 
    at com.worklight.integration.services.impl.DataAccessServiceImpl.access$100(DataAccessServiceImpl.java:58) 
    at com.worklight.integration.services.impl.DataAccessServiceImpl$3.execute(DataAccessServiceImpl.java:433) 
    at com.worklight.core.auth.impl.AuthenticationServiceBean.accessResource(AuthenticationServiceBean.java:76) 
    at com.worklight.integration.services.impl.DataAccessServiceImpl.invokeProcedureInternal(DataAccessServiceImpl.java:430) 
    at com.worklight.integration.services.impl.DataAccessServiceImpl.invokeProcedure(DataAccessServiceImpl.java:139) 
    at com.worklight.server.dev.InvokeProcedureHandler.handle(InvokeProcedureHandler.java:85) 
    at com.worklight.server.dev.DevRootServlet.service(DevRootServlet.java:97) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:668) 
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1274) 
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:767) 
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:469) 
    at com.ibm.ws.webcontainer.filter.WebAppFilterChain.invokeTarget(WebAppFilterChain.java:127) 
    at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:88) 
    at com.worklight.core.auth.impl.AuthenticationFilter.doFilter(AuthenticationFilter.java:151) 
    at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:194) 
    at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:85) 
    at com.ibm.ws.webcontainer.filter.WebAppFilterManager.doFilter(WebAppFilterManager.java:968) 
    at com.ibm.ws.webcontainer.filter.WebAppFilterManager.invokeFilters(WebAppFilterManager.java:1056) 
    at com.ibm.ws.webcontainer.webapp.WebApp.handleRequest(WebApp.java:4553) 
    at com.ibm.ws.webcontainer.osgi.DynamicVirtualHost$2.handleRequest(DynamicVirtualHost.java:301) 
    at com.ibm.ws.webcontainer.WebContainer.handleRequest(WebContainer.java:954) 
    at com.ibm.ws.webcontainer.osgi.DynamicVirtualHost$2.run(DynamicVirtualHost.java:266) 
    at com.ibm.ws.http.dispatcher.internal.channel.HttpDispatcherLink$TaskWrapper.run(HttpDispatcherLink.java:776) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: java.lang.NoClassDefFoundError: ResultSetHandler 
    at java.lang.Class.getDeclaredMethods0(Native Method) 
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2615) 
    at java.lang.Class.getDeclaredMethods(Class.java:1860) 
    at org.mozilla.javascript.JavaMembers.discoverAccessibleMethods(JavaMembers.java:315) 
    at org.mozilla.javascript.JavaMembers.discoverAccessibleMethods(JavaMembers.java:302) 
    at org.mozilla.javascript.JavaMembers.reflect(JavaMembers.java:419) 
    at org.mozilla.javascript.JavaMembers.<init>(JavaMembers.java:43) 
    at org.mozilla.javascript.JavaMembers.lookupClass(JavaMembers.java:807) 
    at org.mozilla.javascript.NativeJavaClass.initMembers(NativeJavaClass.java:49) 
    at org.mozilla.javascript.NativeJavaObject.<init>(NativeJavaObject.java:44) 
    at org.mozilla.javascript.NativeJavaClass.<init>(NativeJavaClass.java:43) 
    at org.mozilla.javascript.NativeJavaClass.<init>(NativeJavaClass.java:39) 
    at org.mozilla.javascript.WrapFactory.wrapJavaClass(WrapFactory.java:134) 
    at org.mozilla.javascript.NativeJavaPackage.getPkgProperty(NativeJavaPackage.java:133) 
    at org.mozilla.javascript.NativeJavaPackage.get(NativeJavaPackage.java:82) 
    at org.mozilla.javascript.ScriptableObject.getProperty(ScriptableObject.java:2184) 
    at org.mozilla.javascript.ScriptRuntime.getObjectProp(ScriptRuntime.java:1492) 
    at org.mozilla.javascript.ScriptRuntime.getObjectProp(ScriptRuntime.java:1485) 
    at org.mozilla.javascript.Interpreter.interpretLoop(Interpreter.java:1239) 
    at org.mozilla.javascript.Interpreter.interpret(Interpreter.java:815) 
    at org.mozilla.javascript.InterpretedFunction.call(InterpretedFunction.java:109) 
    at org.mozilla.javascript.ContextFactory.doTopCall(ContextFactory.java:394) 
    at org.mozilla.javascript.ScriptRuntime.doTopCall(ScriptRuntime.java:3091) 
    at org.mozilla.javascript.InterpretedFunction.call(InterpretedFunction.java:107) 
    at com.worklight.integration.js.JavaScriptManager.callFunction(JavaScriptManager.java:267) 
    at com.worklight.integration.js.JavaScriptManager.invokeFunction(JavaScriptManager.java:241) 
    at com.worklight.integration.js.JavaScriptManager.invokeFunction(JavaScriptManager.java:211) 
    at com.worklight.integration.services.impl.AdapterManagerImpl.invokeFunction(AdapterManagerImpl.java:124) 
    at com.worklight.integration.js.JavaScriptProcedureInvoker.invoke(JavaScriptProcedureInvoker.java:42) 
... 30 more 
Caused by: java.lang.ClassNotFoundException: ResultSetHandler 
    at com.ibm.ws.classloading.internal.AppClassLoader.findClassCommonLibraryClassLoaders(AppClassLoader.java:436) 
    at com.ibm.ws.classloading.internal.AppClassLoader.findClass(AppClassLoader.java:265) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425) 
    at com.ibm.ws.classloading.internal.AppClassLoader.loadClass(AppClassLoader.java:411) 
... 59 more 
com.worklight.common.log.filters.ErrorFilter 

?

Eclipse 버전을 실행 중입니다 : Windows 7 64bit에서 64bit Java v1.7.0.72를 사용하는 Luna Service Release 1 (4.4.1), Oracle Server 11g에 연결.

+0

자바 파일이 실제로 전개되어 있나요? bin 폴더에서 .war 파일을 찾아 엽니 다.이 파일의 이름을 .zip으로 바꿀 수 있으며 파일이 존재하는지 확인할 수 있습니다. –

+0

안녕하세요, Idan! 예. 클래스 파일과 모든 .jar 파일이 bin 폴더의 프로젝트 .war 안에 있습니다. – user115524

+0

commons-dbutils src 파일을 서버/java에 넣고 컴파일하면 한 단계 더 나아갈 수 있습니다 - FWLSE0101E : 원인 : [project MxP] javax.naming.NamingException : CWWKN0008E : 이름 jdbc/OracleDS.java.lang.RuntimeException에 대해 오브젝트를 확보 할 수 없습니다. javascript 함수 'pretragaVozila'의 호출에 실패했습니다. CWWKN0008E : 오브젝트가 될 수 없습니다. name jdbc/OracleDS에 대해 확보 됨. – user115524

답변

1

server/lib 디렉토리에 필요한 jar를 삭제하면 제대로 작동하지 않습니다. 내가 필요한 항아리 (dbutils)과 server.xml에 다음과 같은 변수에 매핑되는 WorklightServerConfig

<workspace>/WorklightServerConfig/shared/resources 

에 Eclipse 작업 공간 상대적으로 다음 디렉토리에 저장된 프로 시저를 호출하기 위해 만든 사용자 지정 항아리를 복사해야

${shared.resource.dir} 

다음 오라클 lib 디렉토리를 정의, 나는 오라클라는 이름의 하위 디렉토리에 ojdbc6.jar

<library id="ORACLE_LIB"> 
    <fileset dir="${shared.resource.dir}/oracle" includes="*.jar"/> 
</library> 

<connectionManager id="OraclePool" maxPoolSize="40" minPoolSize="10"/> 

<dataSource id="mobileDatasource" jndiName="jdbc/mobile__datasource"> 
    <jdbcDriver libraryRef="ORACLE_LIB"/> 
    <properties.oracle URL="jdbc:oracle:thin:@..." password="..." user="..."/> 
</dataSource> 
+0

안녕 샘, 고마워! 나는 오라클 파트를 당신이했던 것과 같은 방식으로 했었지만 서버/java 폴더 아래에 java src 파일을 가지고 컴파일하고 .war 파일로 변환했다. 백엔드에 jar 의존성을 포함시키는 표준 방법이 존재하지 않는다는 것이 이상하다는 것을 알게되었습니다 ... – user115524

관련 문제