Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Valid JAX-WS request parameter is NULL on the server

Tags:

java

soap

jax-ws

I'm trying to figure out an interresting behavior of JAX-WS in the last few days.

Basically I'm having two different SOAP requests generated from two different clients and I'm unable to make any changes on how those requests are created. Still I need to be able to handle both types of requests.

Sadly the second request has its request parameter set to NULL on the server despite it having a valid value when I is sent in the request. This means that the server is unable to parse this request correctly. How can I tell my JAX-WS server to handle both of those requests correctly?

Working Request

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
    <S:Body>
        <ns2:getMachine xmlns:ns2="http://machine.soap.webservices.product.company.at/">
            <machineId>92623-15853588</machineId>
        </ns2:getMachine>
    </S:Body>
</S:Envelope>

Broken Request (Parameter is NULL on server side).

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
    <S:Body>
        <getMachine xmlns="http://machine.soap.webservices.product.company.at/">
            <machineId>92623-15853588</machineId>
        </getMachine>
    </S:Body>
</S:Envelope>

I seem to be unable to find any solution to this issue despite the fact that this issue seems to be known for quite some time (See this 2 year old stackoverflow thread).

For completion, here is the implementation of my WebService. I tried to set the target namespace here directly to the @WebService and the @WebParam annotation but it had no effect.

package at.company.product.webservices.soap.machine;


import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;

import at.company.product.core.ProductCorePlugin;
import at.company.product.core.machine.IMachine;
import at.company.product.webservices.soap.exceptions.InvalidIdException;

@WebService
@SOAPBinding(style = SOAPBinding.Style.RPC)
public class WSMachineApi {

    @WebMethod
    public WSMachine getMachine(@WebParam(name = "machineId") String machineId) throws InvalidIdException{
        IMachine machine = getMachineById(machineId);
        if (machine == null){
            throw new InvalidIdException(machineId);
        }

        return new WSMachine(getMachineById(machineId));
    }   

    private IMachine getMachineById(String id) {
        return ProductCorePlugin.getDefault().getMachineHallAdmin().getMachineByID(id);
    }

}

The WSDL of the service

 <?xml version="1.0" encoding="UTF-8"?><!-- Published by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.2.4-b01. --><!-- Generated by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.2.4-b01. -->
<definitions xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wsp="http://www.w3.org/ns/ws-policy" xmlns:wsp1_2="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://machine.soap.webservices.product.company.at/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://machine.soap.webservices.product.company.at/" name="WSMachineApiService">
    <types>
    <xsd:schema>
    <xsd:import namespace="http://machine.soap.webservices.product.company.at/" schemaLocation="http://someHostname:8080/services/Machines?xsd=1"></xsd:import>
    </xsd:schema>
    </types>
    <message name="InvalidIdException">
    <part name="fault" element="tns:InvalidIdException"></part>
    </message>

    <message name="getMachine">
    <part name="machineId" type="xsd:string"></part>
    </message>
    <message name="getMachineResponse">
    <part name="return" type="tns:WSMachine"></part>
    </message>
    <portType name="WSMachineApi">
    <operation name="getMachine">
    <input wsam:Action="http://machine.soap.webservices.product.company.at/WSMachineApi/getMachineRequest" message="tns:getMachine"></input>
    <output wsam:Action="http://machine.soap.webservices.product.company.at/WSMachineApi/getMachineResponse" message="tns:getMachineResponse"></output>
    <fault message="tns:InvalidIdException" name="InvalidIdException" wsam:Action="http://machine.soap.webservices.product.company.at/WSMachineApi/getMachine/Fault/InvalidIdException"></fault>
    </operation>
    </portType>
    <binding name="WSMachineApiPortBinding" type="tns:WSMachineApi">
    <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="rpc"></soap:binding>
    <operation name="getMachine">
    <soap:operation soapAction=""></soap:operation>
    <input>
    <soap:body use="literal" namespace="http://machine.soap.webservices.product.company.at/"></soap:body>
    </input>
    <output>
    <soap:body use="literal" namespace="http://machine.soap.webservices.product.company.at/"></soap:body>
    </output>
    <fault name="InvalidIdException">
    <soap:fault name="InvalidIdException" use="literal"></soap:fault>
    </fault>
    </operation>
    </binding>
    <service name="WSMachineApiService">
    <port name="WSMachineApiPort" binding="tns:WSMachineApiPortBinding">
    <soap:address location="http://someHostname:8080/services/Machines"></soap:address>
    </port>
    </service>
    </definitions>

The XSD

    <xs:schema xmlns:tns="http://machine.soap.webservices.product.company.at/" xmlns:xs="http://www.w3.org/2001/XMLSchema" version="1.0" targetNamespace="http://machine.soap.webservices.product.company.at/">

    <xs:element name="InvalidIdException" type="tns:InvalidIdException"></xs:element>


    <xs:complexType name="WSMachine">
    <xs:sequence>
    <xs:element name="name" type="xs:string" minOccurs="0"></xs:element>
    <xs:element name="id" type="xs:string" minOccurs="0"></xs:element>
    <xs:element name="totalShots" type="xs:long"></xs:element>
    <xs:element name="totalEvents" type="xs:long"></xs:element>
    <xs:element name="actualData" type="tns:WSMachineActualData" minOccurs="0"></xs:element>
    </xs:sequence>
    </xs:complexType>

    <xs:complexType name="WSMachineActualData">
    <xs:sequence>
    <xs:element name="connected" type="xs:boolean"></xs:element>
    <xs:element name="operationMode" type="xs:string" minOccurs="0"></xs:element>
    </xs:sequence>
    </xs:complexType>


    <xs:complexType name="InvalidIdException">
    <xs:sequence>
    <xs:element name="id" type="xs:string" minOccurs="0"></xs:element>
    <xs:element name="message" type="xs:string" minOccurs="0"></xs:element>
    </xs:sequence>
    </xs:complexType>


    </xs:schema>
like image 371
Markus Avatar asked Dec 07 '25 13:12

Markus


1 Answers

You probably need to utilize custom SOAPHandler. Example shown here. With custom handler you will be able to easily debug this issue.

like image 59
Dmitry Trifonov Avatar answered Dec 09 '25 01:12

Dmitry Trifonov



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!