<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title>Answers to: Can not add @Provider to handle an specific exception for rest api</title><link>https://answers.axonivy.com/questions/4452/can-not-add-provider-to-handle-an-specific-exception-for-rest-api</link><description>&lt;p&gt;hi all,&lt;/p&gt;
&lt;p&gt;I'm creating a rest API for one application. It's working now. I would like to handle some specific exceptions and to return some specific data responses. I used &lt;strong&gt;@Provider&lt;/strong&gt; from &lt;strong&gt;javax.ws.rs.ext.Provider&lt;/strong&gt; to handle it, but I got an error 500.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider;
import ch.axonivy.fintech.export.dossier.exception.RecordNotFoundException;
import ch.axonivy.fintech.export.dossier.response.ExportingErrorResponse;

@Provider
public class RecordNotFoundExceptionMapper implements ExceptionMapper&amp;lt;RecordNotFoundException&amp;gt; {

    @Override
    public Response toResponse(RecordNotFoundException ex) {
        ExportingErrorResponse response = new ExportingErrorResponse();
        response.setStatusCode(Status.NOT_FOUND.getStatusCode());
        response.setErrorMessage(ex.getMessage());

        return Response.status(response.getStatusCode()).entity(response).type(MediaType.APPLICATION_JSON).build();
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The following is error:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;14:59:41.299 WARN [ch.ivyteam.bus.internal] [Worker-45] [executionContext=SYSTEM] 
  Error occured: 
    java.lang.NullPointerException
        at org.glassfish.jersey.server.ResourceBag$Builder.registerModel(ResourceBag.java:116)
        at org.glassfish.jersey.server.ResourceBag$Builder.registerProgrammaticResource(ResourceBag.java:110)
        at org.glassfish.jersey.server.ApplicationHandler.initialize(ApplicationHandler.java:459)
        at org.glassfish.jersey.server.ApplicationHandler.access$500(ApplicationHandler.java:184)
        at org.glassfish.jersey.server.ApplicationHandler$3.call(ApplicationHandler.java:350)
        at org.glassfish.jersey.server.ApplicationHandler$3.call(ApplicationHandler.java:347)
        at org.glassfish.jersey.internal.Errors.process(Errors.java:315)
        at org.glassfish.jersey.internal.Errors.process(Errors.java:297)
        at org.glassfish.jersey.internal.Errors.processWithException(Errors.java:255)
        at org.glassfish.jersey.server.ApplicationHandler.&amp;lt;init&amp;gt;(ApplicationHandler.java:347)
        at org.glassfish.jersey.servlet.WebComponent.&amp;lt;init&amp;gt;(WebComponent.java:392)
        at org.glassfish.jersey.servlet.ServletContainer.reload(ServletContainer.java:681)
        at ch.ivyteam.ivy.webserver.internal.rest.RestLifecycleListener.reloadInContext(RestLifecycleListener.java:62)
        at ch.ivyteam.ivy.webserver.internal.rest.RestLifecycleListener.reload(RestLifecycleListener.java:47)
        at ch.ivyteam.ivy.webserver.internal.rest.RestLifecycleListener.handleDeprectatedClassLoader(RestLifecycleListener.java:40)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at net.engio.mbassy.dispatch.ReflectiveHandlerInvocation.invoke(ReflectiveHandlerInvocation.java:29)
        at net.engio.mbassy.dispatch.MessageDispatcher.dispatch(MessageDispatcher.java:30)
        at net.engio.mbassy.dispatch.FilteredMessageDispatcher.dispatch(FilteredMessageDispatcher.java:42)
        at net.engio.mbassy.subscription.Subscription.publish(Subscription.java:72)
        at net.engio.mbassy.bus.MessagePublication.execute(MessagePublication.java:49)
        at net.engio.mbassy.bus.MBassador.publish(MBassador.java:66)
        at ch.ivyteam.bus.internal.EventBus.publish(EventBus.java:30)
        at ch.ivyteam.ivy.java.internal.ClassLoaderHolder.deprecateClassLoaderInternal(ClassLoaderHolder.java:349)
        at ch.ivyteam.ivy.java.internal.ClassLoaderHolder.deprecateClassLoader(ClassLoaderHolder.java:323)
        at ch.ivyteam.ivy.java.internal.ClassLoaderHolder.reinstantiateClassLoader(ClassLoaderHolder.java:299)
        at ch.ivyteam.ivy.java.internal.ClassloaderReinstatiateCompilationParticipant.reinstatiateProjectClassloader(ClassloaderReinstatiateCompilationParticipant.java:82)
        at ch.ivyteam.ivy.java.internal.ClassloaderReinstatiateCompilationParticipant.buildFinished(ClassloaderReinstatiateCompilationParticipant.java:70)
        at org.eclipse.jdt.internal.core.builder.JavaBuilder.build(JavaBuilder.java:235)
        at org.eclipse.core.internal.events.BuildManager$2.run(BuildManager.java:734)
        at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
        at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:206)
        at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:246)
        at org.eclipse.core.internal.events.BuildManager$1.run(BuildManager.java:299)
        at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
        at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:302)
        at org.eclipse.core.internal.events.BuildManager.basicBuildLoop(BuildManager.java:358)
        at org.eclipse.core.internal.events.BuildManager.build(BuildManager.java:381)
        at org.eclipse.core.internal.events.AutoBuildJob.doBuild(AutoBuildJob.java:143)
        at org.eclipse.core.internal.events.AutoBuildJob.run(AutoBuildJob.java:241)
        at org.eclipse.core.internal.jobs.Worker.run(Worker.java:54)
15:41:38.174 ERROR [org.apache.catalina.core.ContainerBase.[ivy].[localhost].[/ivy].[org.glassfish.jersey.servlet.ServletContainer]] [http-nio-8081-exec-1] [requestId=2832] 
  Servlet.service() for servlet [org.glassfish.jersey.servlet.ServletContainer] in context with path [/ivy] threw exception [java.lang.IllegalStateException: Request scope has been already shut down.] with root cause
    java.lang.IllegalStateException: Request scope has been already shut down.
        at jersey.repackaged.com.google.common.base.Preconditions.checkState(Preconditions.java:173)
        at org.glassfish.jersey.process.internal.RequestScope.retrieveCurrent(RequestScope.java:239)
        at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:314)
        at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:305)
        at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1154)
        at org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:473)
        at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:427)
        at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:388)
        at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:341)
        at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:228)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at ch.ivyteam.ivy.webserver.internal.IvyFilter.doFilterInternal(IvyFilter.java:247)
        at ch.ivyteam.ivy.webserver.internal.IvyFilter.doFilter(IvyFilter.java:152)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at ch.ivyteam.ivy.webserver.internal.IvyExecuteAsSystemFilter$1.call(IvyExecuteAsSystemFilter.java:45)
        at ch.ivyteam.ivy.webserver.internal.IvyExecuteAsSystemFilter$1.call(IvyExecuteAsSystemFilter.java:1)
        at ch.ivyteam.ivy.security.internal.SecurityManager.executeAsSystem(SecurityManager.java:1310)
        at ch.ivyteam.ivy.webserver.internal.IvyExecuteAsSystemFilter.doFilter(IvyExecuteAsSystemFilter.java:39)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.apache.catalina.filters.HttpHeaderSecurityFilter.doFilter(HttpHeaderSecurityFilter.java:124)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at ch.ivyteam.ivy.webserver.internal.startup.IvyEngineUnavailableFilter.doFilter(IvyEngineUnavailableFilter.java:48)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at ch.ivyteam.ivy.webserver.internal.filter.IvyCurrentHttpRequestFilter.doFilter(IvyCurrentHttpRequestFilter.java:39)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at com.google.inject.servlet.ManagedFilterPipeline.dispatch(ManagedFilterPipeline.java:120)
        at com.google.inject.servlet.GuiceFilter.doFilter(GuiceFilter.java:135)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:478)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:80)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
        at ch.ivyteam.ivy.webserver.internal.PerformanceLogValve.invoke(PerformanceLogValve.java:55)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
        at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:799)
        at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
        at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1457)
        at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
        at java.lang.Thread.run(Thread.java:748)
15:41:38.325 ERROR [org.apache.myfaces.application.ApplicationImpl] [http-nio-8081-exec-1] [requestId=2832] 
  Could not instantiate component componentType = guiEventListenerComponent
    [errorId=170D30E5B15459D4, requestId=2832]
    ch.ivyteam.ivy.environment.EnvironmentNotAvailableException: Access to ivy environment outside a process request thread is not possible.
    Current thread: Thread[http-nio-8081-exec-1,5,main]
        at ch.ivyteam.ivy.environment.Ivy.getIvy(Ivy.java:577)
        at ch.ivyteam.ivy.environment.Ivy.getEnvironmentData(Ivy.java:556)
        at ch.ivyteam.ivy.environment.Ivy.getEnvironmentData(Ivy.java:551)
        at ch.ivyteam.ivy.environment.Ivy.request(Ivy.java:244)
        at ch.axonivy.fintech.guiframework.component.GuiEventListenerFactoryServiceProvider.getProjectClassLoader(GuiEventListenerFactoryServiceProvider.java:67)
        at ch.axonivy.fintech.guiframework.component.GuiEventListenerFactoryServiceProvider.getFactory(GuiEventListenerFactoryServiceProvider.java:32)
        at ch.axonivy.fintech.guiframework.component.GuiEventListenerComponent.&amp;lt;init&amp;gt;(GuiEventListenerComponent.java:46)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
        at java.lang.Class.newInstance(Class.java:442)
        at org.apache.myfaces.application.ApplicationImpl.createComponent(ApplicationImpl.java:1469)
        at javax.faces.application.ApplicationWrapper.createComponent(ApplicationWrapper.java:129)
        at org.apache.myfaces.view.facelets.compiler.FaceletsCompilerSupport.loadLibraries(FaceletsCompilerSupport.java:141)
        at org.apache.myfaces.view.facelets.FaceletViewDeclarationLanguage.loadLibraries(FaceletViewDeclarationLanguage.java:2526)
        at org.apache.myfaces.view.facelets.FaceletViewDeclarationLanguage.createCompiler(FaceletViewDeclarationLanguage.java:2172)
        at org.apache.myfaces.view.facelets.FaceletViewDeclarationLanguage.initialize(FaceletViewDeclarationLanguage.java:2464)
        at org.apache.myfaces.view.facelets.FaceletViewDeclarationLanguage.&amp;lt;init&amp;gt;(FaceletViewDeclarationLanguage.java:309)
        at org.apache.myfaces.view.facelets.FaceletViewDeclarationLanguageStrategy.&amp;lt;init&amp;gt;(FaceletViewDeclarationLanguageStrategy.java:52)
        at org.apache.myfaces.view.ViewDeclarationLanguageFactoryImpl.initialize(ViewDeclarationLanguageFactoryImpl.java:104)
        at org.apache.myfaces.view.ViewDeclarationLanguageFactoryImpl.getViewDeclarationLanguage(ViewDeclarationLanguageFactoryImpl.java:73)
        at org.apache.myfaces.application.ViewHandlerImpl.getViewDeclarationLanguage(ViewHandlerImpl.java:183)
        at javax.faces.application.ViewHandlerWrapper.getViewDeclarationLanguage(ViewHandlerWrapper.java:133)
        at org.apache.myfaces.shared.application.DefaultViewHandlerSupport.checkResourceExists(DefaultViewHandlerSupport.java:569)
        at org.apache.myfaces.shared.application.DefaultViewHandlerSupport.handleSuffixMapping(DefaultViewHandlerSupport.java:507)
        at org.apache.myfaces.shared.application.DefaultViewHandlerSupport.calculateViewId(DefaultViewHandlerSupport.java:113)
        at org.apache.myfaces.application.ViewHandlerImpl.deriveLogicalViewId(ViewHandlerImpl.java:122)
        at javax.faces.application.ViewHandlerWrapper.deriveLogicalViewId(ViewHandlerWrapper.java:112)
        at org.apache.myfaces.lifecycle.RestoreViewExecutor.execute(RestoreViewExecutor.java:225)
        at org.apache.myfaces.lifecycle.LifecycleImpl.executePhase(LifecycleImpl.java:196)
        at org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:143)
        at javax.faces.webapp.FacesServlet.service(FacesServlet.java:198)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:728)
        at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:469)
        at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:392)
        at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:311)
        at org.apache.catalina.core.StandardHostValve.custom(StandardHostValve.java:395)
        at org.apache.catalina.core.StandardHostValve.status(StandardHostValve.java:254)
        at org.apache.catalina.core.StandardHostValve.throwable(StandardHostValve.java:349)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:175)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:80)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
        at ch.ivyteam.ivy.webserver.internal.PerformanceLogValve.invoke(PerformanceLogValve.java:55)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
        at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:799)
        at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
        at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1457)
        at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
        at java.lang.Thread.run(Thread.java:748)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;P/s: I’m using Axon Ivy 7.0.11&lt;/p&gt;
&lt;p&gt;Could you please give me some suggestions or any hints to overcome this issue?
Thank you!&lt;/p&gt;</description><atom:link href="https://answers.axonivy.com/questions/4452/can-not-add-provider-to-handle-an-specific-exception-for-rest-api" rel="self"></atom:link><language>en</language><lastBuildDate>Mon, 16 Mar 2020 09:28:01 -0400</lastBuildDate><item><title>Answer by Andreas Rusch</title><link>https://answers.axonivy.com/questions/4452/can-not-add-provider-to-handle-an-specific-exception-for-rest-api/4453</link><description>&lt;p&gt;Hi&lt;/p&gt;
&lt;p&gt;We added support for @Provider for Ivy projects with version 7.0.13.&lt;/p&gt;
&lt;p&gt;If you can't upgrade I would say your only other option is to add a try-catch to each API and handle the conversion there, probably in a general ExceptionHandler class. The try-catch could be handled in a Lambda expression:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;@GET
@Path("/{entryNo}")
@Produces(MediaType.APPLICATION_JSON)
public Response getPerson(@PathParam("entryNo") int entryNo) {
  return ErrorHandler.withExceptionHandling( () -&amp;gt; {
      UUID personId = new ArrayList&amp;lt;&amp;gt;(persons.keySet()).get(entryNo);
      return Response.status(Status.OK)
              .entity(persons.get(personId))
              .build();
  });
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And with ErrorHandler:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;public class ErrorHandler {
  public static Response withExceptionHandling(Callable&amp;lt;Response&amp;gt; restCall) {
      try {
        return restCall.call();
      }
      catch (RecordNotFoundException ex)
      {
        ExportingErrorResponse response = new ExportingErrorResponse(Status.NOT_FOUND, ex.getMessage());
        return Response.status(response.getStatusCode()).entity(response).type(MediaType.APPLICATION_JSON).build();
      } catch (Exception e) {
        return Response.status(Status.INTERNAL_SERVER_ERROR).build();
    }    
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Or something like that.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Andreas Rusch</dc:creator><pubDate>Mon, 16 Mar 2020 09:28:01 -0400</pubDate><guid>https://answers.axonivy.com/questions/4452/can-not-add-provider-to-handle-an-specific-exception-for-rest-api/4453</guid></item></channel></rss>