# WebService Problem mit SessionBean



## leni (17. Dez 2005)

Hallo,

ich habe einen Web-Client für das Google-WebService geschrieben mit Apache Axis. Also mit wsdl2java die klassen generiert und funktioniert auch tadellos. Ein kleiner Ausschnitt aus dem Client:


```
GoogleSearchService service = new GoogleSearchServiceLocator();

	    	// Now use the service to get a stub to the Service Definition Interface (SDI)
	    	GoogleSearchPort google = service.getGoogleSearchPort();
			
			GoogleSearchResult googleSearchResult =  google.doGoogleSearch(GOOGLE_KEY, // java.lang.String key
							  q.toString(), //java.lang.String q
							  0, // int start
							  10, // int maxResults
							  false, //boolean filter
							  "", // java.lang.String restrict        
							  false, //boolean safeSearch                
							  "lang_ja|lang_en", // java.lang.String lr
							  "UTF-8", // java.lang.String ie
							  "UTF-8"); // java.lang.String oe
```

Jetzt muss ich den Web-Client in ein SessionBean packen. Also habe ich den Code des Web-Clients in einer Methode definiert und  in ein SesionBean gepackt und einen Client für das SessionBean geschrieben. Jedoch wenn dann vom SessionBean die Methode für das Konsumieren des GoogleWebServices aufgerufen wird, kommt immer folgender Fehler:


```
Exception in thread "main" java.rmi.ServerError: Unexpected Error; nested exception is:
[code=Java] java.lang.NoClassDefFoundError: GoogleSearch/GoogleSearchService

Jedoch sind die notwendigen Klassen, wie GoogleSearchService, etc. ganz sicher im classpath, also die Klassen sind sicher verfügbar. Und der Code funktioniert auch, habe es ja im Rahmen des Web-Clients ausprobiert. 

Weiß da jemand weiter? Gibts irgendwas auf das man achten muss wenn man in einem SessionBean einen WebService in Anspruch nimmt?? :bahnhof: 

mfg leni
```


----------



## leni (18. Dez 2005)

Hat keiner eine Idee, warum diese Exception geworfen wird?? 

leni


----------



## Guest (18. Dez 2005)

Was für einen Application Server verwendest du und wo "in classpath" sind die Dateien?


----------



## leni (18. Dez 2005)

Hallo,

ich verwenden den JBoss-Server 4.0.3

und mein Ant-build file sieht folgendermaßen aus, da sieht man auch dass ich beim ausführen des clients (java) den classpath angebe:
(Im lib-Verzeichnis meines Eclipse-Projekts sind alle notwendigen jars, also die apache-axis-jars und das jar, das die vom wsdl-file generierten Klassen enthält)

```
<?xml version="1.0"?>
<project name="myapp" basedir="." default="run-client">

  <target name="init">
    <!--
    Set the following three properties at command line, e.g.:
    ant -Dtestapp=MyTstApp -Djarfile=MyApp.jar -Dpackage=mypackage
    <property name="testapp"          value="..." />
    <property name="jarfile"          value="..." />
    <property name="package"          value="..." />
    -->
    <property name="src.dir"          value="${basedir}/src" />
    <property name="classes.dir"      value="${basedir}/bin" />
    <property name="jboss.client.dir" value="C:\Programme\jboss-4.0.3\client" /> 
    <property name="jboss.deploy.dir" value="C:\Programme\jboss-4.0.3\server\default\deploy" />
  	<property name="testapp"          value="google.client.GoogleSessionClient" />
  	<property name="jarfile"          value="GoogleBean.jar" />
  	<property name="package"          value="google/ejb" />
  	<property name="lib" 			  value="${basedir}/lib"/>
  	
  	<path id="project.class.path">
  	   	<fileset dir="${lib}">
  	       	<include name="**/*.jar" />
  	 	</fileset>
  	 </path>
  </target>

  <target name="compile" depends="init">
    <mkdir dir="${classes.dir}" />
    <javac srcdir="${src.dir}" destdir="${classes.dir}" classpathref="project.class.path" debug="true" deprecation="true">
      <classpath>
        <fileset dir="${jboss.client.dir}">
          <include name="**/*.jar" />
          <include name="task1.jar"/>
        </fileset>
      	<pathelement path="${lib}"/>
      	<pathelement location="**/*.jar"/>
      </classpath>      
    </javac>
  </target>

  <target name="jar" depends="init,compile">
    <jar jarfile="${jarfile}">
      <metainf dir="${src.dir}/${package}" includes="**/*.xml" />
      <fileset dir="${classes.dir}">
        <include name="${package}/*.class" />
      </fileset>
    </jar>
  </target>

  <target name="deploy" depends="jar">
    <copy todir="${jboss.deploy.dir}">
      <fileset dir="${src.dir}/${package}">
        <include name="*-service.xml" />
      </fileset>
    </copy>
    <copy todir="${jboss.deploy.dir}" file="${jarfile}" />
  </target>

  <target name="undeploy" depends="init">
    <delete file="${jboss.deploy.dir}/${jarfile}" />
  </target>

  <target name="clean" depends="init" description="Clean all build products.">
    <delete>
      <fileset dir="${classes.dir}">
        <include name="**/*.class" />
      </fileset>
    </delete>
    <delete file="${jarfile}" />   
  </target>

  <target name="all" depends="init,jar,deploy" description="Build everything.">
    <echo message="Application built." />
  </target>

  <target name="run-client" depends="all">
    <java fork="true" classname="${testapp}" classpathref="project.class.path">
      <classpath>
        <fileset dir="${jboss.client.dir}">
          <include name="**/*.jar" />
        </fileset>
        <pathelement path="." />
        <pathelement path="${classes.dir}" />
        <pathelement path="${env.CLASSPATH}" />
      	<pathelement path="${lib}"/>
      	<pathelement location="**/*.jar"/>
      </classpath>      
    </java>
  </target>

</project>
```

Hilft dir das??

leni
[/code]


----------



## leni (18. Dez 2005)

Weiß' jemand was ich noch ausprobieren könnte, damit ich dieses Problem lösen könnte?


----------



## Guest (18. Dez 2005)

Kopiere GoogleBean.jar nach C:\Programme\jboss-4.0.3\server\default\deploy


----------



## leni (18. Dez 2005)

Hmm...?? was meinst du, das GoogleBean.jar befindet sich ja bereits im deploy-Verzeichnis vom jboss...?? :bahnhof: 

lg leni


----------



## Guest (19. Dez 2005)

leni hat gesagt.:
			
		

> Hmm...?? was meinst du, das GoogleBean.jar befindet sich ja bereits im deploy-Verzeichnis vom jboss...?? :bahnhof:
> 
> lg leni


:autsch: Sorry, ich meinte die generierten Klassen für den Zugriff auf die Google-Services
und alles, was dazu gehört (axis.jar etc.).
Kopiere die Google-Klassen nach jboss3/server/default/lib, dann sind sie für jede App verfügbar.
Bei den 3.x Versionen von JBoss ist die Deployment-Reihenfolge wichtig gewesen, wenn 
man Jar's deployd. z.B. a.jar wird vor b.jar deployd so dass die Klassen aus b.jar für a.jar 
unbekannt sind. Eine Möglichkeit ist die komplette Application als EAR zu deployen oder 
einen Präfix vor die Daeinamen der Jar-Dateien zu setzen. z.B. 0b.jar, a.jar. Damit wird 
0b.jar zuerst deployed und ist für a.jar bekannt.
Siehe dazu 
<attribute name="URLComparator">org.jboss.deployment.scanner.PrefixDeploymentSorter</attribute>
in jboss#/server/default/conf/jboss-service.xml
Ich hoffe es hilft. JBoss 4 habe ich noch nocht ausprobiert, da ich leider bisher keine Zeit
dazu hatte.


----------



## leni (19. Dez 2005)

okay danke jetzt hat es funktioniert  gott sei dank!

Eine Frage hätte ich da jetzt noch: Ich habe das SessionBean nun als WebService deployed mit Apache Axis, jedoch muss ich dazu immer die class-files in ein von mir angelegtes classes-verzeichnis unter der webapps/axis im jboss-deploy Verzeichnis geben. Ist das normal? - sonst findet er die Klassen leider nicht....gibts da noch eine andere Möglichkeit??


----------



## Guest (19. Dez 2005)

Du brauchst nur einen Deployment Descriptor über den AdminService in Axis 
zu deployen, wenn ich mich recht erinnere.  ???:L 
z.B.
	
	
	
	





```
<?xml version="1.0" encoding="UTF-8"?>
<deployment xmlns="http://xml.apache.org/axis/wsdd/"
            xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"
            xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance">
  <service name="TranslationService" provider="java:EJB">
    <parameter name="beanJndiName" value="TranslationEJB"/>
    <parameter name="homeInterfaceName" value="package.TranslationHome"/>
    <parameter name="remoteInterfaceName" value="package.TranslationRemote"/>
    <parameter name="allowedMethods" value="*"/>
    <parameter name="className" value="package.TranslationBean"/>
  </service>
</deployment>
```


----------



## leni (19. Dez 2005)

Ja das ist klar, habe ich auch gemacht, nur wenn die entsprechenden KLassen (SessionBean, Home und Remote-Interface) nicht im classes Verzeichnis vom webapps/axis verzeichnis vom jobss liegen findet er die klassen nicht.....?


----------



## Guest (19. Dez 2005)

Auch wenn du die Jar-Datei mit deinen "Bohnen"  umbenennst?
z.B. in 00GoogleBean.jar


----------



## leni (19. Dez 2005)

Hi,

mir ist nicht ganz klar, auf was du hinauswillst?? - Ich habe folgendes Verzeichnis im jboss C:\Programme\jboss-4.0.3\server\default\deploy\webapps\axis.war\WEB-INF\classes definiert (bzw. das axis.war musst man sowieso definieren damit axis funktioniert, WEB-INF und classes habe ich selbst dazudefiniert) und dann einfach hier die packages reingestellt, damit er wenn ich das sessionbean als web service deployed habe und im browser ansehen möchte auch die klassen findet, das funktioniert auch, aber ich bin mit der Lösung gar nicht zufrieden....(

Weißt du eine elegantere Methode sagen??? :bahnhof:  :bahnhof: 

lg leni


----------



## Niki (20. Dez 2005)

Ich muss komischer Weise das selbe zur Zeit auch machen... GoogleSearchService erstellen... in Bean packen... als Web-Service deployn....

Hab mir mal die Klassen mit wscompile generiert, hab gelesen dass sich JBoss nicht wirklich gut mit axis verträgt. Hab die generierten Klassen in ein jar gepackt und ins jboss/lib/endorsed verzeichnis gegeben. Wenn ich jedoch die Methode von meinem Bean aufrufen will reißt es den JBoss komplett nieder, bekomm leider keinerlei Stacktrace am Server. Auch wenn ich das GoogleService am Client verwenden möchte bekomm ich einen Verfication-Error oder irgend sowas ähnliches. Womit kann das zusammen liegen?


----------



## leni (20. Dez 2005)

Nein, also ich hatte noch keine Probleme mit Axis und JBoss und überhaupt ist die Erstellung mit Axis um einiges leichter und angenehmer als mit dem JWSDP. 

@Gast: Was meinst du zu meiner Lösung, gibt es da keinen eleganteren Weg? - mit einem jar-file oder so?

danke im voraus

leni


----------

