# WebService erstellen



## TeamBob (17. Feb 2009)

Hi
Also ich glaube einfach mal das es sinnvoller ist ein Thema über Webservice allgemein zu machen, anstatt die ganzen Probleme einzeln zu posten.
Ich habe mir schon verschiedene Tutorial durchgelesen aber nirgends wir
sowas was ich mache genau gezeigt. Deswegen hoffe das ihr mir weiterhelfen 
könnt. Danke
*
Zur Geschicht:*
Ich soll ein WebService zu einen Projekt entwickeln, was Usern ermöglicht
einen Suchbegriff einzugeben und Dokumente nach diesen Suchbegriff zu
durchsuchen und eine Liste der Dokumente die dieses Wort enthalten auszugeben. 

*Vorgehen:*
In Eclipse habe ich zuerst einmal eine neue Klasse WebService erstellt, die dieses Vorhaben dann ermöglichen soll. Die Suchfunktion liegt bereits fertig in ein anderes Package. Diese rufe ich dann bloss noch auf in meinen WebService. Unten findet ihr die ganzen Quelltexte zu der Suchfunktion und dem Webservice. 
Ich habe dann das SoapUI Plugin für Eclipse als WebTester für die ganze Sache genommen und den JBoss als Server. 
Ich kann den WebService deployen und vom Jboss aus starten und mit SoapUI dann unter http://localhost:9090/......?wsdl   testen.

*
Problem:*
Der User soll ja Suchbebegriffe eingeben können und soll dann eine liste der Dokumente ausgegeben bekommen. Ich weis jedoch nicht wie ich jetzt weiter
verfahren soll.
Muss ich einen Client bauen? Wie soll der aussehen?
Wie kann ich es ermöglichen das der User eine Eingabe macht und damit
dann die Searchfunktion gestartet wird?
Wie genau kann ich alles als Liste wiedergeben?

Ich hoffe ihr könnt mir helfen, weil ich gerade echt nicht weis 
wie ich fortfahren soll?

*Quelltexte:*

*Die SearchFunktion*

```
@SuppressWarnings("unchecked")
	public List<Document> searchInDocumentFieldsForSimpleSearch(
			final String and_search, final Long userId) {

		final List<Long> documentIds = new ArrayList<Long>(0);
		final List<Long> visibledocumentsForUser_ids = new ArrayList<Long>(0);
		final List<Document> documents = new ArrayList<Document>(0);

		final Session session = sf.openSession();
		final FullTextSession fullTextSession = Search
				.createFullTextSession(session);

		// determine visible documents by user
		visibledocumentsForUser_ids.addAll(dfl
				.getVisibleDocumentsByUser(userId));

		final String newSearch = and_search.trim();
		final Query luceneQuery = createInputFieldQuery(newSearch,
				BooleanClause.Occur.MUST, false);

		final org.hibernate.Query fullTextQuery = fullTextSession
				.createFullTextQuery(luceneQuery, Document.class);
		final Iterator it = fullTextQuery.iterate();

		// while (it.hasNext()) {
		// final DocumentField df = (DocumentField) it.next();
		// if (df != null) {
		// if (!documentIds.contains(df.getDocumentId())
		// && (visibledocumentsForUser_ids
		// .contains(df.getDocumentId()))) {
		// final Document dd = df.getDocument();
		// if(dd!=null){
		// if(Hibernate.isInitialized(dd)==false){
		// Hibernate.initialize(dd);
		// }
		// documentIds.add(dd.getId());
		// documents.add(dd);
		// }
		// }
		// }
		// }

		while (it.hasNext()) {
			final Document d = (Document) it.next();
			if (d != null) {
				if (!documentIds.contains(d.getId())
						&& (visibledocumentsForUser_ids.contains(d.getId()))) {
					documentIds.add(d.getId());
					documents.add(d);
				}
			}
		}

		/*
		 * visibledocumentsForUser_ids.addAll(dfl
		 * .getVisibleDocumentsByUser(userId));
		 * 
		 * Iterator is = documentFields.iterator(); while (is.hasNext()) {
		 * DocumentField df = (DocumentField) is.next(); if(df!=null){ Document
		 * dd = df.getDocument(); dd.getAuthors(); if
		 * (!documentIds.contains(dd.getId()) &&
		 * (visibledocumentsForUser_ids.contains(dd.getId()))) {
		 * 
		 * documentIds.add(dd.getId()); documents.add(dd); // System.out //
		 * .println("###### Document " + dd.getName() + " " // +
		 * dd.getCreationDate() + " " // + dd.getModificationDate()); // hier
		 * implemantation für die categorien anzeige ?? } } }
		 */
		return documents;

	}

	/*
	 * (non-Javadoc)
	 * 
	 * @seede.search.SearchLocal#
	 * getAllDocumentsByUserCommunitiesAndByReleaseStatus(java.lang.Long)
	 */
```

*Der WebService*


```
package web.service;

import javax.ejb.EJB;
import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.naming.InitialContext;

import ejb.search.*;


@WebService(name = "SearchService", serviceName = "SearchService", targetNamespace = "http://www.test.de")
public class WebServiceSearch {

@EJB
SearchLocal searchBean;

 SearchLocal getSearchBean() {

	if (searchBean == null) {
			
		try {
			searchBean = (SearchLocal) new InitialContext()
			.lookup("java:comp/env/ejb/SearchEJB");
			} catch (Exception a) {
				throw new RuntimeException(a);
			}
		}
		return searchBean;
	}	
 
 
//@WebMethod
 	//public java.util.ArrayList<String> getItems(java.lang.String searchTerm) {
   // new java.util.ArrayList<String>();

 
 @WebMethod
 	public String searchInDocumentFieldsForSimpleSearch(final String and_search, final Long userId)
 		{
	    return and_search;
 		}
}
```


----------



## The_S (18. Feb 2009)

Natürlich benötigst du einen Client, der den Webservice aufruft und auswertet. Um den eigentlichen Webservice-Import musst du dich aber nicht kümmern - dafür gibt es für so gut wie jede Sprache ein kleines Tools, dass dir alle benötigten Klassen automatisch erstellt (in Java z. B. wsimport).


----------



## TeamBob (18. Feb 2009)

Hi
Also bedeutet das ich mir jetzt wsimport runterladen soll und dies 
dann ausführen soll auf meinen Webservice und der mir alle benötigten Klasse
erstellt?
Danke


----------



## The_S (18. Feb 2009)

wsimport musste dir nicht runterladen. Liegt in deiner JDK-Installation  .


----------



## TeamBob (18. Feb 2009)

und wie genau benutze ich das?
danke


----------



## The_S (18. Feb 2009)

So z. B. 


```
wsimport -keep http://localhost:1234/services/service?wsdl
```

Du könntest übrigens viele deiner Fragen durch Googeln beantworten.


----------



## TeamBob (18. Feb 2009)

ok habe den Jboss angemacht wo mein project liegt und dann über die Konsole das gemacht.
Dann kam 
parsing wsdl
generating code...

fertig.
Was genau habe ich jetzt bewirkt?
danke für deine hilfe


----------



## The_S (18. Feb 2009)

Du hast die Klassen generiert, mit denen du auf den Webservice zugreifen kannst.


----------



## TeamBob (18. Feb 2009)

ich habe einen neuen Ordner gefunden, wo jetzt eine menge Klasse drin sind.
Wie verfahre ich weiter


----------



## The_S (18. Feb 2009)

Indem du Eigeninitiative zeigst und Google bemühst, bevor du nach elementaren Sachen in einem Forum fragst, die dir jedes Tutorial zu dem Thema erklärt.


----------



## TeamBob (18. Feb 2009)

Naja ich habe schon ein paar Tut. gelesen aber keins hat mich so wirklich weiter
gebracht. Ich will ja erreichen, dass der User eine Eingabe machen muss z.B seinen
name und dann eine response bekommt mit z:B hallo name...

Wie genau verfahre ich den weiter mit den Klasse?


----------



## The_S (18. Feb 2009)

Du wiederholst dich  .

Du verfährst weiter, indem du die generietern Klassen verwendest. Könnte z. B. so aussehen:


```
YourService service = new YourService();
YourWebService ws = service.getYourWebServicePort();
SuchErgebnis se = ws.suche("Suchstring");
```


----------



## TeamBob (18. Feb 2009)

hmm...
Dann muss ich die generierten klassen ja irendwie einbinden oder wie?


----------



## The_S (18. Feb 2009)

natürlich. Von alleine machen sie nix ...


----------



## TeamBob (18. Feb 2009)

Also muss ich das in meinen auf seite 1 geposteten Quelltext Webservices einbinden?


----------



## The_S (18. Feb 2009)

Nein.

WebService = Server-Side
Abfrage von WebService = Client-Side

Du brauchst nen eigenen Client.

Generell habe ich den verdacht, dass du einfach mal machst, aber nicht weißt, was du tust (und auch nicht wirklich fit in Java bist)


----------



## TeamBob (18. Feb 2009)

Also ich arbeite gerade das nächste Tutorial durch aber das haut immer nicht alles so hin
wie es soll und ich habe fehlermedlung obwohl ich es so machen wie im Tut. beschrieben


----------



## The_S (18. Feb 2009)

Meine Kristallkugel ist leider momentan in der Werkstatt. Also verrate mir bitte: Welches Tutorial, was funktioniert nicht, was macht es, was soll es machen, wie lautet die Fehlermeldung?

Generell gehst du ein ein bisschen wenig auf meine Fragen und Anmerkungen ein ...


----------



## TeamBob (18. Feb 2009)

Dieses Tut.
http://www.zdnet.de/anwendungsentwi...hen_web_service_story-20000201-39161748-1.htm

Also ich soweit alles gemacht, bloss ich benutze nicht Apache Axis oder Tomcat, sondern 
den JBoss 4.2. habe den auch konfiguriert in Server runtime usw.
Habe den WS erstellt und bin auf Seite drei.
Habe die Klasse erstellt und den Quelltext erstellt und gehe nun auf Web Services/Create Web service und dann finish.
Dann kommt diese Fehlermeldung
Unable to add the follwing facets to project Webservice: Axis2 Web Services Extensions, Axis2 Web Services Core.


----------



## The_S (18. Feb 2009)

Und das hat jetzt was mit deinem wsimport-Client-Problem zu tun? Ich denke die Client-Klassen können ohne Probleme über wsimport erzeugt werden!?


----------



## TeamBob (18. Feb 2009)

Das hat jetzt erstmal gar nichts damit zu tun. 
Mit den erzeugten Klasse komme ich nicht weiter.
Wollte erstmal das machen und das erzeugen lassen und 
es dann daraus weiterbauen.
danke


----------



## The_S (18. Feb 2009)

Sorry, von JBoss habe ich keine Ahnung. Evtl. hilft dir hier ein separater Thread weiter - hat ja nicht direkt mit Webservices allgemein zu tun.


----------



## TeamBob (18. Feb 2009)

habe jetzt den Tomcat genommen und Axis und bin auf Seite 3.
habe die Klasse erstellt und wenn ich auf die Klasse gehe und
eb Services/Create Web service und dann finish drücke dann 
arbeitet er und startet einiges und dann bekomme ich zum schluss
die Fehlermeldung "Selection must be WSDL"
Keine ahnung was los ist. habe alles so gemacht wie
beschrieben.


----------



## TeamBob (18. Feb 2009)

Hi
Also ich habe jetzt in meine WebService einfach mal diese Funktion eingebaut


```
@WebMethod
 	public String sayHello(String name){

         return "Hello " + name;
```

Wenn ich das Project jetzt deploye und mit SOAPUI teste und dann als arg.
mein name eingeben kommt Hello "mein name"
Also habe ich ja schonmal ein request und ein Response die
funktionieren. 
Die frage ist jetzt wie bekomme ich die ganze Sache mit meiner Suchfunktion
hin, dass ich ein Suchbegriff eingebe und der ne Datenbank durchsucht


----------



## TeamBob (19. Feb 2009)

Hi
Also ich bin jetzt auf ein Tut. gestoßen, welches sich echt gut anhört.
http://www.theserverside.de/webservice-in-java/

Habe jetzt eine neue Package Service mit der Klasse erstellt und da den Code reingemacht.
Dann habe ich ein neues Package Server mit den code erstellt.

So wenn ich jetzt den Broswer öffne und da:
http://localhost:8080/calculator?wsdl
eingebe bekomme ich gar nichts raus. Somit kann ich auch nicht weiter
zum client schreiten. Woran liegt es.
Muss ich noch vorher was starten oder deployen oder so?


----------



## TeamBob (23. Feb 2009)

Hi
Also ich habe jetzt wirkliche fortschritte erzielt.
Ich habe jetzt einen WebService erstellt der 2 zahlen
addiert und dazu einen Client wodurch man auf ihm
zugreifen kann.
Jedoch lese ich im Internet sehr viel über einen 
WebService+Server+Client.
Einen Server habe ich bis jetzt noch nicht. Da ich 
meinen Webservice bis jetzt noch über den JBoss
lade und dann kann ich ja mit hilfe des Clients die 
request usw. durchführen.
Könnte mir vielleicht jemand helfen wie ich genau ich
einen server aufbauen muss und ob ich überhaupt einen
brauche usw.
Danke


----------



## The_S (2. Mrz 2009)

JBoss ist doch ein Server!?


----------



## mvitz (2. Mrz 2009)

Jeder JavaApplicationServer kann auch als Webservice-Server eingesetzt werden. Man kann jedoch auch Frameworks, wie z.B. Apache Axis in den Tomcat einbinden und diesen als Server benutzen. Afaik kann man Axis auch direkt als Server laufen lassen.

Die beiden letzteren Möglichkeiten fressen halt garantiert weniger Ressourcen als ein kompletter JBoss.


----------



## Ebenius (3. Mrz 2009)

habi55, nur um Deine Vermutung zu bestätigen: Axis2 kann sowohl als simple server oder im Tomcat als WAR laufen.


----------

