Skip to content

NullPointerException in RoleModelConverter when editing a Resource Role created via UI #5055

@aufgussmeister

Description

@aufgussmeister

Environment

Jmix version: <2.7.4>

Bug Description

Image

A NullPointerException occurs when attempting to edit a Resource Role (Customer Admin) that was recently created or modified via the UI. The error is thrown in RoleModelConverter.initBaseParameters because the role object is null.

Interestingly, the issue disappears temporarily after a full application restart but resurfaces shortly after performing further edits or assignments in a multitenant environment.

Steps To Reproduce

Create a new Resource Role via the UI (e.g., code: customer-admin).

Add some Resource Policies (View permissions).

Assign this role to a User.

Try to open the Detail View of the newly created role to edit it.

The application throws a NullPointerException.

Database State Context:

after problem i tired to delete one role and recreate but has the same problem

"id" "version" "create_ts" "created_by" "update_ts" "updated_by" "delete_ts" "deleted_by" "name" "code" "child_roles" "sys_tenant_id" "description" "scopes"
"019c29d6-0419-716f-b5b8-a179c6365e34" 3 "2026-02-04 19:07:09.907" "admin" "2026-02-05 11:17:01.287" "admin" "2026-02-05 11:19:22.942" "admin" "Customer Admin" "customer-admin" """UI"""
"019c2d50-a18b-7c55-996d-ee50fcf11447" 2 "2026-02-05 11:23:00.016" "admin" "2026-02-05 11:48:33.07" "admin" "Customer Admin" "customer-admin" """UI"""

"id" "version" "create_ts" "created_by" "update_ts" "updated_by" "delete_ts" "deleted_by" "username" "role_code" "role_type"
"019c2d3f-65ea-7ba1-ba2f-5aec25a813af" 2 "2026-02-05 11:00:55.531" "admin" "2026-02-05 11:00:55.531" "admin.boscarato" "customer-admin" "resource"
"019c2d3f-65f1-7627-b77b-16b3ccbbce17" 1 "2026-02-05 11:00:55.537" "admin" "2026-02-05 11:00:55.537" "admin.boscarato" "ui-minimal" "resource"
"6c9e420a-2b7a-4c42-8654-a9027ee14083" 1 "admin" "system-full-access" "resource"

Additional Information:

The project uses the Multitenancy add-on.

It seems like the RoleRepository cache is not being updated correctly or loses track of the role instance after the entity is saved, leading to a mismatch between the database ID and the in-memory repository.

A restart of the application synchronizes the cache and temporarily fixes the issue.

java.lang.NullPointerException: Cannot invoke "io.jmix.security.model.BaseRole.getCustomProperties()" because "role" is null at io.jmix.security.model.RoleModelConverter.initBaseParameters(RoleModelConverter.java:74) at io.jmix.security.model.RoleModelConverter.createResourceRoleModel(RoleModelConverter.java:51) at io.jmix.securityflowui.view.resourcerole.ResourceRoleModelDetailView.initExistingEntity(ResourceRoleModelDetailView.java:131) at io.jmix.flowui.view.StandardDetailView.setupEntityToEdit(StandardDetailView.java:619) at io.jmix.flowui.view.StandardDetailView.setupEntityToEdit(StandardDetailView.java:600) at io.jmix.flowui.view.StandardDetailView.onBeforeShow(StandardDetailView.java:114) at com.vaadin.flow.component.ComponentEventBus.fireEventForListener(ComponentEventBus.java:244) at com.vaadin.flow.component.ComponentEventBus.fireEvent(ComponentEventBus.java:233) at com.vaadin.flow.component.Component.fireEvent(Component.java:422) at com.vaadin.flow.component.ComponentUtil.fireEvent(ComponentUtil.java:499) at io.jmix.flowui.view.ViewControllerUtils.fireEvent(ViewControllerUtils.java:216) at io.jmix.tabbedmode.Views.fireViewBeforeShowEvent(Views.java:800) at io.jmix.tabbedmode.Views.open(Views.java:225) at io.jmix.tabbedmode.Views.open(Views.java:191) at io.jmix.tabbedmode.builder.navigation.TabbedModeDetailViewNavigationProcessor.openView(TabbedModeDetailViewNavigationProcessor.java:47) at io.jmix.tabbedmode.builder.AbstractViewBuilder.open(AbstractViewBuilder.java:112) at io.jmix.tabbedmode.builder.navigation.TabbedModeDetailViewNavigationProcessor.processNavigation(TabbedModeDetailViewNavigationProcessor.java:43) at io.jmix.tabbedmode.builder.navigation.TabbedModeDetailViewNavigationProcessor.processNavigation(TabbedModeDetailViewNavigationProcessor.java:20) at io.jmix.flowui.view.navigation.AbstractViewNavigator.navigate(AbstractViewNavigator.java:164) at io.jmix.flowui.action.list.EditAction.navigate(EditAction.java:358) at io.jmix.flowui.action.list.EditAction.execute(EditAction.java:345) at io.jmix.flowui.action.list.ListDataComponentAction.actionPerform(ListDataComponentAction.java:163) at io.jmix.flowui.component.delegate.AbstractGridDelegate.handleDoubleClickAction(AbstractGridDelegate.java:956) at io.jmix.flowui.component.delegate.AbstractGridDelegate.onItemDoubleClick(AbstractGridDelegate.java:914) at io.jmix.flowui.component.delegate.AbstractGridDelegate$1.onComponentEvent(AbstractGridDelegate.java:171) at io.jmix.flowui.component.delegate.AbstractGridDelegate$1.onComponentEvent(AbstractGridDelegate.java:167) at com.vaadin.flow.component.ComponentEventBus.fireEventForListener(ComponentEventBus.java:244) at com.vaadin.flow.component.ComponentEventBus.handleDomEvent(ComponentEventBus.java:501) at com.vaadin.flow.component.ComponentEventBus.lambda$addDomTrigger$dd1b7957$1(ComponentEventBus.java:303) at com.vaadin.flow.internal.nodefeature.ElementListenerMap.lambda$fireEvent$2(ElementListenerMap.java:503) at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) at com.vaadin.flow.internal.nodefeature.ElementListenerMap.fireEvent(ElementListenerMap.java:503) at com.vaadin.flow.server.communication.rpc.EventRpcHandler.handleNode(EventRpcHandler.java:62) at com.vaadin.flow.server.communication.rpc.AbstractRpcInvocationHandler.handle(AbstractRpcInvocationHandler.java:79) at com.vaadin.flow.server.communication.ServerRpcHandler.handleInvocationData(ServerRpcHandler.java:568) at com.vaadin.flow.server.communication.ServerRpcHandler.lambda$handleInvocations$6(ServerRpcHandler.java:549) at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) at com.vaadin.flow.server.communication.ServerRpcHandler.handleInvocations(ServerRpcHandler.java:549) at com.vaadin.flow.server.communication.ServerRpcHandler.handleRpc(ServerRpcHandler.java:376) at com.vaadin.flow.server.communication.UidlRequestHandler.synchronizedHandleRequest(UidlRequestHandler.java:136) at com.vaadin.flow.server.SynchronizedRequestHandler.handleRequest(SynchronizedRequestHandler.java:63) at com.vaadin.flow.server.VaadinService.handleRequest(VaadinService.java:1879) at com.vaadin.flow.server.VaadinServlet.service(VaadinServlet.java:398) at com.vaadin.flow.spring.SpringServlet.service(SpringServlet.java:106) at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:614) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:138) at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:610) at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:392) at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:321) at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:266) at org.springframework.web.servlet.mvc.ServletForwardingController.handleRequestInternal(ServletForwardingController.java:142) at org.springframework.web.servlet.mvc.AbstractController.handleRequest(AbstractController.java:178) at org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:51) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014) at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914) at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:547) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885) at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:614) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:138) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:162) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:138) at io.jmix.core.impl.logging.LogMdcFilter.doFilterInternal(LogMdcFilter.java:28) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:162) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:138) at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:108) at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:108) at org.springframework.security.web.FilterChainProxy.lambda$doFilterInternal$3(FilterChainProxy.java:231) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:365) at org.springframework.security.web.access.intercept.AuthorizationFilter.doFilter(AuthorizationFilter.java:101) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374) at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:125) at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:119) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374) at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:131) at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:85) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374) at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:100) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374) at org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter.doFilter(RememberMeAuthenticationFilter.java:114) at org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter.doFilter(RememberMeAuthenticationFilter.java:105) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374) at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:179) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374) at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374) at org.springframework.security.web.session.ConcurrentSessionFilter.doFilter(ConcurrentSessionFilter.java:151) at org.springframework.security.web.session.ConcurrentSessionFilter.doFilter(ConcurrentSessionFilter.java:129) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374) at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:235) at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:229) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374) at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:107) at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:93) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374) at org.springframework.security.web.csrf.CsrfFilter.doFilterInternal(CsrfFilter.java:117) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374) at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374) at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90) at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374) at org.springframework.security.web.context.SecurityContextHolderFilter.doFilter(SecurityContextHolderFilter.java:82) at org.springframework.security.web.context.SecurityContextHolderFilter.doFilter(SecurityContextHolderFilter.java:69) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374) at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:62) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374) at org.springframework.security.web.session.DisableEncodeUrlFilter.doFilterInternal(DisableEncodeUrlFilter.java:42) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374) at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:233) at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:191) at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113) at org.springframework.web.filter.ServletRequestPathFilter.doFilter(ServletRequestPathFilter.java:52) at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113) at org.springframework.web.filter.CompositeFilter.doFilter(CompositeFilter.java:74) at org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration$CompositeFilterChainProxy.doFilter(WebSecurityConfiguration.java:319) at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113) at org.springframework.web.servlet.handler.HandlerMappingIntrospector.lambda$createCacheFilter$4(HandlerMappingIntrospector.java:267) at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113) at org.springframework.web.filter.CompositeFilter.doFilter(CompositeFilter.java:74) at org.springframework.security.config.annotation.web.configuration.WebMvcSecurityConfiguration$CompositeFilterChainProxy.doFilter(WebMvcSecurityConfiguration.java:240) at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:362) at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:278) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:162) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:138) at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:162) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:138) at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:162) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:138) at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:162) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:138) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:165) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:88) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:113) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:83) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:72) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:399) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:903) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1774) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:973) at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:491) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63) at java.base/java.lang.Thread.run(Thread.java:840)

Metadata

Metadata

Type

No type

Projects

Status

Done

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions