Search code examples
restputinvokeopenedgeprogress-4gl

Progress PASOE - PUT Method with invoke operation throws 500 server error


I am working with Progress PASOE technology to make REST requests but suddenly I am facing an unexpected and wierd issue.

This is the PUT method that I was using:

 @openapi.openedge.export(type="REST", useReturnValue="false",writeDataSetBeforeImage="false").
@progress.service.resourceMapping(type="REST", operation="invoke",URI="/ObtieneListaFicheros?numfic=~{numfic~}", alias="", mediaType="application/json").
METHOD PUBLIC VOID ObtieneListaFicheros( 
    INPUT numfic AS INTEGER,
    OUTPUT DATASET dsficheros ):
        
    DEFINE VARIABLE chDirectorio AS CHARACTER NO-UNDO.
    DEFINE VARIABLE chLinea AS CHARACTER NO-UNDO EXTENT 3.
    
    EMPTY TEMP-TABLE ttFICHEROS.
    
    FIND CAFISO NO-LOCK WHERE CAFISO.NUMFIC = numfic NO-ERROR.
    IF NOT AVAILABLE CAFISO THEN DO:
        MESSAGE "No existe el registro de solares".
        RETURN.
    END.
        
    chDirectorio = "P:\Juridica\Solares\" + TRIM(STRING(CAFISO.FICGEN)).
    FILE-INFO:FILE-NAME = chDirectorio.    
            
    message "FILE-INFO:FULL-PATHNAME " FILE-INFO:FULL-PATHNAME.                
            
    IF FILE-INFO:FULL-PATHNAME <> ? THEN DO:
        INPUT FROM OS-DIR(chDirectorio).
        REPEAT: 
            
            IMPORT chLinea.
            
            IF chLinea[3] <> 'F':U THEN NEXT.
            
            CREATE ttFICHEROS.
            ASSIGN ttFICHEROS.NUMFIC = CAFISO.NUMFIC
                   ttFICHEROS.FICGEN = CAFISO.FICGEN
                   ttFICHEROS.NOMBRE = chLinea[1]
                   ttFICHEROS.RUTA = chLinea[2]                       
                   iSeq         = iSeq + 1
                   ttFICHEROS.id  = STRING(iSeq)
                   ttFICHEROS.seq = iSeq.
            
        END.           
        INPUT CLOSE.                     
    END.
END METHOD.

Where P is a mapped unity which is supposed to be accesible. But, if I try to run this request with Postman I get the following answer:

Screenshot

My first attempt was to comment code lines to track where the problem lied, and literally removed everything in the method. But it still didn´t work.

So, I created a test method with nothing inside and tried again:

@openapi.openedge.export(type="REST", useReturnValue="false",writeDataSetBeforeImage="false").
 @progress.service.resourceMapping(type="REST", operation="invoke",URI="/test", alias="", mediaType="application/json").
 METHOD PUBLIC VOID test():
     
     message "I am trying to use a PUT method!".
      
 END METHOD.

And this is the result

I restarted PASOE instance (in Developer Studio) also with no success. Other methods are working properly, and I am only experiencing problems with PUT/invoke in this case, as in the past I have used this operation without problems. What am I missing? It´s really frustrating because this 500 error does not give any clue.

This are the requests:

http://localhost:7020/nynweb/rest/nynwebService/cafiso/ObtieneListaFicheros?numfic=1 http://localhost:7020/nynweb/rest/nynwebService/cafiso/test

And I am using OpenEdge 12.2 in Windows 10.

Looking into local logs, I have noticed that I do have one with an error. It is a java exception:

2021-05-26T08:19:31.615+02:00 ERROR [thd-7] o.a.c.core.StandardWrapperValve.invoke - Servlet.service() para servlet [OERestAdapter] lanzó excepción

java.lang.NullPointerException: null at com.progress.caf.cxf.jaxrs.interceptor.CafJAXRSInInterceptor.setExchangeProperties(CafJAXRSInInterceptor.java:386) at com.progress.caf.cxf.jaxrs.interceptor.CafJAXRSInInterceptor.processRequest(CafJAXRSInInterceptor.java:247) at com.progress.caf.cxf.jaxrs.interceptor.CafJAXRSInInterceptor.handleMessage(CafJAXRSInInterceptor.java:95) at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308) at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121) at org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:267) at org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:234) at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:208) at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:160) at org.apache.cxf.transport.servlet.CXFNonSpringServlet.invoke(CXFNonSpringServlet.java:216) at org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:301) at org.apache.cxf.transport.servlet.AbstractHTTPServlet.doPut(AbstractHTTPServlet.java:237) at javax.servlet.http.HttpServlet.service(HttpServlet.java:663) at org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:276) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at com.progress.appserv.adapters.rest.PingFilter.doFilter(PingFilter.java:108) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at com.progress.appserv.adapters.rest.OERestAdapterFilter.doFilter(OERestAdapterFilter.java:155) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at com.progress.appserv.oeabl.OEAblServletFilter.doFilter(OEAblServletFilter.java:72) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at ch.qos.logback.classic.selector.servlet.LoggerContextFilter.doFilter(LoggerContextFilter.java:69) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:320) at com.progress.appserv.services.security.OEClientPrincipalFilter.doFilter(OEClientPrincipalFilter.java:449) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:115) at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:90) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:126) at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:90) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:118) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) at com.progress.appserv.services.security.OEMdcFilter.doFilter(OEMdcFilter.java:276) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:158) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) at com.progress.appserv.services.security.OEAbstractAuthorizationFilter.doFilter(OEAbstractAuthorizationFilter.java:283) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) at com.progress.appserv.services.security.OERequestHeaderAuthenticationFilter.doFilter(OERequestHeaderAuthenticationFilter.java:143) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:92) at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:77) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) at com.progress.appserv.services.security.OEMdcFilter.doFilter(OEMdcFilter.java:276) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) at com.progress.appserv.services.security.OECORSFilter.doFilter(OECORSFilter.java:380) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) at com.progress.appserv.services.security.OEMdcFilter.doFilter(OEMdcFilter.java:276) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215) at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178) at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) 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:202) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) at org.apache.catalina.valves.StuckThreadDetectionValve.invoke(StuckThreadDetectionValve.java:206) at org.apache.catalina.valves.CrawlerSessionManagerValve.invoke(CrawlerSessionManagerValve.java:235) at ch.qos.logback.access.tomcat.LogbackValve.invoke(LogbackValve.java:256) at org.apache.catalina.authenticator.SingleSignOn.invoke(SingleSignOn.java:240) at org.apache.catalina.valves.RequestFilterValve.process(RequestFilterValve.java:348) at org.apache.catalina.valves.RemoteAddrValve.invoke(RemoteAddrValve.java:53) at org.apache.catalina.valves.RequestFilterValve.process(RequestFilterValve.java:348) at org.apache.catalina.valves.RemoteHostValve.invoke(RemoteHostValve.java:51) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:367) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:860) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1598) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.base/java.lang.Thread.run(Thread.java:834)

I cannot understand what this error means...

I will appreciate any help, as I am really stuck.

Regards!


Solution

  • Finally I managed to work this out. I am posting it here to help anyone else that could have the same problem.

    It seemed to be related to the adapters created in Production during the deploy process (located in PASOEContent\WEB-INF\adapters\rest). When I did this deploy, I probably included a business entity for table "extcli", which was not in the project anymore. So, I undeployed the application and deployed again with a new generated .war file from Developer Studio. This new file didn´t reference to a adapters that doesn´t exist, and that seemed to be enough.