This happens 100% when going into the settings (cog icon) then General settings->Customize (under locale)
after clicking this button Dashbord opens with all items losing their localized names
Fixes itself after service openboxes restart
This happens 100% when going into the settings (cog icon) then General settings->Customize (under locale)
after clicking this button Dashbord opens with all items losing their localized names
Fixes itself after service openboxes restart
This is most likely caused by the same issue preventing you from downloading the templates (Tomcat is unable to access certain files within the application).
Either there’s a simple file permission issue behind it OR there’s a fundamental problem with the way the standalone WAR (running the application within an embedded Tomcat process) handles resource files within the WAR file.
I can’t make any recommendations without seeing the output from the other thread, but eventually we might want to think about recreating your production environment using the “latest” version of the installation docs, which uses the standard approach of deploying the application to a standalone Tomcat instance.
I will try to replicate the issue locally when I get a chance.
Thanks
since i`m currently just evaluating the app, maybe you could share your opinion on what is the most trouble-free method of installation? I naively thought that Grails v3 version on the Ubuntu is the best option to go but seems that it might not be the case with the embedded Tomcat etc.
Is more recent Ubuntu server version not officially supported, only 18.04 - i have seen members of the community having some issues with 22.04?
Thanks for all the support and efforts answering all those questions in such a detailed and easy to understand manner - this is rare and very valuable nowadays.
since i`m currently just evaluating the app,
Ok phew.
maybe you could share your opinion on what is the most trouble-free method of installation?
I recommend using the installation instructions in the “beta” version of our v0.9.x docs.
The instructions should be close to complete and valid, but please review the following ticket for feedback that we received from a community member regarding errors they found.
I plan to incorporate that feedback as soon as I can. And I have been trying to polish and publish these docs for months but haven’t had time to make the final push to clean up the remaining holes and create videos for some migration workflows.
But this is what I would recommend to anyone trying to install a v0.9.x release.
Is more recent Ubuntu server version not officially supported, only 18.04 - i have seen members of the community having some issues with 22.04?
Yes, the instructions mentioned above target Ubuntu 22.04.
Note: I tried to install on Ubuntu 24.04, but OpenBoxes does not deploy on Tomcat 10, so I would avoid starting with 24.04 until we can test and add proper instructions. But, from what I understand, upgrading from 22.04 to 24.04 (after you have installed OpenBoxes) does not cause any problems.
Thanks for all the support and efforts answering all those questions in such a detailed and easy to understand manner - this is rare and very valuable nowadays.
It’s my pleasure. Interacting with the community, brainstorming solutions, and answering questions are my favorite parts of this project. So, thank you for your interest, thoughtful questions, and patience in dealing with the bugs and quirks.
I was so close on 1st try but saw the pop-up and steered clear of it, mehhh
Thanks a lot, i will reinstall from scratch. Who knows, probably some of the bugs i have giscovered attribute to the specifics of integrated Tomcat
Had no issues installing according to this guide. This solved the issue with not being able to download templates (have commented in the original topic).
One question re this guide though: there is timezone in the datasource url - shouldn`t it be matched with the server timezone?
url: jdbc:mysql://localhost:3306/<database>?allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=UTC
Original bug ( “Internal server error” after clicking General settings->Customize (under locale list) ) is still present. What should this “Customize” button do anyway - switch to custom localization? Then it could be expected behavior since i have no custom localization made.
Thought it is worth mentioning: using standalone Tomcat installation path solved the issue with inconsistent page load times i have mentioned here when 1st load took like 5-6 seconds and subseqent loads took 0,001 seconds
Solved the issue with non-unicode characters shown as “?” in most parts of the app as well.
Looks like Grails v3 with integrated Tomcat should be avoided in the current state
Sorry for wasting your time on wild goose chase.
PS:
There was a bunch of warnings during startup similar to
[2024-11-23 15:16:12] [warning] Unable to add the resource at [/WEB-INF/classes/requisition/_requisitionItems2.gsp] to the cache for web application [/openboxes] because there was insufficient free space available after evicting expired cache entries - consider increasing the maximum size of the cache
Do they have to be addressed or can be ignored?
sorry for spamming with replies, but found couple issues in the closing part of the guide
<VirtualHost *:80>
...
# Redirect requests for root context to /openboxes
RedirectMatch ^/$ /openboxes/
# Forward /openboxes requests to Tomcat
ProxyPreserveHost On
ProxyPass /openboxes http://127.0.0.1:8080/openboxes
ProxyPassReverse /openboxes http://127.0.0.1:8080/openboxes
</VirtualHost>
apachtctl configtest
→ apachectl configtest
Those can be ignored.
p.s. Apologies for missing this message back in November.
Regarding the Reverse Proxy instructions, thank you for the feedback on that.
I’m having the same error on ubuntu 22.04 clean installation, how could you manage to overcome this error.
I’m having the same error on ubuntu 22.04 clean installation, how could you manage to overcome this error.
Hey @irzelindo How are you?
Can you clarify what you mean by “same error”? A screenshot and/or error log would be helpful. And can you also point me to the exact version of the installation document you used?
Justin
I followed the instructions on this link https://docs.openboxes.com/en/stable/admin-guide/installation/
and installed OpenBoxes on Ubuntu desktop version 22.04. After the installation, when I logged in, pop-ups appeared, and there were no labels on the dashboard cards. The error displays Internal server error: Cannot get property ‘inputStream’ on null object
as shown in the image attached.
catalina.out
logs, the error has to be with localization.
2025-05-29 14:05:36,729 INFO [http-nio-8080-exec-9] org.pih.warehouse.core.UserService: Is role ROLE_SHIPMENT_NOTIFICATION in [ROLE_ADMIN, ROLE_SUPERUSER, ROLE_AUTHENTICATED, ROLE_MANAGER, ROLE_ASSISTANT, ROLE_BROWSER] = false
2025-05-29 14:05:36,729 INFO [http-nio-8080-exec-9] org.pih.warehouse.core.UserService: Is role ROLE_FINANCE in [ROLE_ADMIN, ROLE_SUPERUSER, ROLE_AUTHENTICATED, ROLE_MANAGER, ROLE_ASSISTANT, ROLE_BROWSER] = false
2025-05-29 14:05:36,729 INFO [http-nio-8080-exec-9] org.pih.warehouse.core.UserService: Is role ROLE_SUPERUSER in [ROLE_ADMIN, ROLE_SUPERUSER, ROLE_AUTHENTICATED, ROLE_MANAGER, ROLE_ASSISTANT, ROLE_BROWSER] = true
2025-05-29 14:05:36,729 INFO [http-nio-8080-exec-10] org.pih.warehouse.core.UserService: Is role ROLE_SUPERUSER in [ROLE_ADMIN, ROLE_SUPERUSER, ROLE_AUTHENTICATED, ROLE_MANAGER, ROLE_ASSISTANT, ROLE_BROWSER] = true
2025-05-29 14:05:36,729 INFO [http-nio-8080-exec-7] org.pih.warehouse.core.UserService: Is role ROLE_SUPERUSER in [ROLE_ADMIN, ROLE_SUPERUSER, ROLE_AUTHENTICATED, ROLE_MANAGER, ROLE_ASSISTANT, ROLE_BROWSER] = true
2025-05-29 14:05:36,741 ERROR [http-nio-8080-exec-10] StackTrace: Full Stack Trace:
java.lang.NullPointerException: Cannot get property 'inputStream' on null object
at org.codehaus.groovy.runtime.NullObject.getProperty(NullObject.java:60)
at org.codehaus.groovy.runtime.InvokerHelper.getProperty(InvokerHelper.java:190)
at org.codehaus.groovy.runtime.callsite.NullCallSite.getProperty(NullCallSite.java:46)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callGetProperty(AbstractCallSite.java:299)
at org.pih.warehouse.core.LocalizationService.getMessagesProperties(LocalizationService.groovy:73)
at org.pih.warehouse.core.LocalizationService$getMessagesProperties$1.call(Unknown Source)
at org.pih.warehouse.api.LocalizationApiController.list(LocalizationApiController.groovy:34)
at org.grails.core.DefaultGrailsControllerClass$MethodHandleInvoker.invoke(DefaultGrailsControllerClass.java:223)
at org.grails.core.DefaultGrailsControllerClass.invoke(DefaultGrailsControllerClass.java:188)
at org.grails.web.mapping.mvc.UrlMappingsInfoHandlerAdapter.handle(UrlMappingsInfoHandlerAdapter.groovy:90)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:967)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:529)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:623)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:199)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:144)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:168)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:144)
at org.springframework.boot.web.filter.ApplicationContextHeaderFilter.doFilterInternal(ApplicationContextHeaderFilter.java:54)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:168)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:144)
at org.springframework.boot.actuate.trace.WebRequestTraceFilter.doFilterInternal(WebRequestTraceFilter.java:111)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:168)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:144)
at org.grails.web.servlet.mvc.GrailsWebRequestFilter.doFilterInternal(GrailsWebRequestFilter.java:77)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:168)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:144)
at org.grails.web.filters.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:67)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:168)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:144)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:168)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:144)
at io.sentry.spring.tracing.SentryTracingFilter.doFilterInternal(SentryTracingFilter.java:91)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:168)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:144)
at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:96)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:168)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:144)
at org.springframework.boot.actuate.autoconfigure.MetricsFilter.doFilterInternal(MetricsFilter.java:100)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:168)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:144)
at org.springframework.boot.web.support.ErrorPageFilter.doFilter(ErrorPageFilter.java:128)
at org.springframework.boot.web.support.ErrorPageFilter.access$000(ErrorPageFilter.java:66)
at org.springframework.boot.web.support.ErrorPageFilter$1.doFilterInternal(ErrorPageFilter.java:103)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.springframework.boot.web.support.ErrorPageFilter.doFilter(ErrorPageFilter.java:121)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:168)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:144)
at io.sentry.spring.SentrySpringFilter.doFilterInternal(SentrySpringFilter.java:76)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:168)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:144)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:168)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:130)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:656)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:346)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:397)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:935)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1792)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)
at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1189)
at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:658)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)
at java.lang.Thread.run(Thread.java:750)
2025-05-29 14:05:36,742 ERROR [http-nio-8080-exec-10] StackTrace: Full Stack Trace:
java.lang.NullPointerException: Cannot get property 'inputStream' on null object
at org.pih.warehouse.core.LocalizationService.getMessagesProperties(LocalizationService.groovy:73)
at org.pih.warehouse.api.LocalizationApiController.list(LocalizationApiController.groovy:34)
at org.grails.core.DefaultGrailsControllerClass$MethodHandleInvoker.invoke(DefaultGrailsControllerClass.java:223)
at org.grails.core.DefaultGrailsControllerClass.invoke(DefaultGrailsControllerClass.java:188)
at org.grails.web.mapping.mvc.UrlMappingsInfoHandlerAdapter.handle(UrlMappingsInfoHandlerAdapter.groovy:90)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:967)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
at org.springframework.boot.web.filter.ApplicationContextHeaderFilter.doFilterInternal(ApplicationContextHeaderFilter.java:54)
at org.grails.web.servlet.mvc.GrailsWebRequestFilter.doFilterInternal(GrailsWebRequestFilter.java:77)
at org.grails.web.filters.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:67)
at io.sentry.spring.tracing.SentryTracingFilter.doFilterInternal(SentryTracingFilter.java:91)
at org.springframework.boot.web.support.ErrorPageFilter.doFilter(ErrorPageFilter.java:128)
at org.springframework.boot.web.support.ErrorPageFilter.access$000(ErrorPageFilter.java:66)
at org.springframework.boot.web.support.ErrorPageFilter$1.doFilterInternal(ErrorPageFilter.java:103)
at org.springframework.boot.web.support.ErrorPageFilter.doFilter(ErrorPageFilter.java:121)
at io.sentry.spring.SentrySpringFilter.doFilterInternal(SentrySpringFilter.java:76)
at java.lang.Thread.run(Thread.java:750)
2025-05-29 14:05:36,744 ERROR [http-nio-8080-exec-9] StackTrace: Full Stack Trace:
java.lang.NullPointerException: Cannot get property 'inputStream' on null object
at org.codehaus.groovy.runtime.NullObject.getProperty(NullObject.java:60)
at org.codehaus.groovy.runtime.InvokerHelper.getProperty(InvokerHelper.java:190)
at org.codehaus.groovy.runtime.callsite.NullCallSite.getProperty(NullCallSite.java:46)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callGetProperty(AbstractCallSite.java:299)
at org.pih.warehouse.core.LocalizationService.getMessagesProperties(LocalizationService.groovy:73)
at org.pih.warehouse.core.LocalizationService$getMessagesProperties$1.call(Unknown Source)
at org.pih.warehouse.api.LocalizationApiController.list(LocalizationApiController.groovy:34)
at org.grails.core.DefaultGrailsControllerClass$MethodHandleInvoker.invoke(DefaultGrailsControllerClass.java:223)
at org.grails.core.DefaultGrailsControllerClass.invoke(DefaultGrailsControllerClass.java:188)
at org.grails.web.mapping.mvc.UrlMappingsInfoHandlerAdapter.handle(UrlMappingsInfoHandlerAdapter.groovy:90)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:967)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:529)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:623)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:199)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:144)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:168)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:144)
at org.springframework.boot.web.filter.ApplicationContextHeaderFilter.doFilterInternal(ApplicationContextHeaderFilter.java:54)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:168)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:144)
at org.springframework.boot.actuate.trace.WebRequestTraceFilter.doFilterInternal(WebRequestTraceFilter.java:111)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:168)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:144)
at org.grails.web.servlet.mvc.GrailsWebRequestFilter.doFilterInternal(GrailsWebRequestFilter.java:77)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:168)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:144)
at org.grails.web.filters.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:67)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:168)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:144)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:168)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:144)
at io.sentry.spring.tracing.SentryTracingFilter.doFilterInternal(SentryTracingFilter.java:91)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:168)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:144)
at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:96)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:168)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:144)
at org.springframework.boot.actuate.autoconfigure.MetricsFilter.doFilterInternal(MetricsFilter.java:100)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:168)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:144)
at org.springframework.boot.web.support.ErrorPageFilter.doFilter(ErrorPageFilter.java:128)
at org.springframework.boot.web.support.ErrorPageFilter.access$000(ErrorPageFilter.java:66)
at org.springframework.boot.web.support.ErrorPageFilter$1.doFilterInternal(ErrorPageFilter.java:103)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.springframework.boot.web.support.ErrorPageFilter.doFilter(ErrorPageFilter.java:121)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:168)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:144)
at io.sentry.spring.SentrySpringFilter.doFilterInternal(SentrySpringFilter.java:76)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:168)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:144)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:168)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:130)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:656)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:346)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:397)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:935)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1792)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)
at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1189)
at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:658)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)
at java.lang.Thread.run(Thread.java:750)
2025-05-29 14:05:36,744 ERROR [http-nio-8080-exec-9] StackTrace: Full Stack Trace:
java.lang.NullPointerException: Cannot get property 'inputStream' on null object
at org.pih.warehouse.core.LocalizationService.getMessagesProperties(LocalizationService.groovy:73)
at org.pih.warehouse.api.LocalizationApiController.list(LocalizationApiController.groovy:34)
at org.grails.core.DefaultGrailsControllerClass$MethodHandleInvoker.invoke(DefaultGrailsControllerClass.java:223)
at org.grails.core.DefaultGrailsControllerClass.invoke(DefaultGrailsControllerClass.java:188)
at org.grails.web.mapping.mvc.UrlMappingsInfoHandlerAdapter.handle(UrlMappingsInfoHandlerAdapter.groovy:90)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:967)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
at org.springframework.boot.web.filter.ApplicationContextHeaderFilter.doFilterInternal(ApplicationContextHeaderFilter.java:54)
at org.grails.web.servlet.mvc.GrailsWebRequestFilter.doFilterInternal(GrailsWebRequestFilter.java:77)
at org.grails.web.filters.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:67)
at io.sentry.spring.tracing.SentryTracingFilter.doFilterInternal(SentryTracingFilter.java:91)
at org.springframework.boot.web.support.ErrorPageFilter.doFilter(ErrorPageFilter.java:128)
at org.springframework.boot.web.support.ErrorPageFilter.access$000(ErrorPageFilter.java:66)
at org.springframework.boot.web.support.ErrorPageFilter$1.doFilterInternal(ErrorPageFilter.java:103)
at org.springframework.boot.web.support.ErrorPageFilter.doFilter(ErrorPageFilter.java:121)
at io.sentry.spring.SentrySpringFilter.doFilterInternal(SentrySpringFilter.java:76)
at java.lang.Thread.run(Thread.java:750)
2025-05-29 14:05:36,746 ERROR [http-nio-8080-exec-10] o.g.web.errors.GrailsExceptionResolver: NullPointerException occurred when processing request: [GET] /openboxes/api/localizations
Cannot get property 'inputStream' on null object. Stacktrace follows:
java.lang.NullPointerException: Cannot get property 'inputStream' on null object
at org.pih.warehouse.core.LocalizationService.getMessagesProperties(LocalizationService.groovy:73)
at org.pih.warehouse.api.LocalizationApiController.list(LocalizationApiController.groovy:34)
at org.grails.core.DefaultGrailsControllerClass$MethodHandleInvoker.invoke(DefaultGrailsControllerClass.java:223)
at org.grails.core.DefaultGrailsControllerClass.invoke(DefaultGrailsControllerClass.java:188)
at org.grails.web.mapping.mvc.UrlMappingsInfoHandlerAdapter.handle(UrlMappingsInfoHandlerAdapter.groovy:90)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:967)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
at org.springframework.boot.web.filter.ApplicationContextHeaderFilter.doFilterInternal(ApplicationContextHeaderFilter.java:54)
at org.grails.web.servlet.mvc.GrailsWebRequestFilter.doFilterInternal(GrailsWebRequestFilter.java:77)
at org.grails.web.filters.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:67)
at io.sentry.spring.tracing.SentryTracingFilter.doFilterInternal(SentryTracingFilter.java:91)
at org.springframework.boot.web.support.ErrorPageFilter.doFilter(ErrorPageFilter.java:128)
at org.springframework.boot.web.support.ErrorPageFilter.access$000(ErrorPageFilter.java:66)
at org.springframework.boot.web.support.ErrorPageFilter$1.doFilterInternal(ErrorPageFilter.java:103)
at org.springframework.boot.web.support.ErrorPageFilter.doFilter(ErrorPageFilter.java:121)
at io.sentry.spring.SentrySpringFilter.doFilterInternal(SentrySpringFilter.java:76)
at java.lang.Thread.run(Thread.java:750)
2025-05-29 14:05:36,747 ERROR [http-nio-8080-exec-9] o.g.web.errors.GrailsExceptionResolver: NullPointerException occurred when processing request: [GET] /openboxes/api/localizations
Cannot get property 'inputStream' on null object. Stacktrace follows:
java.lang.NullPointerException: Cannot get property 'inputStream' on null object
at org.pih.warehouse.core.LocalizationService.getMessagesProperties(LocalizationService.groovy:73)
at org.pih.warehouse.api.LocalizationApiController.list(LocalizationApiController.groovy:34)
at org.grails.core.DefaultGrailsControllerClass$MethodHandleInvoker.invoke(DefaultGrailsControllerClass.java:223)
at org.grails.core.DefaultGrailsControllerClass.invoke(DefaultGrailsControllerClass.java:188)
at org.grails.web.mapping.mvc.UrlMappingsInfoHandlerAdapter.handle(UrlMappingsInfoHandlerAdapter.groovy:90)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:967)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
at org.springframework.boot.web.filter.ApplicationContextHeaderFilter.doFilterInternal(ApplicationContextHeaderFilter.java:54)
at org.grails.web.servlet.mvc.GrailsWebRequestFilter.doFilterInternal(GrailsWebRequestFilter.java:77)
at org.grails.web.filters.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:67)
at io.sentry.spring.tracing.SentryTracingFilter.doFilterInternal(SentryTracingFilter.java:91)
at org.springframework.boot.web.support.ErrorPageFilter.doFilter(ErrorPageFilter.java:128)
at org.springframework.boot.web.support.ErrorPageFilter.access$000(ErrorPageFilter.java:66)
at org.springframework.boot.web.support.ErrorPageFilter$1.doFilterInternal(ErrorPageFilter.java:103)
at org.springframework.boot.web.support.ErrorPageFilter.doFilter(ErrorPageFilter.java:121)
at io.sentry.spring.SentrySpringFilter.doFilterInternal(SentrySpringFilter.java:76)
at java.lang.Thread.run(Thread.java:750)
2025-05-29 14:05:36,753 DEBUG [http-nio-8080-exec-10] org.pih.warehouse.AccessLogInterceptor: /openboxes/errors/handleException [user:admin, location:Main Warehouse]
2025-05-29 14:05:36,753 DEBUG [http-nio-8080-exec-9] org.pih.warehouse.AccessLogInterceptor: /openboxes/errors/handleException [user:admin, location:Main Warehouse]
2025-05-29 14:05:36,754 DEBUG [http-nio-8080-exec-10] org.pih.warehouse.SentryInterceptor: updated Sentry context for /openboxes/errors/handleException in 1 ms
2025-05-29 14:05:36,754 DEBUG [http-nio-8080-exec-9] org.pih.warehouse.SentryInterceptor: updated Sentry context for /openboxes/errors/handleException in 1 ms
2025-05-29 14:05:36,836 DEBUG [http-nio-8080-exec-6] org.pih.warehouse.AccessLogInterceptor: /openboxes/api/dashboard/inProgressShipments [user:admin, location:Main Warehouse]
2025-05-29 14:05:36,836 DEBUG [http-nio-8080-exec-3] org.pih.warehouse.AccessLogInterceptor: /openboxes/api/dashboard/incomingStock [user:admin, location:Main Warehouse]
2025-05-29 14:05:36,836 DEBUG [http-nio-8080-exec-8] org.pih.warehouse.AccessLogInterceptor: /openboxes/api/dashboard/expirationSummary [user:admin, location:Main Warehouse]
2025-05-29 14:05:36,836 DEBUG [http-nio-8080-exec-2] org.pih.warehouse.AccessLogInterceptor: /openboxes/api/dashboard/inventorySummary [user:admin, location:Main Warehouse]
2025-05-29 14:05:36,836 DEBUG [http-nio-8080-exec-5] org.pih.warehouse.AccessLogInterceptor: /openboxes/api/dashboard/inventoryByLotAndBin [user:admin, location:Main Warehouse]
2025-05-29 14:05:36,836 DEBUG [http-nio-8080-exec-4] org.pih.warehouse.AccessLogInterceptor: /openboxes/api/dashboard/receivingBin [user:admin, location:Main Warehouse]
2025-05-29 14:05:36,844 DEBUG [http-nio-8080-exec-2] org.pih.warehouse.SentryInterceptor: updated Sentry context for /openboxes/api/dashboard/inventorySummary in 0 ms
2025-05-29 14:05:36,844 DEBUG [http-nio-8080-exec-4] org.pih.warehouse.SentryInterceptor: updated Sentry context for /openboxes/api/dashboard/receivingBin in 0 ms
2025-05-29 14:05:36,844 DEBUG [http-nio-8080-exec-6] org.pih.warehouse.SentryInterceptor: updated Sentry context for /openboxes/api/dashboard/inProgressShipments in 0 ms
2025-05-29 14:05:36,844 DEBUG [http-nio-8080-exec-5] org.pih.warehouse.SentryInterceptor: updated Sentry context for /openboxes/api/dashboard/inventoryByLotAndBin in 0 ms
2025-05-29 14:05:36,844 DEBUG [http-nio-8080-exec-3] org.pih.warehouse.SentryInterceptor: updated Sentry context for /openboxes/api/dashboard/incomingStock in 0 ms
2025-05-29 14:05:36,844 DEBUG [http-nio-8080-exec-8] org.pih.warehouse.SentryInterceptor: updated Sentry context for /openboxes/api/dashboard/expirationSummary in 0 ms
2025-05-29 14:05:36,845 INFO [http-nio-8080-exec-2] org.pih.warehouse.RoleInterceptor: No rule for dashboardApi:getInventorySummary -> allow anonymous
2025-05-29 14:05:36,845 INFO [http-nio-8080-exec-4] org.pih.warehouse.RoleInterceptor: No rule for dashboardApi:getReceivingBin -> allow anonymous
2025-05-29 14:05:36,845 INFO [http-nio-8080-exec-8] org.pih.warehouse.RoleInterceptor: No rule for dashboardApi:getExpirationSummary -> allow anonymous
2025-05-29 14:05:36,845 INFO [http-nio-8080-exec-3] org.pih.warehouse.RoleInterceptor: No rule for dashboardApi:getIncomingStock -> allow anonymous
2025-05-29 14:05:36,845 INFO [http-nio-8080-exec-5] org.pih.warehouse.RoleInterceptor: No rule for dashboardApi:getInventoryByLotAndBin -> allow anonymous
2025-05-29 14:05:36,845 INFO [http-nio-8080-exec-6] org.pih.warehouse.RoleInterceptor: No rule for dashboardApi:getInProgressShipments -> allow anonymous
2025-05-29 14:05:36,851 INFO [http-nio-8080-exec-8] org.pih.warehouse.core.UserService: Is role ROLE_PRODUCT_NOTIFICATION in [ROLE_ADMIN, ROLE_SUPERUSER, ROLE_AUTHENTICATED, ROLE_MANAGER, ROLE_ASSISTANT, ROLE_BROWSER] = false
2025-05-29 14:05:36,851 INFO [http-nio-8080-exec-5] org.pih.warehouse.core.UserService: Is role ROLE_SHIPMENT_NOTIFICATION in [ROLE_ADMIN, ROLE_SUPERUSER, ROLE_AUTHENTICATED, ROLE_MANAGER, ROLE_ASSISTANT, ROLE_BROWSER] = false
2025-05-29 14:05:36,851 INFO [http-nio-8080-exec-3] org.pih.warehouse.core.UserService: Is role ROLE_SHIPMENT_NOTIFICATION in [ROLE_ADMIN, ROLE_SUPERUSER, ROLE_AUTHENTICATED, ROLE_MANAGER, ROLE_ASSISTANT, ROLE_BROWSER] = false
2025-05-29 14:05:36,851 INFO [http-nio-8080-exec-4] org.pih.warehouse.core.UserService: Is role ROLE_SUPERUSER in [ROLE_ADMIN, ROLE_SUPERUSER, ROLE_AUTHENTICATED, ROLE_MANAGER, ROLE_ASSISTANT, ROLE_BROWSER] = true
2025-05-29 14:05:36,851 INFO [http-nio-8080-exec-8] org.pih.warehouse.core.UserService: Is role ROLE_SHIPMENT_NOTIFICATION in [ROLE_ADMIN, ROLE_SUPERUSER, ROLE_AUTHENTICATED, ROLE_MANAGER, ROLE_ASSISTANT, ROLE_BROWSER] = false
2025-05-29 14:05:36,851 INFO [http-nio-8080-exec-3] org.pih.warehouse.core.UserService: Is role ROLE_FINANCE in [ROLE_ADMIN, ROLE_SUPERUSER, ROLE_AUTHENTICATED, ROLE_MANAGER, ROLE_ASSISTANT, ROLE_BROWSER] = false
2025-05-29 14:05:36,851 INFO [http-nio-8080-exec-5] org.pih.warehouse.core.UserService: Is role ROLE_FINANCE in [ROLE_ADMIN, ROLE_SUPERUSER, ROLE_AUTHENTICATED, ROLE_MANAGER, ROLE_ASSISTANT, ROLE_BROWSER] = false
2025-05-29 14:05:36,851 INFO [http-nio-8080-exec-8] org.pih.warehouse.core.UserService: Is role ROLE_FINANCE in [ROLE_ADMIN, ROLE_SUPERUSER, ROLE_AUTHENTICATED, ROLE_MANAGER, ROLE_ASSISTANT, ROLE_BROWSER] = false
2025-05-29 14:05:36,851 INFO [http-nio-8080-exec-3] org.pih.warehouse.core.UserService: Is role ROLE_PRODUCT_NOTIFICATION in [ROLE_ADMIN, ROLE_SUPERUSER, ROLE_AUTHENTICATED, ROLE_MANAGER, ROLE_ASSISTANT, ROLE_BROWSER] = false
Very weird. Thanks for posting the stacktrace and screenshot.
The reason I asked for those is because the error from the original post was caused by using the Quickstart Guide (i.e. executing the WAR file with an embedded Tomcat instance). We haven’t had a chance to resolve that issue, so we just discourage people from using the Quickstart approach for now.
Based on the fact that you used the main installation docs (your logs appear to confirm that), the issue that you’re experiencing …
2025-05-29 14:05:36,746 ERROR [http-nio-8080-exec-10] o.g.web.errors.GrailsExceptionResolver: NullPointerException occurred when processing request: [GET] /openboxes/api/localizations
Cannot get property 'inputStream' on null object. Stacktrace follows:
java.lang.NullPointerException: Cannot get property 'inputStream' on null object
at org.pih.warehouse.core.LocalizationService.getMessagesProperties(LocalizationService.groovy:73)
at org.pih.warehouse.api.LocalizationApiController.list(LocalizationApiController.groovy:34)
… is probably a file permission issue.
I would check your Tomcat directory to ensure that all subdirectories and files are owned by the tomcat user.
In fact now I’m almost positive that’s the issue since I was able to reproduce the issue by changing the owner of all files under the openboxes webapp.
chown -R root:root /opt/tomcat/webapps/openboxes
You should be able to fix the issue by changing ownership to the Tomcat user.
chown -R tomcat:tomcat /opt/tomcat/webapps/openboxes
Hi @jmiranda thanks for prompt response and sorry for the delay, I’ve managed to check permissions and even reinstalled the application still the error persists. check the evidence below.
Hi Irzelindo,
Try the following and revert:
Stop the tomcat service. Delete the Openboxes directory under webapps directory and start the tomcat service again.
If you have changed your locale, perhaps the specific file for your locale is not available in the directory /opt/tomcat/webapps/openboxes/WEB-INF/classes/
You can download it from github or copy one of the existing “messages_.properties” in that folder and rename it accordingly to your locale.
Stop and start tomcat and check your logs again. This will get rid of the error but you need to update the file with your language.
openboxes-config.properties
openboxes-config.groovy
application.properties
openboxes.yml
Oooh that’s a great idea @Gideon. Thanks for sharing.
@irzelindo Just because the parent is owned by the tomcat doesn’t necessarily mean the underlying files are as well. So just double check that all of the i18n properties files are owened by tomcat.
root@vvgtest:~# ls -al /opt/tomcat/webapps/openboxes/WEB-INF/classes/messages*.properties
-rw-r----- 1 tomcat tomcat 266856 Jun 2 12:38 /opt/tomcat/webapps/openboxes/WEB-INF/classes/messages.properties
-rw-r----- 1 tomcat tomcat 287008 Jun 2 12:38 /opt/tomcat/webapps/openboxes/WEB-INF/classes/messages_ach.properties
-rw-r----- 1 tomcat tomcat 280506 Jun 2 12:38 /opt/tomcat/webapps/openboxes/WEB-INF/classes/messages_ar.properties
-rw-r----- 1 tomcat tomcat 264826 Jun 2 12:38 /opt/tomcat/webapps/openboxes/WEB-INF/classes/messages_cs.properties
-rw-r----- 1 tomcat tomcat 263160 Jun 2 12:38 /opt/tomcat/webapps/openboxes/WEB-INF/classes/messages_de.properties
-rw-r----- 1 tomcat tomcat 286463 Jun 2 12:38 /opt/tomcat/webapps/openboxes/WEB-INF/classes/messages_es.properties
-rw-r----- 1 tomcat tomcat 256 Jun 2 12:38 /opt/tomcat/webapps/openboxes/WEB-INF/classes/messages_es_MX.properties
-rw-r----- 1 tomcat tomcat 263160 Jun 2 12:38 /opt/tomcat/webapps/openboxes/WEB-INF/classes/messages_fi.properties
-rw-r----- 1 tomcat tomcat 290351 Jun 2 12:38 /opt/tomcat/webapps/openboxes/WEB-INF/classes/messages_fr.properties
-rw-r----- 1 tomcat tomcat 263381 Jun 2 12:38 /opt/tomcat/webapps/openboxes/WEB-INF/classes/messages_ht.properties
-rw-r----- 1 tomcat tomcat 263160 Jun 2 12:38 /opt/tomcat/webapps/openboxes/WEB-INF/classes/messages_it.properties
-rw-r----- 1 tomcat tomcat 268725 Jun 2 12:38 /opt/tomcat/webapps/openboxes/WEB-INF/classes/messages_nl.properties
-rw-r----- 1 tomcat tomcat 264165 Jun 2 12:38 /opt/tomcat/webapps/openboxes/WEB-INF/classes/messages_pt.properties
-rw-r----- 1 tomcat tomcat 263160 Jun 2 12:38 /opt/tomcat/webapps/openboxes/WEB-INF/classes/messages_rw.properties
-rw-r----- 1 tomcat tomcat 263160 Jun 2 12:38 /opt/tomcat/webapps/openboxes/WEB-INF/classes/messages_sw.properties
-rw-r----- 1 tomcat tomcat 264653 Jun 2 12:38 /opt/tomcat/webapps/openboxes/WEB-INF/classes/messages_zh.properties
Thanks for your suggestion @Gideon, I checked the i18n files