Невозможно обновить 2 домена одновременно в quickbook через QBWC

Мне нужно сразу обновить клиента и поставщика в Quickbook, но я получил ошибку.

// Вот мой код

package com.company.product.wsai.qb.ws.endpoint;

import java.io.StringWriter;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.ws.server.endpoint.annotation.Endpoint;
import org.springframework.ws.server.endpoint.annotation.PayloadRoot;
import org.springframework.ws.server.endpoint.annotation.RequestPayload;
import org.springframework.ws.server.endpoint.annotation.ResponsePayload;

import com.intuit.developer.SendRequestXML;
import com.intuit.developer.SendRequestXMLResponse;
import com.intuit.quickbooks.CurrencyAdd;
import com.intuit.quickbooks.CurrencyAddRqType;
import com.intuit.quickbooks.CustomerAdd;
import com.intuit.quickbooks.CustomerAddRqType;
import com.intuit.quickbooks.CustomerTypeAdd;
import com.intuit.quickbooks.CustomerTypeAddRqType;
import com.intuit.quickbooks.VendorAdd;
import com.intuit.quickbooks.QBXML;
import com.intuit.quickbooks.QBXMLMsgsRq;
import com.intuit.quickbooks.VendorAddRqType;
import com.company.product.wsai.qb.ws.conf.XmlConfig;
import com.company.product.wsai.qb.ws.util.XmlLogManager;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;

@Endpoint
public class SendRequestXMLEndpoint {

    // xml logging
    private static final String SEND_REQUEST_XML = "sendRequestXML";
    private static final String SEND_REQUEST_XML_RESPONSE = "sendRequestXMLResponse";

    @Autowired
    com.intuit.developer.ObjectFactory wsObjectFactory;

    @Autowired
    com.intuit.quickbooks.ObjectFactory qbObjectFactory;

    @PayloadRoot(localPart = "sendRequestXML", namespace = XmlConfig.QB_WC_NAMESPACE)
    @ResponsePayload
    public SendRequestXMLResponse sendRequestXML(@RequestPayload SendRequestXML sendRequestXML) {

        String sessionTicket = sendRequestXML.getTicket();
        String strCompanyFileName = sendRequestXML.getStrCompanyFileName();

        // log request
        XmlLogManager.logSendRequestXMLEnpoint(sendRequestXML, SEND_REQUEST_XML, sessionTicket);

        SendRequestXMLResponse sendRequestXMLResponse = wsObjectFactory.createSendRequestXMLResponse();
        //SendRequestXMLResponse sendRequestXMLResponseforCurrency = wsObjectFactory.createSendRequestXMLResponse();


        sendRequestXMLResponse.setSendRequestXMLResult(getCustomer());

        // log response
        XmlLogManager.logSendRequestXMLEnpoint(sendRequestXMLResponse, SEND_REQUEST_XML_RESPONSE, sessionTicket);

        return sendRequestXMLResponse;
    }


    @PayloadRoot(localPart = "sendRequestXML", namespace = XmlConfig.QB_WC_NAMESPACE)
    @ResponsePayload
    public SendRequestXMLResponse sendRequestXMLforVendor(@RequestPayload SendRequestXML sendRequestXML) {

        String sessionTicket = sendRequestXML.getTicket();
        String strCompanyFileName = sendRequestXML.getStrCompanyFileName();

        // log request
        XmlLogManager.logSendRequestXMLEnpoint(sendRequestXML, SEND_REQUEST_XML, sessionTicket);

        SendRequestXMLResponse sendRequestXMLResponseforVendor = wsObjectFactory.createSendRequestXMLResponse();


        sendRequestXMLResponseforVendor.setSendRequestXMLResult(getVendor());

        // log response
        XmlLogManager.logSendRequestXMLEnpoint(sendRequestXMLResponseforVendor, SEND_REQUEST_XML_RESPONSE, sessionTicket);

        return sendRequestXMLResponseforVendor;
    }


    private String getCustomer() {

        StringWriter stringWriter = new StringWriter();
        stringWriter.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
        stringWriter.append("<?qbxml version=\"13.0\"?>");

        try {

            CustomerAdd customerAdd = qbObjectFactory.createCustomerAdd();
            customerAdd.setName("ZZhhaarraa");
            customerAdd.setFirstName("Zhara");
            customerAdd.setLastName("User");

            CustomerAddRqType customerAddRqType = qbObjectFactory.createCustomerAddRqType();
            customerAddRqType.setCustomerAdd(customerAdd);
            customerAddRqType.setRequestID("1");

            QBXMLMsgsRq qbxmlMsgsRq = qbObjectFactory.createQBXMLMsgsRq();
            qbxmlMsgsRq.setOnError("stopOnError");
            qbxmlMsgsRq.getHostQueryRqOrCompanyQueryRqOrAccountAddRq().add(customerAddRqType);

            QBXML qbxml = qbObjectFactory.createQBXML();
            qbxml.setQBXMLMsgsRq(qbxmlMsgsRq);

            JAXBContext jaxbContext = JAXBContext.newInstance(QBXML.class);
            Marshaller marshaller = jaxbContext.createMarshaller();
            marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
            marshaller.marshal(qbxml, stringWriter);

        } catch (JAXBException e) {
            e.printStackTrace();
        }

        return stringWriter.toString();
    }

    private String getVendor() {

        StringWriter stringWriter = new StringWriter();
        stringWriter.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
        stringWriter.append("<?qbxml version=\"13.0\"?>");

        try {

            VendorAdd vendorAdd = qbObjectFactory.createVendorAdd();
            vendorAdd.setName("TEST4");
            vendorAdd.setCompanyName("ABC45 PVT LTD");
            vendorAdd.setEmail("[email protected]");
            vendorAdd.setNotes("Test Description2");
            vendorAdd.setFirstName("Miketr");
            vendorAdd.setLastName("Da");



            VendorAddRqType vendorAddRqType = qbObjectFactory.createVendorAddRqType();
            vendorAddRqType.setVendorAdd(vendorAdd);
            vendorAddRqType.setRequestID("2");

            QBXMLMsgsRq qbxmlMsgsRq = qbObjectFactory.createQBXMLMsgsRq();
            qbxmlMsgsRq.setOnError("stopOnError");
            qbxmlMsgsRq.getHostQueryRqOrCompanyQueryRqOrCompanyActivityQueryRq().add(vendorAddRqType);

            QBXML qbxml = qbObjectFactory.createQBXML();
            qbxml.setQBXMLMsgsRq(qbxmlMsgsRq);

            JAXBContext jaxbContext = JAXBContext.newInstance(QBXML.class);
            Marshaller marshaller = jaxbContext.createMarshaller();
            marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
            marshaller.marshal(qbxml, stringWriter);



        } catch (JAXBException e) {
            e.printStackTrace();
        }

        return stringWriter.toString();


    }
}

// это моя трассировка стека ошибки

Версия: не предоставляется службой

Сообщение: Ошибка аутентификации

Описание: QBWC1012: Ошибка аутентификации из-за следующего сообщения об ошибке. Клиент обнаружил тип содержимого ответа 'text / html; charset = utf-8', но ожидал 'text / xml'.

Запрос не выполнен с сообщением об ошибке:

Apache Tomcat/7.0.47 - Error report

Статус HTTP 500 - Servlet.init () для сервлета сгенерировал исключение

type Exception report

сообщение Servlet.init () для сервлета вызвало исключение

описание Сервер обнаружил внутреннюю ошибку, которая помешала ему выполнить этот запрос.

exception

javax.servlet.ServletException: Servlet.init() for servlet ws threw exception
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
    org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041)
    org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603)
    org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
    java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
    java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    java.lang.Thread.run(Unknown Source)

root cause

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.ws.server.endpoint.mapping.PayloadRootAnnotationMethodEndpointMapping#0': Initialization of bean failed; nested exception is org.springframework.context.ApplicationContextException: Cannot map endpoint [public com.intuit.developer.SendRequestXMLResponse com.company.product.wsai.qb.ws.endpoint.SendRequestXMLEndpoint.sendRequestXMLforVendor(com.intuit.developer.SendRequestXML)] on registration key [{http://developer.intuit.com/}sendRequestXML]: there's already endpoint [public com.intuit.developer.SendRequestXMLResponse com.company.product.wsai.qb.ws.endpoint.SendRequestXMLEndpoint.sendRequestXML(com.intuit.developer.SendRequestXML)] mapped
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:547)
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475)
    org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:304)
    org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
    org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:300)
    org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195)
    org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:703)
    org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:760)
    org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482)
    org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:658)
    org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:624)
    org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:672)
    org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:543)
    org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:484)
    org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136)
    javax.servlet.GenericServlet.init(GenericServlet.java:160)
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
    org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041)
    org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603)
    org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
    java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
    java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    java.lang.Thread.run(Unknown Source)

root cause

org.springframework.context.ApplicationContextException: Cannot map endpoint [public com.intuit.developer.SendRequestXMLResponse com.company.product.wsai.qb.ws.endpoint.SendRequestXMLEndpoint.sendRequestXMLforVendor(com.intuit.developer.SendRequestXML)] on registration key [{http://developer.intuit.com/}sendRequestXML]: there's already endpoint [public com.intuit.developer.SendRequestXMLResponse com.company.product.wsai.qb.ws.endpoint.SendRequestXMLEndpoint.sendRequestXML(com.intuit.developer.SendRequestXML)] mapped
    org.springframework.ws.server.endpoint.mapping.AbstractMethodEndpointMapping.registerEndpoint(AbstractMethodEndpointMapping.java:97)
    org.springframework.ws.server.endpoint.mapping.AbstractMethodEndpointMapping.registerMethods(AbstractMethodEndpointMapping.java:150)
    org.springframework.ws.server.endpoint.mapping.AbstractAnnotationMethodEndpointMapping.initApplicationContext(AbstractAnnotationMethodEndpointMapping.java:72)
    org.springframework.context.support.ApplicationObjectSupport.initApplicationContext(ApplicationObjectSupport.java:120)
    org.springframework.context.support.ApplicationObjectSupport.setApplicationContext(ApplicationObjectSupport.java:74)
    org.springframework.context.support.ApplicationContextAwareProcessor.invokeAwareInterfaces(ApplicationContextAwareProcessor.java:119)
    org.springframework.context.support.ApplicationContextAwareProcessor.postProcessBeforeInitialization(ApplicationContextAwareProcessor.java:94)
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:407)
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1545)
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:539)
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475)
    org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:304)
    org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
    org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:300)
    org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195)
    org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:703)
    org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:760)
    org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482)
    org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:658)
    org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:624)
    org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:672)
    org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:543)
    org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:484)
    org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136)
    javax.servlet.GenericServlet.init(GenericServlet.java:160)
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
    org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041)
    org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603)
    org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
    java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
    java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    java.lang.Thread.run(Unknown Source)

примечание Полная трассировка стека основной причины доступна в журналах Apache Tomcat / 7.0.47.

Apache Tomcat / 7.0.47

--. See QWCLog for more details. Remember to turn logging on.


person Yasa    schedule 04.06.2014    source источник


Ответы (1)


Мне кажется, вы сопоставляете одну и ту же конечную точку дважды:

уже существует конечная точка [public com.intuit.developer.SendRequestXMLResponse com.company.product.wsai.qb.ws.endpoint.SendRequestXMLEndpoint.sendRequestXML (com.intuit.developer.SendRequestXML)] сопоставлена

Однажды здесь:

 @PayloadRoot(localPart = "sendRequestXML", namespace = XmlConfig.QB_WC_NAMESPACE)
    @ResponsePayload
    public SendRequestXMLResponse sendRequestXML(@RequestPayload SendRequestXML sendRequestXML) {

И однажды здесь:

@PayloadRoot(localPart = "sendRequestXML", namespace = XmlConfig.QB_WC_NAMESPACE)
@ResponsePayload
public SendRequestXMLResponse sendRequestXMLforVendor(@RequestPayload SendRequestXML sendRequestXML) {

На самом деле нет смысла отображать конечную точку SOAP дважды. Как любой клиент SOAP определит, какую конечную точку следует вызывать?

У вас должна быть одна конечная точка. Затем эта одна конечная точка может вызывать другие методы для генерации либо CustomerAdd запроса, либо VendorAdd запроса (или обоих из них, объединенных в один документ qbXML, если вы хотите).

person Keith Palmer Jr.    schedule 04.06.2014