Amar Panigrahy
Amar Panigrahy

Reputation: 75

Spring-boot web-service endpoint class not working

Trying to create spring-boot project with soap web services using Maven. Project setup is correct without any compile time issues.

Have used spring-boot-web-services dependency. When the application is launched, i can see the wsdl correctly but when i hit the operation using chrome wizdler with appropriate input, i get Failure. Cannot even see a print statement that is present inside my endpoint class.

Need to confirm whether i have provided proper values to annotations @PayloadRoot, @RequestPayload and @ResponsePayload based on WSDL.

Below is my WSDL and the Endpoint class:

WSDL file

<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:msc="http://schemas.microsoft.com/ws/2005/12/wsdl/contract" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tns="schemas.corporate.com/col/2014/01" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:wsa10="http://www.w3.org/2005/08/addressing" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" xmlns:wsap="http://schemas.xmlsoap.org/ws/2004/08/addressing/policy" xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wsx="http://schemas.xmlsoap.org/ws/2004/09/mex" xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="VaultNotificationService" targetNamespace="schemas.corporate.com/col/2014/01">
   <wsp:Policy wsu:Id="BasicHttpBinding_IVaultNotificationService_policy">
      <wsp:ExactlyOne>
         <wsp:All>
            <sp:TransportBinding xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
               <wsp:Policy>
                  <sp:TransportToken>
                     <wsp:Policy>
                        <sp:HttpsToken RequireClientCertificate="false" />
                     </wsp:Policy>
                  </sp:TransportToken>
                  <sp:AlgorithmSuite>
                     <wsp:Policy>
                        <sp:Basic256 />
                     </wsp:Policy>
                  </sp:AlgorithmSuite>
                  <sp:Layout>
                     <wsp:Policy>
                        <sp:Strict />
                     </wsp:Policy>
                  </sp:Layout>
               </wsp:Policy>
            </sp:TransportBinding>
         </wsp:All>
      </wsp:ExactlyOne>
   </wsp:Policy>
   <wsdl:types>
      <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="urn:CorporateServices" elementFormDefault="qualified" targetNamespace="urn:CorporateServices">
         <xs:element name="OrderUpdate">
            <xs:complexType>
               <xs:sequence>
                  <xs:element minOccurs="0" maxOccurs="unbounded" form="unqualified" name="OrderUpdateItemList" type="tns:OrderUpdateItem" />
               </xs:sequence>
            </xs:complexType>
         </xs:element>
         <xs:complexType name="OrderUpdateItem">
            <xs:sequence>
               <xs:element minOccurs="0" maxOccurs="1" form="unqualified" name="Order_ID" type="xs:string" />
               <xs:element minOccurs="0" maxOccurs="1" form="unqualified" name="Order_InternalID" type="xs:string" />
               <xs:element minOccurs="0" maxOccurs="1" form="unqualified" name="Order_Status" type="xs:string" />
            </xs:sequence>
         </xs:complexType>
         <xs:element name="OrderUpdateResponse">
            <xs:complexType>
               <xs:sequence>
                  <xs:element minOccurs="0" maxOccurs="unbounded" form="unqualified" name="OrderUpdateItemList" type="tns:OrderUpdateItem" />
               </xs:sequence>
            </xs:complexType>
         </xs:element>
      </xs:schema>
   </wsdl:types>
   <wsdl:message name="UpdateRequest">
      <wsdl:part xmlns:q1="urn:CorporateServices" name="parameters" element="q1:OrderUpdate" />
   </wsdl:message>
   <wsdl:message name="UpdateResponse">
      <wsdl:part xmlns:q2="urn:CorporateServices" name="parameters" element="q2:OrderUpdateResponse" />
   </wsdl:message>
   <wsdl:portType name="IVaultNotificationService">
      <wsdl:operation name="Update">
         <wsdl:input wsaw:Action="schemas.corporate.com/col/2014/01/IVaultNotificationService/Update" name="UpdateRequest" message="tns:UpdateRequest" />
         <wsdl:output wsaw:Action="schemas.corporate.com/col/2014/01/IVaultNotificationService/UpdateResponse" name="UpdateResponse" message="tns:UpdateResponse" />
      </wsdl:operation>
   </wsdl:portType>
   <wsdl:binding name="BasicHttpBinding_IVaultNotificationService" type="tns:IVaultNotificationService">
      <wsp:PolicyReference URI="#BasicHttpBinding_IVaultNotificationService_policy" />
      <soap:binding transport="http://schemas.xmlsoap.org/soap/http" />
      <wsdl:operation name="Update">
         <soap:operation soapAction="schemas.corporate.com/col/2014/01/IVaultNotificationService/Update" style="document" />
         <wsdl:input name="UpdateRequest">
            <soap:body use="literal" />
         </wsdl:input>
         <wsdl:output name="UpdateResponse">
            <soap:body use="literal" />
         </wsdl:output>
      </wsdl:operation>
   </wsdl:binding>
   <wsdl:service name="VaultNotificationService">
      <wsdl:port name="BasicHttpBinding_IVaultNotificationService" binding="tns:BasicHttpBinding_IVaultNotificationService">
         <soap:address location="https://app.sit.col.corporate.com/VaultNotificationService.svc" />
      </wsdl:port>
   </wsdl:service>
</wsdl:definitions>

Endpoint class

import java.util.List;
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 colservices.OrderUpdate;
import colservices.OrderUpdateItem;
import colservices.OrderUpdateResponse;

@Endpoint
public class OrderUpdateEndpoint {

    private final IVaultNotificationService vaultNotificationService;

    @Autowired
    public OrderUpdateEndpoint(IVaultNotificationService vaultNotificationService) {
        this.vaultNotificationService = vaultNotificationService;
    }

    @PayloadRoot(namespace = "urn:CorporateServices", localPart = "UpdateRequest")
    @ResponsePayload
    public OrderUpdateResponse updateOrderStatus(@RequestPayload OrderUpdate request) {
    System.out.println("Enetered in endpoint");
        List<OrderUpdateItem> orderUpdateItemList = vaultNotificationService
                .updateOrdersStatus(request.getOrderUpdateItemList());

        OrderUpdateResponse response = new OrderUpdateResponse();
        response.getOrderUpdateItemList().addAll(orderUpdateItemList);

        return response;
    }

}

Please let me know what i have missed.

ApplicationConfig

import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import org.springframework.ws.config.annotation.EnableWs;
import org.springframework.ws.config.annotation.WsConfigurerAdapter;
import org.springframework.ws.transport.http.MessageDispatcherServlet;
import org.springframework.ws.wsdl.wsdl11.SimpleWsdl11Definition;
import org.springframework.ws.wsdl.wsdl11.Wsdl11Definition;

@EnableWs
@Configuration
public class ApplicationConfig extends WsConfigurerAdapter {

    @Bean
    public ServletRegistrationBean dispatcherServlet(ApplicationContext applicationContext) {
        MessageDispatcherServlet servlet = new MessageDispatcherServlet();
        servlet.setApplicationContext(applicationContext);
        servlet.setTransformWsdlLocations(true);
        return new ServletRegistrationBean(servlet, "/services/*");
    }

    @Bean(name = "orderStatusUpdator")
    public Wsdl11Definition defaultWsdl11Definition() {
        SimpleWsdl11Definition wsdl11Definition = new SimpleWsdl11Definition();
        wsdl11Definition.setWsdl(new ClassPathResource("vaultNotificationService.wsdl"));
        return wsdl11Definition;
    }
}

Application

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        System.out.println("entering application");
        SpringApplication.run(Application.class, args);
    }
}

Upvotes: 2

Views: 4942

Answers (1)

Amar Panigrahy
Amar Panigrahy

Reputation: 75

Got working with below changes:

1) Changed in WSDL from

<soap:address location="https://app.sit.col.corporate.com/VaultNotificationService.svc" />

to

 <soap:address location="https://app.sit.col.travelex.com/services" />

Reason:

i) /services/ URI is used as base uri

ii) As servlet.setTransformWsdlLocations(true), this location would be transformed automatically as per the user request.

2) Moved Application class in parent package where endpoint classes reside to allow component scan to work.

Upvotes: 2

Related Questions