进度 PASOE - 带有调用操作的 PUT 方法抛出 500 服务器错误

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

我正在使用 Progress PASOE 技术发出 REST 请求,但突然遇到了一个意想不到的奇怪问题。

这是我使用的 PUT 方法:

 @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.

其中 P 是应该可以访问的映射单元。但是,如果我尝试 运行 使用 Postman 发送此请求,我会得到以下答案:

我的第一次尝试是注释代码行以跟踪问题所在,并从字面上删除方法中的所有内容。但是还是不行。

所以,我创建了一个没有任何内容的测试方法,然后再次尝试:

@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.

我重新启动 PASOE 实例(在 Developer Studio 中)也没有成功。 其他方法都正常,我只是在这种情况下遇到 PUT/invoke 的问题,因为过去我使用这个操作没有问题。我错过了什么?这真的很令人沮丧,因为这个 500 错误没有提供任何线索。

这是请求:

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

我在 Windows 10.

中使用 OpenEdge 12.2

查看本地日志,我注意到我确实有一个错误。这是一个 java 异常:

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

我不明白这个错误是什么意思...

我将不胜感激任何帮助,因为我真的被困住了。

此致!

我终于设法解决了这个问题。我将它张贴在这里是为了帮助其他可能遇到同样问题的人。

这似乎与部署过程中在 Production 中创建的适配器有关(位于 PASOEContent\WEB-INF\adapters\rest)。当我进行此部署时,我可能包含了 table“extcli”的业务实体,该实体已不在项目中。因此,我取消部署了该应用程序并使用 Developer Studio 中新生成的 .war 文件再次部署。这个新文件没有引用不存在的适配器,这似乎就足够了。