Black Friday = Pricewatch Bekijk onze selectie van de beste Black Friday-deals en voorkom een miskoop.

[Java/SOAP/.NET] Zelf gedefinieerde klasse oversturen

Pagina: 1
Acties:

  • Enfer
  • Registratie: Februari 2004
  • Laatst online: 10-10 13:28
Hoi,

Wij zitten met een probleempje wat betreft Java webservices. Wij willen graag een zelf-gedefiniëerd object oversturen via SOAP, naar een .NET compact framework applicatie gemaakt in Visual Studio 2008.

We hebben zelf de volgende simpele klasse gemaakt:
Java:
1
2
3
4
5
6
7
8
9
10
public class TestClass
{
    private String naam;
    private int nummer;
    private double kosten;
    
    public TestClass()
    {
        
    }


Deze klasse bevat ook de standaard dingen zoals getters & setters, en de constructor (ivm ruimte even weggelaten).

In de SOAP klasse definieren we de methode alsvolgt:
Java:
1
2
3
4
public TestClass getTestClass() throws RemoteException
{
    return new TestClass( "Nick", 1, 1.5);
}


Hiervan genereren we in Eclipse een WSDL, welke we vervolgens in tomcat 5.5 deployen, en vanuit daar aanroepbaar is.

Als we in de .NET applicatie de aanroep doen, krijgen we de volgende response:
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Type: text/xml;charset=utf-8
Transfer-Encoding: chunked
Date: Mon, 23 Jun 2008 15:58:11 GMT

1a5
<?xml version="1.0" encoding="utf-8"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
 <getTestClassResponse xmlns="http://com">
  <getTestClassReturn>
  <kosten>1.5</kosten>
  <naam>Nick</naam>
  <nummer>1</nummer>
 </getTestClassReturn>
</getTestClassResponse>
</soapenv:Body>
</soapenv:Envelope>
(Bekeken met een packet sniffer)

Echter geeft Visual Studio een melding dat dit niet correct is, en blijven de attributen van de klasse leeg.

In Visual Studio roepen we de webservice aan op de volgende manier:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/*
*  Values of the class are empty.. ( int = 0 , string = "" )
*/
WebReference.ComTestImplService service = new WebReference.ComTestImplService();
WebReference.TestClass bla = service.getTestClass();
MessageBox.Show(bla.nummer.ToString()); // Empty string!


/* Er is een uitzondering opgetreden in de formatter bij de poging het bericht 
* Er is een fout opgetreden tijdens de poging parameter http://com:getTestClassResponse 
* te deserialiseren. Het InnerException-bericht is Fout in regel 1 positie 365. 
* EndElement getTestClassReturn van naamruimte http://com wordt niet verwacht. 
* kosten wordt verwacht.. Zie InnerException voor meer details. te deserialiseren.
*/

ServiceReference1.ComTestImplClient client = new WindowsFormsApplication2.ServiceReference1.ComTestImplClient();
ServiceReference1.TestClass testClass = client.getTestClass();



We hebben in .NET op twee manieren geprobeerd de waardes terug te krijgen. Als service reference ( nieuwe manier ) en als web reference ( oude manier ). Op de nieuwe manier krijgen we een exception en bij de oude manier blijven de waardes leeg.

We hebben de gegenereerde WSDL ook online staan:
http://vps.icaryou.com:8080/ComTest/wsdl/ComTestImpl.wsdl

We hebben zelf op google gezocht, maar er valt eigenlijk bar weinig over te vinden. Ook hebben we geprobeerd om simpele Strings / primitieve typen over te sturen. Dit ging wel succesvol.

De TestClass bevat enkel en alleen primitieve typen, dus dit zou opzich geen probleem moeten opleveren.
Toch krijgen we de foutmelding, zoals hij in het stukje C# beschreven staat.

Hopelijk kunnen jullie ons helpen, met wat er precies mis gaat, en hoe we dit kunnen oplossen.

  • JKVA
  • Registratie: Januari 2004
  • Niet online

JKVA

Design-by-buzzword fanatic

Wat doet die 1a5 daar in je SOAP bericht? (regel 7)

Fat Pizza's pizza, they are big and they are cheezy


  • Enfer
  • Registratie: Februari 2004
  • Laatst online: 10-10 13:28
Daar hebben wij zelf ook al naar gekeken, maar zelf hebben we ook werkelijk geen enkel idee wat die daar doet. We hebben een aantal keren opnieuw een request gedaan, en de 1a5 bleef daar maar staan..
Misschien is het iets dat eclipse genereert ofzo, het valt echter niet terug te vinden in de gegenereerde source files...

[ Voor 12% gewijzigd door Enfer op 23-06-2008 19:57 ]


  • BHR
  • Registratie: Februari 2002
  • Laatst online: 15-11 17:39

BHR

die 1a5 is onderdeel van http chunked encoding, en heb je geen last van. Ik neem aan de .Net hier gewoon ondersteuning voor heeft.

edit:
weet je trouwens zeker dat je in .Net dit binnen krijgt?
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Type: text/xml;charset=utf-8
Transfer-Encoding: chunked
Date: Mon, 23 Jun 2008 15:58:11 GMT

1a5
<?xml version="1.0" encoding="utf-8"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
 <getTestClassResponse xmlns="http://com">
  <getTestClassReturn>
  <kosten>1.5</kosten>
  <naam>Nick</naam>
  <nummer>1</nummer>
 </getTestClassReturn>
</getTestClassResponse>
</soapenv:Body>
</soapenv:Envelope>


Ik heb namelijk het vermoeden dat kosten, naam en nummer er niet zijn. Dit vanwege de foutmelding EndElement getTestClassReturn van naamruimte http://com wordt niet verwacht . kosten wordt verwacht..

[ Voor 78% gewijzigd door BHR op 23-06-2008 21:38 ]

No amount of key presses will shut off the Random Bug Generator


  • Enfer
  • Registratie: Februari 2004
  • Laatst online: 10-10 13:28
We hebben een packetsniffer aangezet, en het bericht bekeken (http protocol), en die message hebben we letterlijk gekopieerd uit onze packetsniffer ;)

Dus ja, dit krijgen we letterlijk binnen van onze request..

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

In je WDSL komt het volgende fragment voor:
XML:
1
<element name="getTestClassReturn" type="tns1:TestClass"/>

Echter wordt nergens de namespace 'tns1' gedefineerd en ik vermoed dat visual studio hierdoor geen goede client kan opbouwen.

Echter normaal zet axis alle targetnamespaces (tns1, tns2, etc) in het wdsl:difinitions element (root element), echter zou wdsl mist deze informatie. De apache soap response bevat de xmlns:xsi regel waarmee de xml wordt gecontroleerd aan de hand van de xsd. Echter kan tns1 niet aan namespace 'http://com' gekoppeld worden en daardoor zal het bericht als 'corrupt' worden gezien met als resultaat een lege class of exceptie.

Waarschijnlijk als je attribute ' xmlns:tns1="http://com" ' toevoegt aan wdsl:definitions en dan in visual studio je webservice opnieuw genereerd werkt het waarschijnlijk wel. Althans dat was bij ons een aantal jaren geleden het probleem (.net 1.1 + axis 1.2)

If it isn't broken, fix it until it is..


  • Enfer
  • Registratie: Februari 2004
  • Laatst online: 10-10 13:28
Hey bedankt! Je hebt ons inderdaad in de goed geholpen :Y)

Wat wij in eclipse (voor het java gedeelte van de webservice) hebben toegevoegd is een mapping van een package, naar het package waar de SOAP class zit. Dan werkt alles opeens :Y)

Hardstikke bedankt :Y)
Pagina: 1