Fehlermeldung bei Übergabe mehrere Werte über Jax-WS

throw_hello

Mitglied
Hallo zusammen,

ich verzweifel grad an der Übergabe mehrerer Zeichenketten über einen Webservice mit JAX-WS.
Sowohl Client als auch Server sind in Java erstellt und funktionieren ansonsten prima.
Habe die letzten Tage intensiv recherchiert, aber bin weder mit Array noch List erfolgreich gewesen.

Wenn ich die Werte per Array übergebe..

Java:
public void insertMultipleUsers(String usernames[]) {
...
}

.. erhalte ich folgende Fehlermeldung:

Java:
Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
The method insertMultipleUsers(StringArray) in the type Queue is not applicable for the arguments (String[])

Mit List..

Java:
public void insertMultipleUsers(List<String> usernames) {
...
}

..diese hier:

Java:
Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
	The method insertMultipleUsers(StringArray) in the type Queue is not applicable for the arguments (List<String>)

Kann jemand mit diesen Informationen schon meinen Fehler erahnen?

Danke euch!

Besten Gruß
throw_hello
 
Hallo throw_hello,

ich hab das gerade mal getestet in meinem Projekt und bei mir funktioniert das mit der Übergabe des Arrays. Allerdings muss ich zugeben, dass mein Client den Service aus PHP aufruft.

Wie sieht den Dein Client aus?

Du könntest es mal mit einer
Java:
ArrayList<String>
versuchen.
 

throw_hello

Mitglied
Hallo zusammen,

danke fürs Testen, dunichquatsche! Und für den Tipp mit SoaMoa, Möhre.
Ich hab's gestern (allerdings sehr spät) noch mal mit ArrayList<String> versucht. War leider nicht erfolgreich.
Begebe mich aber jetzt noch mal ganz in Ruhe an die Sache und teste es auch mit SoaMoa oder auch SoapUI.
Melde mich später wieder. Hoffentlich mit einem Erfolgserlebnis, ansonsten mit weiteren Informationen und Codeauszügen.

Achja, folgende Informationen konnte ich schon mal der automatisch generierten WSDL-Datei entnehmen:
JAX-WS RI 2.1.6 in JDK 6

Danke euch schon mal!

Gruß
throw_hello
 

throw_hello

Mitglied
Da bin ich wieder. Leider ohne Erfolgsmeldung. Hab viel recherchiert und ausprobiert und weiß echt nicht mehr wo ich ansetzten könnte.
Daher liefere ich euch weitere Informationen, damit ihr mir hoffentlich fix auf die Sprünge helfen könnt. ;)

Habe mich bei meinem Webservice zunächst an folgende Anleitung gehalten:
WebService in Java

Meine mit wsimport erstellte Client Service-Klasse sieht so aus:

Java:
package craw.lfm.service;

import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.xml.bind.annotation.XmlSeeAlso;
import net.java.dev.jaxb.array.ObjectFactory;
import net.java.dev.jaxb.array.StringArray;


/**
 * This class was generated by the JAX-WS RI.
 * JAX-WS RI 2.1.6 in JDK 6
 * Generated source version: 2.1
 * 
 */
@WebService(name = "LfmQueue", targetNamespace = "http://service.lfm.craw/")
@SOAPBinding(style = SOAPBinding.Style.RPC)
@XmlSeeAlso({
    ObjectFactory.class
})
public interface LfmQueue {
...
// Variante mit Array
@WebMethod
    public void insertIgnoreMultipleUsers(
        @WebParam(name = "arg0", partName = "arg0")
        StringArray arg0);
...
// Variante mit List
@WebMethod
    public void insertIgnoreMultipleUsers2(
        @WebParam(name = "arg0", partName = "arg0")
        ArrayList arg0);
...
}

Nach dem wsimport zeigt mir Ecplise bei der generierten Methode mit ArrayList folgendes an:
ArrayList cannot be resolved to a type
import ArrayList (java.util)

Wenn ich dann java.util importiere, kommt folgendes:
ArrayList is a raw type. References to generic type ArrayList<E> should be parameterized.

Hätte gedacht, dass nach dem wsimport alles wie bisher auch direkt genutzt werden kann.
Hab ich was vergessen?


Die Klasse mit der ich den Webservice nutze ist testweise diese hier:

Java:
package crawler.modultest;

import java.util.ArrayList;
import crawler.lfm.service.LfmQueue;
import crawler.lfm.service.LfmQueueService;

public class InsertMultipleUsers {

	public static void main(String[] args) {
		
		// Webservice einbinden
		LfmQueueService dbas = new LfmQueueService();
		LfmQueue dba = dbas.getLfmQueuePort();
		
		// Variante Array
		String usernames[] = { "userA", "userB" };
		dba.insertIgnoreMultipleUsers(usernames);
		
		// Variante ArrayList
		ArrayList<String> usernames2 = new ArrayList<String>();
		usernames2.add("userA");
		usernames2.add("userB");
		
		dba.insertIgnoreMultipleUsers2(usernames2);
	}
}

Braucht ihr noch weitere Codeauszüge?

Habe hier
Using JAXB Data Binding
gelesen, dass Arrays nicht zu den "Java-to-XML Mapping for Built-In Data Types" sondern zu den "Supported XML User-Defined Data Types" gehören.

Heißt das, dass man noch irgendwas manuell einbinden muss um Array oder ArrayList nutzen zu können?

Danke euch für weitere Denkanstöße!

Besten Gruß
throw_hello
 

fax

Mitglied
In deinem ersten Codeschnipsel fehlt ein "import java.util.ArrayList". Daher vermutlich die Eclipse Fehlermeldung.

Kannst du mal das WSDL anhängen?
 

throw_hello

Mitglied
Sorry, die import-Anweisung hab ich euch unterschlagen. Diese musste ich nachträglich eingefügen.

Aber gerne, hier die WSDL-Datei:

Java:
<?xml version="1.0" encoding="UTF-8"?>
<types>
<xsd:schema>
<xsd:import namespace="http://service.lfm.craw/" schemaLocation="http://localhost:8080/lfm?xsd=1"></xsd:import>
</xsd:schema>
<xsd:schema>
<xsd:import namespace="http://jaxb.dev.java.net/array" schemaLocation="http://localhost:8080/lfm?xsd=2"></xsd:import>
</xsd:schema>
</types>
<message name="isUserInDatabase">
<part name="arg0" type="xsd:string"></part>
</message>
<message name="isUserInDatabaseResponse">
<part name="return" type="xsd:boolean"></part>
</message>
<message name="insertUser">
<part name="arg0" type="xsd:string"></part>
</message>
<message name="insertUserResponse"></message>
<message name="insertIgnoreUser">
<part name="arg0" type="xsd:string"></part>
</message>
<message name="insertIgnoreUserResponse"></message>
<message name="insertIgnoreMultipleUsers">
<part xmlns:ns1="http://jaxb.dev.java.net/array" name="arg0" type="ns1:stringArray"></part>
</message>
<message name="insertIgnoreMultipleUsersResponse"></message>
<message name="insertIgnoreMultipleUsers2">
<part name="arg0" type="tns:arrayList"></part>
</message>
<message name="insertIgnoreMultipleUsers2Response"></message>
<message name="getNextUsernameToCollectInfo"></message>
<message name="getNextUsernameToCollectInfoResponse">
<part name="return" type="xsd:string"></part>
</message>
<message name="getNextUsernameToCollectFriends"></message>
<message name="getNextUsernameToCollectFriendsResponse">
<part name="return" type="xsd:string"></part>
</message>
<message name="getNextUsernameToCollectTracks"></message>
<message name="getNextUsernameToCollectTracksResponse">
<part name="return" type="xsd:string"></part>
</message>
<message name="setInfoInProgress">
<part name="arg0" type="xsd:string"></part>
<part name="arg1" type="xsd:string"></part>
</message>
<message name="setInfoInProgressResponse"></message>
<message name="setFriendsInProgress">
<part name="arg0" type="xsd:string"></part>
<part name="arg1" type="xsd:string"></part>
</message>
<message name="setFriendsInProgressResponse"></message>
<message name="setTracksInProgress">
<part name="arg0" type="xsd:string"></part>
<part name="arg1" type="xsd:string"></part>
</message>
<message name="setTracksInProgressResponse"></message>
<message name="getNextUsernameToCollectInfoAndSetInProgress">
<part name="arg0" type="xsd:string"></part>
</message>
<message name="getNextUsernameToCollectInfoAndSetInProgressResponse">
<part name="return" type="xsd:string"></part>
</message>
<message name="getNextUsernameToCollectFriendsAndSetInProgress">
<part name="arg0" type="xsd:string"></part>
</message>
<message name="getNextUsernameToCollectFriendsAndSetInProgressResponse">
<part name="return" type="xsd:string"></part>
</message>
<message name="getNextUsernameToCollectTracksAndSetInProgress">
<part name="arg0" type="xsd:string"></part>
</message>
<message name="getNextUsernameToCollectTracksAndSetInProgressResponse">
<part name="return" type="xsd:string"></part>
</message>
<message name="setInfoSuccesfullyCollected">
<part name="arg0" type="xsd:string"></part>
<part name="arg1" type="xsd:string"></part>
</message>
<message name="setInfoSuccesfullyCollectedResponse"></message>
<message name="setFriendsSuccesfullyCollected">
<part name="arg0" type="xsd:string"></part>
<part name="arg1" type="xsd:string"></part>
</message>
<message name="setFriendsSuccesfullyCollectedResponse"></message>
<message name="setTracksSuccesfullyCollected">
<part name="arg0" type="xsd:string"></part>
<part name="arg1" type="xsd:string"></part>
</message>
<message name="setTracksSuccesfullyCollectedResponse"></message>
<message name="setInfoFailed">
<part name="arg0" type="xsd:string"></part>
<part name="arg1" type="xsd:string"></part>
</message>
<message name="setInfoFailedResponse"></message>
<message name="setFriendsFailed">
<part name="arg0" type="xsd:string"></part>
<part name="arg1" type="xsd:string"></part>
</message>
<message name="setFriendsFailedResponse"></message>
<message name="setTracksFailed">
<part name="arg0" type="xsd:string"></part>
<part name="arg1" type="xsd:string"></part>
</message>
<message name="setTracksFailedResponse"></message>
<message name="countTotalUsersInDatabase"></message>
<message name="countTotalUsersInDatabaseResponse">
<part name="return" type="xsd:int"></part>
</message>
<portType name="LfmQueue">
<operation name="isUserInDatabase">
<input message="tns:isUserInDatabase"></input>
<output message="tns:isUserInDatabaseResponse"></output>
</operation>
<operation name="insertUser">
<input message="tns:insertUser"></input>
<output message="tns:insertUserResponse"></output>
</operation>
<operation name="insertIgnoreUser">
<input message="tns:insertIgnoreUser"></input>
<output message="tns:insertIgnoreUserResponse"></output>
</operation>
<operation name="insertIgnoreMultipleUsers">
<input message="tns:insertIgnoreMultipleUsers"></input>
<output message="tns:insertIgnoreMultipleUsersResponse"></output>
</operation>
<operation name="insertIgnoreMultipleUsers2">
<input message="tns:insertIgnoreMultipleUsers2"></input>
<output message="tns:insertIgnoreMultipleUsers2Response"></output>
</operation>
<operation name="getNextUsernameToCollectInfo">
<input message="tns:getNextUsernameToCollectInfo"></input>
<output message="tns:getNextUsernameToCollectInfoResponse"></output>
</operation>
<operation name="getNextUsernameToCollectFriends">
<input message="tns:getNextUsernameToCollectFriends"></input>
<output message="tns:getNextUsernameToCollectFriendsResponse"></output>
</operation>
<operation name="getNextUsernameToCollectTracks">
<input message="tns:getNextUsernameToCollectTracks"></input>
<output message="tns:getNextUsernameToCollectTracksResponse"></output>
</operation>
<operation name="setInfoInProgress" parameterOrder="arg0 arg1">
<input message="tns:setInfoInProgress"></input>
<output message="tns:setInfoInProgressResponse"></output>
</operation>
<operation name="setFriendsInProgress" parameterOrder="arg0 arg1">
<input message="tns:setFriendsInProgress"></input>
<output message="tns:setFriendsInProgressResponse"></output>
</operation>
<operation name="setTracksInProgress" parameterOrder="arg0 arg1">
<input message="tns:setTracksInProgress"></input>
<output message="tns:setTracksInProgressResponse"></output>
</operation>
<operation name="getNextUsernameToCollectInfoAndSetInProgress">
<input message="tns:getNextUsernameToCollectInfoAndSetInProgress"></input>
<output message="tns:getNextUsernameToCollectInfoAndSetInProgressResponse"></output>
</operation>
<operation name="getNextUsernameToCollectFriendsAndSetInProgress">
<input message="tns:getNextUsernameToCollectFriendsAndSetInProgress"></input>
<output message="tns:getNextUsernameToCollectFriendsAndSetInProgressResponse"></output>
</operation>
<operation name="getNextUsernameToCollectTracksAndSetInProgress">
<input message="tns:getNextUsernameToCollectTracksAndSetInProgress"></input>
<output message="tns:getNextUsernameToCollectTracksAndSetInProgressResponse"></output>
</operation>
<operation name="setInfoSuccesfullyCollected" parameterOrder="arg0 arg1">
<input message="tns:setInfoSuccesfullyCollected"></input>
<output message="tns:setInfoSuccesfullyCollectedResponse"></output>
</operation>
<operation name="setFriendsSuccesfullyCollected" parameterOrder="arg0 arg1">
<input message="tns:setFriendsSuccesfullyCollected"></input>
<output message="tns:setFriendsSuccesfullyCollectedResponse"></output>
</operation>
<operation name="setTracksSuccesfullyCollected" parameterOrder="arg0 arg1">
<input message="tns:setTracksSuccesfullyCollected"></input>
<output message="tns:setTracksSuccesfullyCollectedResponse"></output>
</operation>
<operation name="setInfoFailed" parameterOrder="arg0 arg1">
<input message="tns:setInfoFailed"></input>
<output message="tns:setInfoFailedResponse"></output>
</operation>
<operation name="setFriendsFailed" parameterOrder="arg0 arg1">
<input message="tns:setFriendsFailed"></input>
<output message="tns:setFriendsFailedResponse"></output>
</operation>
<operation name="setTracksFailed" parameterOrder="arg0 arg1">
<input message="tns:setTracksFailed"></input>
<output message="tns:setTracksFailedResponse"></output>
</operation>
<operation name="countTotalUsersInDatabase">
<input message="tns:countTotalUsersInDatabase"></input>
<output message="tns:countTotalUsersInDatabaseResponse"></output>
</operation>
</portType>
<binding name="LfmQueuePortBinding" type="tns:LfmQueue">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="rpc"></soap:binding>
<operation name="isUserInDatabase">
<soap:operation soapAction=""></soap:operation>
<input>
<soap:body use="literal" namespace="http://service.lfm.craw/"></soap:body>
</input>
<output>
<soap:body use="literal" namespace="http://service.lfm.craw/"></soap:body>
</output>
</operation>
<operation name="insertUser">
<soap:operation soapAction=""></soap:operation>
<input>
<soap:body use="literal" namespace="http://service.lfm.craw/"></soap:body>
</input>
<output>
<soap:body use="literal" namespace="http://service.lfm.craw/"></soap:body>
</output>
</operation>
<operation name="insertIgnoreUser">
<soap:operation soapAction=""></soap:operation>
<input>
<soap:body use="literal" namespace="http://service.lfm.craw/"></soap:body>
</input>
<output>
<soap:body use="literal" namespace="http://service.lfm.craw/"></soap:body>
</output>
</operation>
<operation name="insertIgnoreMultipleUsers">
<soap:operation soapAction=""></soap:operation>
<input>
<soap:body use="literal" namespace="http://service.lfm.craw/"></soap:body>
</input>
<output>
<soap:body use="literal" namespace="http://service.lfm.craw/"></soap:body>
</output>
</operation>
<operation name="insertIgnoreMultipleUsers2">
<soap:operation soapAction=""></soap:operation>
<input>
<soap:body use="literal" namespace="http://service.lfm.craw/"></soap:body>
</input>
<output>
<soap:body use="literal" namespace="http://service.lfm.craw/"></soap:body>
</output>
</operation>
<operation name="getNextUsernameToCollectInfo">
<soap:operation soapAction=""></soap:operation>
<input>
<soap:body use="literal" namespace="http://service.lfm.craw/"></soap:body>
</input>
<output>
<soap:body use="literal" namespace="http://service.lfm.craw/"></soap:body>
</output>
</operation>
<operation name="getNextUsernameToCollectFriends">
<soap:operation soapAction=""></soap:operation>
<input>
<soap:body use="literal" namespace="http://service.lfm.craw/"></soap:body>
</input>
<output>
<soap:body use="literal" namespace="http://service.lfm.craw/"></soap:body>
</output>
</operation>
<operation name="getNextUsernameToCollectTracks">
<soap:operation soapAction=""></soap:operation>
<input>
<soap:body use="literal" namespace="http://service.lfm.craw/"></soap:body>
</input>
<output>
<soap:body use="literal" namespace="http://service.lfm.craw/"></soap:body>
</output>
</operation>
<operation name="setInfoInProgress">
<soap:operation soapAction=""></soap:operation>
<input>
<soap:body use="literal" namespace="http://service.lfm.craw/"></soap:body>
</input>
<output>
<soap:body use="literal" namespace="http://service.lfm.craw/"></soap:body>
</output>
</operation>
<operation name="setFriendsInProgress">
<soap:operation soapAction=""></soap:operation>
<input>
<soap:body use="literal" namespace="http://service.lfm.craw/"></soap:body>
</input>
<output>
<soap:body use="literal" namespace="http://service.lfm.craw/"></soap:body>
</output>
</operation>
<operation name="setTracksInProgress">
<soap:operation soapAction=""></soap:operation>
<input>
<soap:body use="literal" namespace="http://service.lfm.craw/"></soap:body>
</input>
<output>
<soap:body use="literal" namespace="http://service.lfm.craw/"></soap:body>
</output>
</operation>
<operation name="getNextUsernameToCollectInfoAndSetInProgress">
<soap:operation soapAction=""></soap:operation>
<input>
<soap:body use="literal" namespace="http://service.lfm.craw/"></soap:body>
</input>
<output>
<soap:body use="literal" namespace="http://service.lfm.craw/"></soap:body>
</output>
</operation>
<operation name="getNextUsernameToCollectFriendsAndSetInProgress">
<soap:operation soapAction=""></soap:operation>
<input>
<soap:body use="literal" namespace="http://service.lfm.craw/"></soap:body>
</input>
<output>
<soap:body use="literal" namespace="http://service.lfm.craw/"></soap:body>
</output>
</operation>
<operation name="getNextUsernameToCollectTracksAndSetInProgress">
<soap:operation soapAction=""></soap:operation>
<input>
<soap:body use="literal" namespace="http://service.lfm.craw/"></soap:body>
</input>
<output>
<soap:body use="literal" namespace="http://service.lfm.craw/"></soap:body>
</output>
</operation>
<operation name="setInfoSuccesfullyCollected">
<soap:operation soapAction=""></soap:operation>
<input>
<soap:body use="literal" namespace="http://service.lfm.craw/"></soap:body>
</input>
<output>
<soap:body use="literal" namespace="http://service.lfm.craw/"></soap:body>
</output>
</operation>
<operation name="setFriendsSuccesfullyCollected">
<soap:operation soapAction=""></soap:operation>
<input>
<soap:body use="literal" namespace="http://service.lfm.craw/"></soap:body>
</input>
<output>
<soap:body use="literal" namespace="http://service.lfm.craw/"></soap:body>
</output>
</operation>
<operation name="setTracksSuccesfullyCollected">
<soap:operation soapAction=""></soap:operation>
<input>
<soap:body use="literal" namespace="http://service.lfm.craw/"></soap:body>
</input>
<output>
<soap:body use="literal" namespace="http://service.lfm.craw/"></soap:body>
</output>
</operation>
<operation name="setInfoFailed">
<soap:operation soapAction=""></soap:operation>
<input>
<soap:body use="literal" namespace="http://service.lfm.craw/"></soap:body>
</input>
<output>
<soap:body use="literal" namespace="http://service.lfm.craw/"></soap:body>
</output>
</operation>
<operation name="setFriendsFailed">
<soap:operation soapAction=""></soap:operation>
<input>
<soap:body use="literal" namespace="http://service.lfm.craw/"></soap:body>
</input>
<output>
<soap:body use="literal" namespace="http://service.lfm.craw/"></soap:body>
</output>
</operation>
<operation name="setTracksFailed">
<soap:operation soapAction=""></soap:operation>
<input>
<soap:body use="literal" namespace="http://service.lfm.craw/"></soap:body>
</input>
<output>
<soap:body use="literal" namespace="http://service.lfm.craw/"></soap:body>
</output>
</operation>
<operation name="countTotalUsersInDatabase">
<soap:operation soapAction=""></soap:operation>
<input>
<soap:body use="literal" namespace="http://service.lfm.craw/"></soap:body>
</input>
<output>
<soap:body use="literal" namespace="http://service.lfm.craw/"></soap:body>
</output>
</operation>
</binding>
<service name="LfmQueueService">
<port name="LfmQueuePort" binding="tns:LfmQueuePortBinding">
<soap:address location="http://localhost:8080/lfm"></soap:address>
</port>
</service>
</definitions>

Ist es üblich, dass man bei der Übergabe von mehreren Werten oder Objekten nach dem wsimport noch manuell Hand an den generierten Dateien anlegen muss?

Danke für eure Hilfe!
 

throw_hello

Mitglied
Ahh.. habe erst gerade bemerkt, dass nach dem wsimport ein neues package namens "net.java.dev.jaxb.array" angelegt wurde.

Dort befindet sich eine Klasse ObjectFactory mit folgendem Inhalt:

Java:
package net.java.dev.jaxb.array;

import javax.xml.bind.annotation.XmlRegistry;


/**
 * This object contains factory methods for each 
 * Java content interface and Java element interface 
 * generated in the net.java.dev.jaxb.array package. 
 * <p>An ObjectFactory allows you to programatically 
 * construct new instances of the Java representation 
 * for XML content. The Java representation of XML 
 * content can consist of schema derived interfaces 
 * and classes representing the binding of schema 
 * type definitions, element declarations and model 
 * groups.  Factory methods for each of these are 
 * provided in this class.
 * 
 */
@XmlRegistry
public class ObjectFactory {


    /**
     * Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: net.java.dev.jaxb.array
     * 
     */
    public ObjectFactory() {
    }

    /**
     * Create an instance of {@link StringArray }
     * 
     */
    public StringArray createStringArray() {
        return new StringArray();
    }

}

Daher habe ich direkt mal versucht mit dieser Methode ein ArrayList Objekt zu erstellen.

Allerdings komme ich hier nicht mehr weiter, da ich dem ArrayList-Object (package craw.lfm.service.ArrayList) keine Werte zuweisen kann:

Java:
ObjectFactory objectFactory = new ObjectFactory();
		ArrayList usernames = objectFactory.createArrayList();
		usernames.

Oder muss ich vielleicht doch erst ein ArrayList-Objekt aus "java.util.ArrayList" erstellen und dann vor dem Zugriff auf den Webservice mit der ObjectFactory-Methode umwandeln?

Fragen über Fragen.. :)

Bin für jeden Ansatz dankbar!
 

fax

Mitglied
Aber gerne, hier die WSDL-Datei:
Ich vergaß, ohne die Schemadefinitionen nutzt die leider nicht viel:
[XML]<xsd:schema>
<xsd:import namespace="http://service.lfm.craw/" schemaLocation="http://localhost:8080/lfm?xsd=1"></xsd:import>
</xsd:schema>
<xsd:schema>
<xsd:import namespace="http://jaxb.dev.java.net/array" schemaLocation="http://localhost:8080/lfm?xsd=2"></xsd:import>
</xsd:schema>[/XML]
 

throw_hello

Mitglied
Ah, aber klar. Hier die Schemadefinitionen.

http://localhost:8080/lfm?xsd=1:

Java:
<xs:schema version="1.0" targetNamespace="http://service.lfm.craw/"><xs:complexType name="arrayList"><xs:complexContent><xs:extension base="tns:abstractList"><xs:sequence/></xs:extension></xs:complexContent></xs:complexType><xs:complexType name="abstractList" abstract="true"><xs:complexContent><xs:extension base="tns:abstractCollection"><xs:sequence/></xs:extension></xs:complexContent></xs:complexType><xs:complexType name="abstractCollection" abstract="true"><xs:sequence/></xs:complexType></xs:schema>

http://localhost:8080/lfm?xsd=2:

Java:
<xs:schema version="1.0" targetNamespace="http://jaxb.dev.java.net/array"><xs:complexType name="stringArray" final="#all"><xs:sequence><xs:element name="item" type="xs:string" minOccurs="0" maxOccurs="unbounded" nillable="true"/></xs:sequence></xs:complexType></xs:schema>
 

fax

Mitglied
Ich hab das mal mit NetBeans 7.0 und Metro 2.1/GlassFish 3.1 nachgestellt. Teilweise kann ich deine Probleme nachvollziehen, aber Compilerfehler habe ich keine. In deinen WSDL und XSD Dateien haben übrigens die Namespace Deklarationen gefehlt, die musste ich erst mühsam nachbasteln.

Mein Client Code sieht so aus:

Java:
try {
    craw.lfm.client.LfmQueueService service = new craw.lfm.client.LfmQueueService();
    craw.lfm.client.LfmQueue port = service.getLfmQueuePort();
    craw.lfm.client.StringArray arg0 = new craw.lfm.client.StringArray();
    List<String> users = arg0.getItem();
    users.add("user1");
    port.insertIgnoreMultipleUsers(arg0);
    craw.lfm.client.ArrayList arg1 = new craw.lfm.client.ArrayList();
    port.insertIgnoreMultipleUsers2(arg1);
} catch (Exception ex) {
	out.println(ex.toString());
}

Die erste Methode mit der List funktioniert problemlos, man muss nur wissen, dass man mit getItem die Liste holen und manipulieren kann. Die zweite Methode mit der ArrayList funktioniert nicht, da kriegt man nur eine Klasse ohne eigene Methoden geliefert. Laut Doku sollte JAX-WS den Array eigentlich auch in eine Liste konvertieren, keine Ahnung was da schief geht.

P.S.: Dein Service Interface ist sehr feinkörnig. Normalerweise sollte man versuchen, so wenig Aufrufe über das Netz abzusetzen wie möglich.
 

throw_hello

Mitglied
Wow.. vielen vielen Dank, "fax"!!

Werde es so schnell wie möglich ausprobieren.
Voraussichtlich werde ich frühstens erst Morgen dazu kommen.
Hoffentlich kriege ich das mit das mit den Namespace Deklarationen hin.
Dann werde ich aber direkt berichten.

Dein Hinweis zum feinkörnigen Service Interface stimmt. Hoffe ich hab Dich richtig verstanden.
Sobald ich mehrere Werte auf einmal übergeben kann, werden pro Client immer direkt 25 oder 50 neue Jobs vom Server abgeholt und greifen dann nur noch selten auf den Webservice zu.

Also schon mal besten Dank und allen einen schönen Abend!
 

fax

Mitglied
Im Anhang sind die Dateien, die ich verwendet habe mit den Namespaces: Anhang anzeigen wsdl.zip. Im WSDL habe ich die SOAP Address Location auf localhost:8080 umgebogen, damit er sich mit meinem imitierten Web Service unterhält. Das musst du wieder zurückändern.

Mit NetBeans habe ich die eingebaute JAX-WS Unterstützung benutzt. Einfach einen neuen Web Service Client zum Projekt hinzufügen und auf das WSDL zeigen. Wenn alles fertig ist, kriegt man im Navigator den Web Service angezeigt und kann einzelne Operationen auf eine eigene Java Klasse ziehen (oder ein JSP). NetBeans erzeugt dann automatisch den Code, um die Operation aufzurufen.
 
Zuletzt bearbeitet:

throw_hello

Mitglied
Hallo zusammen,

dank eurer Hilfe hab ich es geschafft.
Ich musste gar keine Veränderungen an den von JAX-WS erzeugten WSDL- und XSD-Dateien vornehmen.

Der Client Quellcode von "fax" hat den Durchbruch gebracht.

Für alle die das selbe Problem haben.

In der Serverklasse des Service die Array-Variante nehmen, die WSDL generieren lassen und dann funktioniert folgender Client Quellcode:

Java:
LfmQueueService service = new LfmQueueService();
LfmQueue port = service.getLfmQueuePort();
		
StringArray myArray = new StringArray();
List<String> users = myArray.getItem();
users.add("userA");
users.add("userB");
users.add("userB");
port.insertIgnoreMultipleUsers(myArray);

Noch mal vielen Dank an "fax" und alle die geholfen haben.

Erleichterte freudige Grüße
throw_hello
 
R

reNur

Gast
Hallo,

ich will den Thread hier noch einmal kurz aufgreifen, da ich vor dem selben Problem stehe: Bei einerm Array als Rück- oder Übergabewert innerhalb einer als Webservice annotierten Methode erzeugt der import der wsdl Datei dieses seltsame Package mit der Klasse StringArray, DoubleArray usw.

Wenn ich aber eine Klasse per Webservicve verschicke, und diese Klasse enthält String[]-Attribute - dann funktioniert alles wunderbar, dann werden die String[]-Attribute zu List<String> umgewandelt! Und genau das will ich auch haben. So etwas muss doch möglich sein?
 
Ähnliche Java Themen

Ähnliche Java Themen

Neue Themen


Oben