Search code examples
javasoapintegrationnetsuitewsdl2java

NetSuite Webservices returning The server sent HTTP status code 410 when updating wsdl to 2019.1 and higher


I'm using the org.apache.cxf wsdl2java maven tool for netsuite wsdl 2023.1. I'm updating from 2018.1. When I try to use the client to perform any action (search, add, get, etc.) the 410 error is returned. In my stack trace, as soon as I try to send a soap request the following is returned:

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);


SOLVED:

I had to update the endpoint address to be account specific also. I updated the code to reflect the change made to fix the issue.


Solution

  • I had to update the endpoint url to get everything to work. Initially I thought when I defined the web service url to be account specific, that this also sets the endpoint to be account specific. But no, if you don't specify the account url, it defaults to use the generic data center url, which is no longer acceptable in versions 2019.1 and later. I included the code I used to update my endpoint url to be account specific.

     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);