Adding a custom module in Bahmni

I tried adding a new custom module in Bahmni. I seem to be getting error whenever I try to call the services inside the new module from the existing Bahmni module. The new module has two child modules viz api and omod. I tried loading module(custom) through the admin panel, and I got following error.

HTTP Status 500 - Servlet.init() for servlet openmrs threw exception

type Exception report

message Servlet.init() for servlet openmrs threw exception

description The server encountered an internal error that prevented it from fulfilling this request.

exception

javax.servlet.ServletException: Servlet.init() for servlet openmrs threw exception _ org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505)_ _ org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)_ _ org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:534)_ _ org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1081)_ _ org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:658)_ _ org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:222)_ _ org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1566)_ _ org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1523)_ _ java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)_ _ java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)_ _ org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)_ _ java.lang.Thread.run(Unknown Source)_ root cause

org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find class [org.openmrs.module.uiframework.UiFrameworkConversionServiceFactoryBean] for bean with name ‘conversionService’ defined in URL [jar:file:/opt/openmrs/.openmrs-lib-cache/uiframework/uiframework.jar!/webModuleApplicationContext.xml]; nested exception is java.lang.ClassNotFoundException: org.openmrs.module.uiframework.UiFrameworkConversionServiceFactoryBean _ org.springframework.beans.factory.support.AbstractBeanFactory.resolveBeanClass(AbstractBeanFactory.java:1328)_ _ org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.determineTargetType(AbstractAutowireCapableBeanFactory.java:622)_ _ org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.predictBeanType(AbstractAutowireCapableBeanFactory.java:591)_ _ org.springframework.beans.factory.support.AbstractBeanFactory.isTypeMatch(AbstractBeanFactory.java:533)_ _ org.springframework.beans.factory.support.AbstractBeanFactory.isTypeMatch(AbstractBeanFactory.java:513)_ _ org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:739)_ _ org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480)_ _ org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:663)_ _ org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:629)_ _ org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:677)_ _ org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:548)_ _ org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:489)_ _ org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136)_ _ javax.servlet.GenericServlet.init(GenericServlet.java:158)_ _ org.openmrs.web.DispatcherServlet.init(DispatcherServlet.java:84)_ _ org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505)_ _ org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)_ _ org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:534)_ _ org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1081)_ _ org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:658)_ _ org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:222)_ _ org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1566)_ _ org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1523)_ _ java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)_ _ java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)_ _ org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)_ _ java.lang.Thread.run(Unknown Source)_ root cause

java.lang.ClassNotFoundException: org.openmrs.module.uiframework.UiFrameworkConversionServiceFactoryBean _ org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1320)_ _ org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1173)_ _ org.openmrs.util.OpenmrsClassLoader.loadClass(OpenmrsClassLoader.java:166)_ _ java.lang.ClassLoader.loadClass(Unknown Source)_ _ org.springframework.util.ClassUtils.forName(ClassUtils.java:249)_ _ org.springframework.beans.factory.support.AbstractBeanDefinition.resolveBeanClass(AbstractBeanDefinition.java:395)_ _ org.springframework.beans.factory.support.AbstractBeanFactory.doResolveBeanClass(AbstractBeanFactory.java:1349)_ _ org.springframework.beans.factory.support.AbstractBeanFactory.resolveBeanClass(AbstractBeanFactory.java:1320)_ _ org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.determineTargetType(AbstractAutowireCapableBeanFactory.java:622)_ _ org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.predictBeanType(AbstractAutowireCapableBeanFactory.java:591)_ _ org.springframework.beans.factory.support.AbstractBeanFactory.isTypeMatch(AbstractBeanFactory.java:533)_ _ org.springframework.beans.factory.support.AbstractBeanFactory.isTypeMatch(AbstractBeanFactory.java:513)_ _ org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:739)_ _ org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480)_ _ org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:663)_ _ org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:629)_ _ org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:677)_ _ org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:548)_ _ org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:489)_ _ org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136)_ _ javax.servlet.GenericServlet.init(GenericServlet.java:158)_ _ org.openmrs.web.DispatcherServlet.init(DispatcherServlet.java:84)_ _ org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505)_ _ org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)_ _ org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:534)_ _ org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1081)_ _ org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:658)_ _ org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:222)_ _ org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1566)_ _ org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1523)_ _ java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)_ _ java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)_ _ org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)_ _ java.lang.Thread.run(Unknown Source)_ note The full stack trace of the root cause is available in the Apache Tomcat/8.0.12 logs.

Hi, I have figured out what I did wrong in here. I was calling a service present in api module(present inside my custom module), from controller in omod module(also inside my custom module). But what I missed was packaging the classes that are used in omod module in omod file (A really silly mistake here. :sweat_smile:) Hence, it could not initialize the servlet as it was looking for that model class in the runtime.

Also for any future posts to add modules in Bahmni follow this: https://wiki.openmrs.org/display/docs/Creating+Modules

Glad to know you got it working. Curious to know what functionality you added using it?

@arjun I am working on a functionality to assign a doctor to a visit and to charge patient the doctor’s fees.