cyber101
cyber101

Reputation: 2994

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'marshaller' defined in class

I’m trying develop SOAP web service client using spring-ws-2.2.0 & spring-boot-1.1.8 in a standalone app, but I get this error:

org.springframework.beans.factory.BeanCreationException: Error creating bean with 

name 'marshaller' defined in class pcc_load.ApexConfiguration: Invocation of init method
 failed; nested exception is org.springframework.oxm.UncategorizedMappingException:
 Unknown JAXB exception; nested exception is javax.xml.bind.JAXBException: Provider com.sun.xml.internal.bind.v2.ContextFactory could not be instantiated: 

javax.xml.bind.JAXBException: "pcc_load/src/com/company/dept/apex/stubs/ObjectFactory.java" doesnt contain ObjectFactory.class or jaxb.index
 - with linked exception:

[javax.xml.bind.JAXBException: "pcc_load/src/com/company/department/apex/stubs/ObjectFactory.java" doesnt contain ObjectFactory.class or jaxb.index]

I created all the stubs using ant & the wsdl without any error, here is the wsdl:

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns:http="http://schemas.xmlsoap.org/wsdl/http/"
    xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:s="http://www.w3.org/2001/XMLSchema"
    xmlns:s0="PCCDATA_APEX_WS" xmlns:tns1="dsws.businessobjects.com"
    targetNamespace="PCCDATA_APEX_WS" xmlns="http://schemas.xmlsoap.org/wsdl/"
    name="BIServices">
    <types>
        <s:schema elementFormDefault="qualified" targetNamespace="PCCDATA_APEX_WS">
            <s:simpleType name="Operator">
                <s:restriction base="s:string">
                    <s:enumeration value="EQUAL" />
                    <s:enumeration value="GREATER" />
                    <s:enumeration value="GREATER_OR_EQUAL" />
                    <s:enumeration value="LESS" />
                    <s:enumeration value="LESS_OR_EQUAL" />
                    <s:enumeration value="NOT_EQUAL" />
                    <s:enumeration value="INLIST" />
                    <s:enumeration value="NOT_INLIST" />
                </s:restriction>
            </s:simpleType>
            <s:complexType name="FilterCondition">
                <s:sequence>
                    <s:element name="value" type="s:string" />
                    <s:element name="operator" type="s0:Operator" />
                </s:sequence>
            </s:complexType>
            <s:complexType name="LovValueIndex">
                <s:sequence>
                    <s:element name="valueofPrompt" type="s:string" />
                    <s:element name="index" type="s:string" />
                </s:sequence>
            </s:complexType>
            <s:complexType name="DrillFilter">
                <s:sequence>
                    <s:element name="dimension" type="s:string" />
                    <s:element name="value" type="s:string" />
                    <s:element name="operator" type="s0:Operator" />
                </s:sequence>
            </s:complexType>
            <s:element name="GetReportBlock_PCCDATA_APEX_WS">
                <s:complexType>
                    <s:sequence>
                        <s:element name="login" type="s:string" minOccurs="0"
                            nillable="true" />
                        <s:element name="password" type="s:string" minOccurs="0"
                            nillable="true" />
                        <s:element name="_Business_Segment__Multiple__Optional_"
                            type="s0:LovValueIndex" minOccurs="0" maxOccurs="unbounded"
                            nillable="true" />
                        <s:element name="resetState" type="s:boolean" minOccurs="0"
                            nillable="true" />
                        <s:element name="refresh" type="s:boolean" minOccurs="0"
                            nillable="true" />
                        <s:element name="getFromLatestDocumentInstance" type="s:boolean"
                            minOccurs="0" nillable="true" />
                        <s:element name="getFromUserInstance" type="s:boolean"
                            minOccurs="0" nillable="true" />
                        <s:element name="turnOutputToVTable" type="s:boolean"
                            minOccurs="0" nillable="true" />
                        <s:element name="closeDocument" type="s:boolean"
                            minOccurs="0" nillable="true" />
                        <s:element name="startRow" type="s:int" minOccurs="0"
                            nillable="true" />
                        <s:element name="endRow" type="s:int" minOccurs="0"
                            nillable="true" />
                    </s:sequence>
                </s:complexType>
            </s:element>
            <s:simpleType name="DrillOperation">
                <s:restriction base="s:string">
                    <s:enumeration value="UP" />
                    <s:enumeration value="DOWN" />
                </s:restriction>
            </s:simpleType>
            <s:complexType name="DrillPath">
                <s:sequence>
                    <s:element name="from" type="s:string" />
                    <s:element name="value" type="s:string" />
                    <s:element name="drillOperation" type="s0:DrillOperation" />
                </s:sequence>
            </s:complexType>
            <s:element name="Drill_PCCDATA_APEX_WS">
                <s:complexType>
                    <s:sequence>
                        <s:element name="login" type="s:string" minOccurs="0"
                            nillable="true" />
                        <s:element name="password" type="s:string" minOccurs="0"
                            nillable="true" />
                        <s:element name="drillPath" type="s0:DrillPath"
                            minOccurs="0" maxOccurs="unbounded" nillable="true" />
                        <s:element name="filter" type="s0:DrillFilter"
                            minOccurs="0" maxOccurs="unbounded" nillable="true" />
                        <s:element name="_Business_Segment__Multiple__Optional_"
                            type="s0:LovValueIndex" minOccurs="0" maxOccurs="unbounded"
                            nillable="true" />
                        <s:element name="resetState" type="s:boolean" minOccurs="0"
                            nillable="true" />
                        <s:element name="refresh" type="s:boolean" minOccurs="0"
                            nillable="true" />
                        <s:element name="getFromLatestDocumentInstance" type="s:boolean"
                            minOccurs="0" nillable="true" />
                        <s:element name="getFromUserInstance" type="s:boolean"
                            minOccurs="0" nillable="true" />
                        <s:element name="turnOutputToVTable" type="s:boolean"
                            minOccurs="0" nillable="true" />
                        <s:element name="closeDocument" type="s:boolean"
                            minOccurs="0" nillable="true" />
                        <s:element name="startRow" type="s:int" minOccurs="0"
                            nillable="true" />
                        <s:element name="endRow" type="s:int" minOccurs="0"
                            nillable="true" />
                    </s:sequence>
                </s:complexType>
            </s:element>
            <s:complexType name="TRow">
                <s:sequence>
                    <s:element name="cell" type="s:anyType" maxOccurs="unbounded"
                        nillable="true" />
                </s:sequence>
            </s:complexType>
            <s:complexType name="TTable">
                <s:sequence>
                    <s:element name="row" maxOccurs="unbounded" type="s0:TRow" />
                </s:sequence>
            </s:complexType>
            <s:complexType name="THeader">
                <s:sequence>
                    <s:element name="row" maxOccurs="unbounded" type="s0:TRow" />
                </s:sequence>
            </s:complexType>
            <s:complexType name="TFooter">
                <s:sequence>
                    <s:element name="row" maxOccurs="unbounded" type="s0:TRow" />
                </s:sequence>
            </s:complexType>
            <s:element name="GetReportBlock_PCCDATA_APEX_WSResponse">
                <s:complexType>
                    <s:sequence>
                        <s:element name="table" type="s0:TTable" />
                        <s:element name="headers" type="s0:THeader" />
                        <s:element name="footers" type="s0:TFooter" />
                        <s:element name="user" type="s:string" />
                        <s:element name="documentation" type="s:string" />
                        <s:element name="documentname" type="s:string" />
                        <s:element name="lastrefreshdate" type="s:dateTime" />
                        <s:element name="creationdate" type="s:dateTime" />
                        <s:element name="creator" type="s:string" />
                        <s:element name="isScheduled" type="s:boolean" />
                        <s:element name="scheduleStartTime" type="s:dateTime" />
                        <s:element name="scheduleEndTime" type="s:dateTime" />
                        <s:element name="tableType" type="s:string" />
                        <s:element name="nbColumns" type="s:int" />
                        <s:element name="nbLines" type="s:int" />
                        <s:element name="message" type="s:string" />
                    </s:sequence>
                </s:complexType>
            </s:element>
            <s:element name="Drill_PCCDATA_APEX_WSResponse">
                <s:complexType>
                    <s:sequence>
                        <s:element name="table" type="s0:TTable" />
                        <s:element name="headers" type="s0:THeader" />
                        <s:element name="footers" type="s0:TFooter" />
                        <s:element name="user" type="s:string" />
                        <s:element name="documentation" type="s:string" />
                        <s:element name="documentname" type="s:string" />
                        <s:element name="lastrefreshdate" type="s:dateTime" />
                        <s:element name="creationdate" type="s:dateTime" />
                        <s:element name="creator" type="s:string" />
                        <s:element name="isScheduled" type="s:boolean" />
                        <s:element name="scheduleStartTime" type="s:dateTime" />
                        <s:element name="scheduleEndTime" type="s:dateTime" />
                        <s:element name="tableType" type="s:string" />
                        <s:element name="nbColumns" type="s:int" />
                        <s:element name="nbLines" type="s:int" />
                        <s:element name="message" type="s:string" />
                    </s:sequence>
                </s:complexType>
            </s:element>
            <s:element name="QaaWSHeader">
                <s:complexType>
                    <s:sequence>
                        <s:element name="sessionID" type="s:string" minOccurs="0"
                            maxOccurs="1" nillable="true" />
                        <s:element name="serializedSession" type="s:string"
                            minOccurs="0" maxOccurs="1" nillable="true" />
                        <s:element name="ClientType" type="s:string" minOccurs="0"
                            maxOccurs="1" nillable="true" />
                        <s:element name="AuditingObjectID" type="s:string"
                            minOccurs="0" maxOccurs="1" nillable="true" />
                        <s:element name="AuditingObjectName" type="s:string"
                            minOccurs="0" maxOccurs="1" nillable="true" />
                    </s:sequence>
                </s:complexType>
            </s:element>
        </s:schema>
    </types>
    <message name="GetReportBlock_PCCDATA_APEX_WSSoapIn">
        <part name="parameters" element="s0:GetReportBlock_PCCDATA_APEX_WS" />
        <part name="request_header" element="s0:QaaWSHeader" />
    </message>
    <message name="GetReportBlock_PCCDATA_APEX_WSSoapOut">
        <part name="parameters" element="s0:GetReportBlock_PCCDATA_APEX_WSResponse" />
    </message>
    <message name="Drill_PCCDATA_APEX_WSSoapIn">
        <part name="parameters" element="s0:Drill_PCCDATA_APEX_WS" />
        <part name="request_header" element="s0:QaaWSHeader" />
    </message>
    <message name="Drill_PCCDATA_APEX_WSSoapOut">
        <part name="parameters" element="s0:Drill_PCCDATA_APEX_WSResponse" />
    </message>
    <portType name="BIServicesSoap">
        <operation name="GetReportBlock_PCCDATA_APEX_WS">
            <documentation></documentation>
            <input message="s0:GetReportBlock_PCCDATA_APEX_WSSoapIn" />
            <output message="s0:GetReportBlock_PCCDATA_APEX_WSSoapOut" />
        </operation>
        <operation name="Drill_PCCDATA_APEX_WS">
            <documentation></documentation>
            <input message="s0:Drill_PCCDATA_APEX_WSSoapIn" />
            <output message="s0:Drill_PCCDATA_APEX_WSSoapOut" />
        </operation>
    </portType>
    <binding name="BIServicesSoap" type="s0:BIServicesSoap">
        <soap:binding transport="http://schemas.xmlsoap.org/soap/http"
            style="document" />
        <operation name="GetReportBlock_PCCDATA_APEX_WS">
            <documentation></documentation>
            <soap:operation soapAction="PCCDATA_APEX_WS/GetReportBlock_PCCDATA_APEX_WS"
                style="document" />
            <input>
                <soap:header message="s0:GetReportBlock_PCCDATA_APEX_WSSoapIn"
                    part="request_header" use="literal">
                    <soap:headerfault message="s0:GetReportBlock_PCCDATA_APEX_WSSoapIn"
                        part="request_header" use="literal" />
                </soap:header>
                <soap:body use="literal" parts="parameters" />
            </input>
            <output>
                <soap:body use="literal" />
            </output>
        </operation>
        <operation name="Drill_PCCDATA_APEX_WS">
            <documentation></documentation>
            <soap:operation soapAction="PCCDATA_APEX_WS/Drill_PCCDATA_APEX_WS"
                style="document" />
            <input>
                <soap:header message="s0:Drill_PCCDATA_APEX_WSSoapIn"
                    part="request_header" use="literal">
                    <soap:headerfault message="s0:Drill_PCCDATA_APEX_WSSoapIn"
                        part="request_header" use="literal" />
                </soap:header>
                <soap:body use="literal" parts="parameters" />
            </input>
            <output>
                <soap:body use="literal" />
            </output>
        </operation>
    </binding>
    <service name="PCCDATA_APEX_WS">
        <documentation></documentation>
        <port name="BIServicesSoap" binding="s0:BIServicesSoap">
            <soap:address
                location="http://xyz.test.app.company.com:8080/dswsbobje/qaawsservices/queryasaservice/biws?cuid=AQyF0wiLGyhNgX41XOXwiEs&amp;authType=secEnterprise&amp;locale=en&amp;timeout=60&amp;ConvertAnyType=true" />
        </port>
    </service>
</definitions>

I used this tutorial/guide from spring:

https://spring.io/guides/gs/consuming-web-service/

Here is my main:

import org.springframework.context.ApplicationContext;
import org.springframework.boot.SpringApplication;

public class main {

    public static void main (String [] args)
    {


    ApplicationContext ctx = SpringApplication.run(ApexConfiguration.class);

        apexClient newApexClient = ctx.getBean(apexClient.class);

        newApexClient.callDrillPCCDATAAPEXWS();

    }

}

Here is my Jaxb2Marshaller configuration class:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.oxm.jaxb.Jaxb2Marshaller;
@Configuration
public class ApexConfiguration {

    @Bean
    public Jaxb2Marshaller marshaller() {
        Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
        /* I tried these values but getting the same error?
         *  1) "apex.wsdl" 
         *  or 
         *  2) "/apex.wsdl"
                3) "com.company.dept.apex.stubs"
         *   or 
         *  4) fully qualified package that stubs are generated in "com.company.dept.apex.stubs.ObjectFactory"
         */
        marshaller.setContextPath("apex.wsdl");
        return marshaller;
    }

    @Bean
    public apexClient weatherClient(Jaxb2Marshaller marshaller) {
        apexClient client = new apexClient();
        client.setDefaultUri("http://xyz.test.app.company.com:8080");
        client.setMarshaller(marshaller);
        client.setUnmarshaller(marshaller);
        return client;
    }
}

Here is the actual client web service implementation & request calls:

import javax.xml.bind.JAXBElement;
import org.springframework.ws.client.core.WebServiceTemplate;
import org.springframework.ws.client.core.support.WebServiceGatewaySupport;
import org.springframework.ws.soap.client.core.SoapActionCallback;
import org.springframework.beans.factory.InitializingBean;
import com.company.dept.apex.stubs.DrillPCCDATAAPEXWS;
import com.company.dept.apex.stubs.DrillPCCDATAAPEXWSResponse;
import com.company.dept.apex.stubs.GetReportBlockPCCDATAAPEXWS;
import com.company.dept.apex.stubs.GetReportBlockPCCDATAAPEXWSResponse;
import com.company.dept.apex.stubs.ObjectFactory;

public class apexClient extends WebServiceGatewaySupport {

    private WebServiceTemplate webServiceTemplate;

    //ZBIJOB248/testme05 
    public String username="user1234";
    public String pass="pass1234";
    public DrillPCCDATAAPEXWSResponse callDrillPCCDATAAPEXWS()
    {
        setDefaultUri("http://xyz.test.app.company.com:8080/dswsbobje/qaawsservices/queryasaservice/biws?cuid=AQyF0wiLGyhNgX41XOXwiEs&amp;authType=secEnterprise&amp;locale=en&amp;timeout=60&amp;ConvertAnyType=true");
        DrillPCCDATAAPEXWS request = new DrillPCCDATAAPEXWS();
        ObjectFactory objectFactory = new ObjectFactory();
        JAXBElement<String> login = objectFactory.createDrillPCCDATAAPEXWSLogin(username);
        JAXBElement<String> password = objectFactory.createDrillPCCDATAAPEXWSPassword(pass);
        request.setLogin(login);
        request.setPassword(password);
        //
        DrillPCCDATAAPEXWSResponse response = 
                (DrillPCCDATAAPEXWSResponse) getWebServiceTemplate().marshalSendAndReceive( 
                        request, new SoapActionCallback("http://xyz.test.app.company.com:8080/dswsbobje/qaawsservices/queryasaservice/biws?cuid=AQyF0wiLGyhNgX41XOXwiEs&amp;authType=secEnterprise&amp;locale=en&amp;timeout=60&amp;ConvertAnyType=true"));

        return response;
    }


    public GetReportBlockPCCDATAAPEXWSResponse callGetReportBlockPCCDATAAPEXWSResponse()
    {
        setDefaultUri("http://xyz.test.app.company.com:8080/dswsbobje/qaawsservices/queryasaservice/biws?cuid=AQyF0wiLGyhNgX41XOXwiEs&amp;authType=secEnterprise&amp;locale=en&amp;timeout=60&amp;ConvertAnyType=true");
        GetReportBlockPCCDATAAPEXWS request = new GetReportBlockPCCDATAAPEXWS();
        ObjectFactory objectFactory = new ObjectFactory();
        JAXBElement<String> login = objectFactory.createDrillPCCDATAAPEXWSLogin(username);
        JAXBElement<String> password = objectFactory.createDrillPCCDATAAPEXWSPassword(pass);
        request.setLogin(login);
        request.setPassword(password);
        //
        GetReportBlockPCCDATAAPEXWSResponse response = (GetReportBlockPCCDATAAPEXWSResponse) getWebServiceTemplate().marshalSendAndReceive( 
                request, new SoapActionCallback("http://xyz.test.app.company.com:8080/dswsbobje/qaawsservices/queryasaservice/biws?cuid=AQyF0wiLGyhNgX41XOXwiEs&amp;authType=secEnterprise&amp;locale=en&amp;timeout=60&amp;ConvertAnyType=true"));
        return response;

    }

}//end client

It seems the problem is with the value that I’m passing to “marshaller.setContextPath("?");” its either wrong format or not able to find it.

1) How can I fix this & any other issue with this implementation?

2) (optional) For the sake of knowledge "marshaller.setContextPath()" & also the "client.setDefaultUri()"?

Thank you all.

Upvotes: 2

Views: 16110

Answers (1)

Arjen Poutsma
Arjen Poutsma

Reputation: 1256

It seems like you already tried it, but the context path should be the package name that you generated the JAXB classes to, i.e. the package that contains the ObjectFactory. In your case, it should probably be com.company.dept.apex.stubs. The generated classes should be on the classpath.

Alternatively, instead of using the context path, you can configure a Jaxb2Marshaller by setting the classesToBeBound property and simply give the classes that you want to (un)marshal.

AS for the optional question: the context path and default URI have nothing to do with each other: the context path is for JAXB marshalling purposes; the default URI is the default URL the WebServiceTemplate connects to (if you don't supply a URL parameter that is).

Upvotes: 0

Related Questions