2017-07-27 2 views
0

J'essaie de comprendre un comportement interressant de JAX-WS ces derniers jours.Le paramètre de demande JAX-WS valide est NULL sur le serveur

Fondamentalement, j'ai deux demandes SOAP différentes générées à partir de deux clients différents et je suis incapable de faire des changements sur la façon dont ces demandes sont créées. Cependant, je dois être capable de gérer les deux types de demandes. Malheureusement, la deuxième requête a son paramètre de requête défini sur NULL sur le serveur, bien qu'il ait une valeur valide lorsque I est envoyé dans la requête. Cela signifie que le serveur est incapable d'analyser correctement cette requête. Comment puis-je dire à mon serveur JAX-WS de gérer correctement ces deux requêtes?

Demande de travail

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

Demande Broken (paramètre est NULL côté serveur).

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

me semble être incapable de trouver une solution à ce problème en dépit du fait que cette question semble être connue depuis un certain temps (See this 2 year old stackoverflow thread).

Pour terminer, voici la mise en œuvre de mon WebService. J'ai essayé de définir directement l'espace de noms cible sur l'annotation @WebService et @WebParam mais cela n'a eu aucun effet.

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

} 

Le WSDL du 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> 

Le 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> 
+1

Veuillez fournir xsd (schéma XML) pour ce service Web. –

+0

J'ai ajouté le WSDL généré par mon service Web. Est-ce que c'est ce que vous vouliez dire? – Markus

+1

Post un qui est spécifié dans la balise 'xsd: import' de votre WSDL - ' schemaLocation = "http: // someHostname: 8080/services/Machines? Xsd = 1" ' –

Répondre

2

Vous avez probablement besoin d'utiliser SOAPHandler personnalisé. Exemple représenté here. Avec un gestionnaire personnalisé, vous pourrez facilement résoudre ce problème.

+0

Je vais jeter un coup d'oeil. Merci pour l'indice! – Markus

+0

Je suis arrivé à la conclusion que la seule façon de faire fonctionner cela est d'utiliser un SOAPHandler. – Markus