升级NetSuite WSDL至2019.1+后调用WebServices报HTTP 410错误
NetSuite 2023.1 Web服务升级后HTTP 410 Gone错误解决
问题描述
使用org.apache.cxf的wsdl2java Maven工具生成NetSuite 2023.1版本的客户端代码,从2018.1版本升级后,执行搜索、新增、查询等任意操作时,服务器返回HTTP 410: Gone错误。
错误栈信息
The server sent HTTP status code 410: Gone, The server sent HTTP status code 410: Gone com.sun.xml.ws.transport.http.client.HttpTransportPipe.checkStatusCode(HttpTransportPipe.java:318) com.sun.xml.ws.transport.http.client.HttpTransportPipe.createResponsePacket(HttpTransportPipe.java:260) com.sun.xml.ws.transport.http.client.HttpTransportPipe.process(HttpTransportPipe.java:218) com.sun.xml.ws.transport.http.client.HttpTransportPipe.processRequest(HttpTransportPipe.java:131) com.sun.xml.ws.transport.DeferredTransportPipe.processRequest(DeferredTransportPipe.java:82) com.sun.xml.ws.api.pipe.Fiber.__doRun(Fiber.java:1106) com.sun.xml.ws.api.pipe.Fiber._doRun(Fiber.java:1020) com.sun.xml.ws.api.pipe.Fiber.doRun(Fiber.java:989) com.sun.xml.ws.api.pipe.Fiber.runSync(Fiber.java:847) com.sun.xml.ws.client.Stub.process(Stub.java:431) com.sun.xml.ws.client.sei.SEIStub.doProcess(SEIStub.java:160) com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:78) com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:62) com.sun.xml.ws.client.sei.SEIStub.invoke(SEIStub.java:132) jdk.proxy2/jdk.proxy2.$Proxy66.search(Unknown Source)
客户端代码片段
nsService = new NetSuiteService(auth.getWebServicesUrl()); _port = nsService.getNetSuitePort(); // login header-> equivalent to confProile Binding bind = ((BindingProvider) _port).getBinding(); @SuppressWarnings("rawtypes") List<Handler> handlersList = new ArrayList<Handler>(); handlersList.add(new SOAPHandler<SOAPMessageContext>() { @Override public boolean handleMessage(SOAPMessageContext context) { try { Boolean outboundProperty = (Boolean)context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY); if (outboundProperty != null && outboundProperty) { Marshaller marshaller = JAXBContext.newInstance(Preferences.class, TokenPassport.class).createMarshaller(); SOAPEnvelope env = context.getMessage().getSOAPPart().getEnvelope(); if (CUtls.objIsNotNull(env.getHeader())) { env.getHeader().detachNode(); } SOAPHeader header = env.addHeader(); JAXBElement<TokenPassport> tokentPassportElement = objectFactory.createTokenPassport(auth.getTokenPassport()); JAXBElement<Preferences> preferenceElement = objectFactory.createPreferences(auth.getPreferences()); marshaller.marshal(preferenceElement, header); marshaller.marshal(tokentPassportElement, header); } } catch (final SOAPException e) { Logger.error("SOAPException in handler: {} +> {}", e, CEx.stackTrace(e)); } catch (JAXBException e) { Logger.error("JAXBException in handler: {} +> {}", e, CEx.stackTrace(e)); } catch (UnsupportedEncodingException e) { Logger.error("UnsupportedEncodingException in handler: {} +> {}", e, CEx.stackTrace(e)); } return true; } @Override public boolean handleFault(SOAPMessageContext context) { return false; } @Override public void close(MessageContext context) { } @Override public Set<QName> getHeaders() { return new TreeSet<QName>(); } }); bind.setHandlerChain(handlersList); BindingProvider bindingprovider = (BindingProvider) _port; String endpoint_adr = bindingprovider.getRequestContext().get(BindingProvider.ENDPOINT_ADDRESS_PROPERTY).toString(); endpoint_adr = endpoint_adr.replace("https://webservices.netsuite.com", auth.getAccountDomain()); bindingprovider.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, endpoint_adr);
解决方法
核心修复点:将客户端请求的端点地址从通用的https://webservices.netsuite.com替换为NetSuite账户专属的域名地址。
代码中已实现修复逻辑:
从BindingProvider获取默认端点地址后,通过字符串替换将通用地址替换为auth.getAccountDomain()返回的账户专属地址,再将更新后的地址重新设置到请求上下文的BindingProvider.ENDPOINT_ADDRESS_PROPERTY属性中。
内容的提问来源于stack exchange,提问作者devSouth555
相关产品推荐
相关产品推荐

