# Webservice Einbinden einer WSDL



## Nud3l (20. Jun 2012)

Hallo,

ich bin gerade dabei ein Webservice zu erstellen. Der Webservcie wird anhand eine fest definierten WSDL erstellt. Ich habe mein Eclipse so weite eingestellt, dass ich mit Maven aus der WSDL meinen Code erzeugen lasse und dann auch alles zum Testen auf dem Glassfish 2.1 automatisiert deploye. 

Nur habe ich jetzt das Problem, dass die deployte WSDL von meiner Ausgangs WSDL abweicht. Wie kann ich das meinem Programm mitteilen, dass es die vordefinierte WSDL nimmt. 

Kann man das über maven einstellen, oder muss ich das irgendwo in der web.xml oder in sun-jaxws.xml definieren?


----------



## kama (20. Jun 2012)

Hi,
ohne pom etc. ist das schwierig?
Gruß
Karl-Heinz Marbaise


----------



## Nud3l (21. Jun 2012)

Also scheint das über maven zu gehen?

Ok hier mal ein Auszug aus meiner pom

[XML]
	<plugin>
				<groupId>org.jvnet.jaxb2.maven2</groupId>
				<artifactId>maven-jaxb2-plugin</artifactId>
				<version>0.8.1</version>
				<executions>
					<execution>
						<goals>
							<goal>generate</goal>
						</goals>
						<configuration>
							<schemaDirectory>src/main/resources/schema</schemaDirectory>
							<schemaIncludes>
								<include>nab.xsd</include>
							</schemaIncludes>
							<generatePackage>com.pack.xml</generatePackage>
							<generateDirectory>${basedir}/src/main/java</generateDirectory>
						</configuration>
					</execution>
				</executions>
			</plugin>

			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>2.0.2</version>
				<configuration>
					<source>1.5</source>
					<target>1.5</target>
				</configuration>
			</plugin>
			<!-- Plugin to generate JAXB classes and webservice interface -->
			<plugin>
				<groupId>org.codehaus.mojo</groupId>
				<artifactId>jaxws-maven-plugin</artifactId>
				<version>1.10</version>
				<executions>
					<execution>
						<goals>
							<goal>wsimport</goal>
						</goals>
					</execution>
				</executions>
				<configuration>
					<wsdlDirectory>src\main\webapp\WEB-INF\wsdl</wsdlDirectory>
					<sourceDestDir>${basedir}/gen/src/main/java</sourceDestDir>
				</configuration>
				<dependencies>
					<dependency>
						<groupId>javax.jws</groupId>
						<artifactId>jsr181-api</artifactId>
						<version>1.0-MR1</version>
					</dependency>
				</dependencies>
			</plugin>
			<!-- Plugin to add source path to build cycle -->
			<plugin>
				<groupId>org.codehaus.mojo</groupId>
				<artifactId>build-helper-maven-plugin</artifactId>
				<version>1.5</version>
				<executions>
					<execution>
						<id>add-source</id>
						<phase>generate-sources</phase>
						<goals>
							<goal>add-source</goal>
						</goals>
						<configuration>
							<sources>
								<source>${basedir}/gen/src/main/java</source>
							</sources>
						</configuration>
					</execution>
					<execution>
						<id>add-resource</id>
						<phase>generate-resources</phase>
						<goals>
							<goal>add-resource</goal>
						</goals>
						<configuration>
							<resources>
								<resource>
									<directory>${basedir}/src/main/resources/schema</directory>
									<targetPath>src/main/resources/schema</targetPath>
								</resource>
							</resources>
						</configuration>
					</execution>
				</executions>
			</plugin>

			<!-- Plugin to add delete path to build cycle -->
			<plugin>
				<artifactId>maven-clean-plugin</artifactId>
				<version>2.2</version>
				<configuration>
					<filesets>
						<fileset>
							<directory>gen/src/main/java</directory>
							<includes>
								<include>**/*.java</include>
							</includes>
						</fileset>
					</filesets>
				</configuration>
			</plugin>

			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-surefire-plugin</artifactId>
				<version>2.8.1</version>
				<configuration>
					<parallel>methods</parallel>
					<threadCount>10</threadCount>
					<excludes>
						<exclude>**/integrationstest/*IT.java</exclude>
					</excludes>
				</configuration>
				<executions>
					<execution>
						<id>integration-tests</id>
						<phase>integration-test</phase>
						<goals>
							<goal>test</goal>
						</goals>
						<configuration>
							<skip>false</skip>
							<excludes>
								<exclude>none</exclude>
							</excludes>
							<includes>
								<include>**/integrationstest/*IT.java</include>
							</includes>
						</configuration>
					</execution>
				</executions>
			</plugin>

			<plugin>
				<groupId>org.glassfish.maven.plugin</groupId>
				<artifactId>maven-glassfish-plugin</artifactId>
				<version>2.1</version>
				<configuration>
					<glassfishDirectory>C:\Programme\Glassfish\glassfish</glassfishDirectory>
					<user>admin</user>
					<adminPassword>adminadmin</adminPassword>
					<debug>true</debug>
					<echo>true</echo>
					<domain>
						<name>domain1</name>
						<adminPort>4848</adminPort>
						<resources>
							<jdbcDataSource>
								<name>jdbc/xe</name>
								<type>dataSource</type>
								<poolName>oracle</poolName>
								<className>oracle.jdbc.pool.OracleDataSource</className>
								<description>Some JDBC Connection Pool</description>
								<allowNonComponentCallers>false</allowNonComponentCallers>
								<validateConnections>true</validateConnections>
								<validationMethod>metaData</validationMethod>
								<properties>
									<property>
										<name>DataSourceName</name>
										<value>OracleDataSource</value>
									</property>
									<property>
										<name>password</name>
										<value>admin</value>
									</property>
									<property>
										<name>user</name>
										<value>admin</value>
									</property>
									<property>
										<name>URL</name>
										<value>jdbcracle:thindb.....</value>
									</property>
								</properties>
							</jdbcDataSource>
						</resources>
					</domain>
					<components>
						<component>
							<name>web-service</name>
							<artifact>${project.basedir}/target/web-service.war</artifact>
						</component>
					</components>
				</configuration>
				<executions>
					<execution>
						<id>deploy-glassfish</id>
						<phase>pre-integration-test</phase>
						<goals>
							<goal>create-domain</goal>
							<goal>deploy</goal>
						</goals>
					</execution>
					<!-- <execution> <id>cleanup-glassfish</id> <phase>post-integration-test</phase> 
						<goals> <goal>delete-domain</goal> </goals> </execution> -->
				</executions>
			</plugin>



[/XML]


----------



## Nud3l (21. Jun 2012)

axo hier auch noch die das web.xml

[XML]<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <display-name>JaxWS</display-name>
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
</web-app>
[/XML]

sun-jaxws:
[XML]<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sun-web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Application Server 9.0 Servlet 2.5//EN" "http://www.sun.com/software/appserver/dtds/sun-web-app_2_5-0.dtd">
<sun-web-app error-url="">
  <class-loader delegate="true"/>
  <jsp-config>
    <property name="keepgenerated" value="true">
      <description>Keep a copy of the generated servlet class' java code.</description>
    </property>
  </jsp-config>
</sun-web-app>
[/XML]


Ich habe da noch eine frage zu ein weiteren Problem in mein maven skript was kann ich machen das bei dem folgen Aufruf keine timeout kommt? 

```
Downloading: http://maven.ocean.net.au/release/org/apache/maven/maven-plugin-api/maven-metadata.xml
Downloading: http://download.java.net/maven/2/org/apache/maven/maven-plugin-api/maven-metadata.xml
Downloading: http://maven.ocean.net.au/external/org/apache/maven/maven-plugin-api/maven-metadata.xml
Downloading: http://maven.ocean.net.au/snapshot/org/apache/maven/maven-plugin-api/maven-metadata.xml
Downloading: http://download.java.net/maven/2/org/apache/maven/maven-plugin-api/maven-metadata.xml
[WARNING] Could not transfer metadata org.apache.maven:maven-plugin-api/maven-metadata.xml from/to release.ocean.net.au (http://maven.ocean.net.au/release): Connect times out
[WARNING] Could not transfer metadata org.apache.maven:maven-plugin-api/maven-metadata.xml from/to external.ocean.net.au (http://maven.ocean.net.au/external): Connect times out
[WARNING] Could not transfer metadata org.apache.maven:maven-plugin-api/maven-metadata.xml from/to snapshot.ocean.net.au (http://maven.ocean.net.au/snapshot): Connect times out
```


----------



## DerFeivel (21. Jun 2012)

Kannst du mir bitte mal die Annotationen deiner implementierenden Klasse posten?


----------



## Nud3l (21. Jun 2012)

Hier der Coder:


```
@WebService(serviceName = "Zaehlpunkte", 
portName = "ZaehlpunkteSOAP", 
targetNamespace = "http://test.net/Daten/Zaehlpunkte/Service", 
endpointInterface = "net.test.daten.zaehlpunkte.service.Zaehlpunkte")
public class ZaehlpunkteImpl implements Zaehlpunkte {
```


----------



## DerFeivel (21. Jun 2012)

Hmm. Ok.

Worin unterscheiden sich generiertes und Ausgangs-WSDL ?


Wozu benötigst du den JSR-181 beim Jaxws-Plugin?


----------



## Nud3l (21. Jun 2012)

Alos wofür das JSR-181 ist weiß ich nicht. Ich habe das aus einem Beispiel, genau nach gelesen warum es gebraucht wird habe ich nicht.

Der größte unterschied sind eigentlich, die xsd Definition die werde ausgelagert und in einer separaten xsd eingebunden und da werden dann Längenangaben ignoriert usw. In meiner xsd wurden auch Veränderungen vorgenommen wie die ganzen Elementsbeschränkungs einfach ignoriert.


----------



## kama (21. Jun 2012)

hi,

ich habe mir mal die POM etwas genauer angeschaut...

[XML]
         <plugin>
                <groupId>org.jvnet.jaxb2.maven2</groupId>
                <artifactId>maven-jaxb2-plugin</artifactId>
                <version>0.8.1</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>generate</goal>
                        </goals>
                        <configuration>
                            <schemaDirectory>src/main/resources/schema</schemaDirectory>
                            <schemaIncludes>
                                <include>nab.xsd</include>
                            </schemaIncludes>
                            <generatePackage>com.pack.xml</generatePackage>
                            <generateDirectory>${basedir}/src/main/java</generateDirectory>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
 [/xml]

Da würde ich zuerst einmal das Schema Directory wie folgt setzen:


[XML]
         <plugin>
                <groupId>org.jvnet.jaxb2.maven2</groupId>
                <artifactId>maven-jaxb2-plugin</artifactId>
                <version>0.8.1</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>generate</goal>
                        </goals>
                       <configuration>
                          <schemaDirectory>src/main/xsd</schemaDirectory>
                          <generatePackage>com.pack.xml</generatePackage>
                      </configuration>
                    </execution>
                </executions>
            </plugin>
 [/xml]
Möglichst immer die Defaults der Plugins beachten und so wenig wie möglich konfigurieren...
Die XSD Dateien nach src/main/xsd legen. Generierten Code niemals nach src/... da alle Plugins immer nach target/irgendwas generieren...ausser man hat einen wirklich guten Grund...

Alternativ das jaxb2 plugin von Codehaus nutzen, da sind meiner Meinung bessere defaults für das Schema Verzeichnis enthalten (ist aber Geschmacksfrage..)

[xml]
           <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.0.2</version>
                <configuration>
                    <source>1.5</source>
                    <target>1.5</target>
                </configuration>
            </plugin>
[/xml]
Warum nicht eine aktuelle Version vom maven-compiler-plugin nutzen (aktuell 2.3.2)..


So jetzt zu jaxws-maven-plugin:
[xml]
            <!-- Plugin to generate JAXB classes and webservice interface -->
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>jaxws-maven-plugin</artifactId>
                <version>1.10</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>wsimport</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <wsdlDirectory>src\main\webapp\WEB-INF\wsdl</wsdlDirectory>
                    <sourceDestDir>${basedir}/gen/src/main/java</sourceDestDir>
                </configuration>
                <dependencies>
                    <dependency>
                        <groupId>javax.jws</groupId>
                        <artifactId>jsr181-api</artifactId>
                        <version>1.0-MR1</version>
                    </dependency>
                </dependencies>
            </plugin>
[/xml]
Grundsäztlich keine "\" in Maven immer "/"...
Weiterhin ist das codehaus Plugin veraltet und wird hier JAX-WS Maven plugin - Maven 2 JAX-WS Maven plugin &mdash; Java.net weitergeführt (steht auch auf der Web-Site Mojo - Maven 2 Jaxws maven plugin).

Dann hier auch die Plugin Defaults nutzen (src/wsdl) macht das Leben einfacher...Da auch zu beachten dass hier aktuellere Version vorhanden sind (org.jvnet.jax-ws-commons:jaxws-maven-plugin:2.2:wsimport).


So wenn man das Obige beachtet ist das build-helper-plugin überflüssig als auch der Zusätzliche Eintrag für das maven-clean-plugin .

So für das maven-surefire-plugin gilt auch: Aktuelle Versionen nutzen (2.12)...

[xml]
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.8.1</version>
                <configuration>
                    <parallel>methods</parallel>
                    <threadCount>10</threadCount>
                    <excludes>
                        <exclude>**/integrationstest/*IT.java</exclude>
                    </excludes>
                </configuration>
                <executions>
                    <execution>
                        <id>integration-tests</id>
                        <phase>integration-test</phase>
                        <goals>
                            <goal>test</goal>
                        </goals>
                        <configuration>
                            <skip>false</skip>
                            <excludes>
                                <exclude>none</exclude>
                            </excludes>
                            <includes>
                                <include>**/integrationstest/*IT.java</include>
                            </includes>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

[/xml]

Weiterhin ist der Ausschluss der Integrationstest nicht notwendig. Dazu ist noch zu bemerken, dass Integrationstest nicht per maven-surefire-plugin ausgeführt werden sondern mithilfe des maven-failsafe-plugin ausgeführt werden.

Die Defaults für maven-surefire-plugin sind *Test.java, Test*.java und *TestCase.java während für die Integrationstests *IT.java, IT*.java und ITCase.java

Das Glassfish-plugin würde ich in ein Profile packen, damit ich es bei Bedarf nutzen kann...spätestens bei einer Release wird das Nervig...
[xml]

            <plugin>
                <groupId>org.glassfish.maven.plugin</groupId>
                <artifactId>maven-glassfish-plugin</artifactId>
                <version>2.1</version>
                <configuration>
                    <glassfishDirectory>C:\Programme\Glassfish\glassfish</glassfishDirectory>
                    <user>admin</user>
                    <adminPassword>adminadmin</adminPassword>
                    <debug>true</debug>
                    <echo>true</echo>
                    <domain>
                        <name>domain1</name>
                        <adminPort>4848</adminPort>
                        <resources>
                            <jdbcDataSource>
                                <name>jdbc/xe</name>
                                <type>dataSource</type>
                                <poolName>oracle</poolName>
                                <className>oracle.jdbc.pool.OracleDataSource</className>
                                <description>Some JDBC Connection Pool</description>
                                <allowNonComponentCallers>false</allowNonComponentCallers>
                                <validateConnections>true</validateConnections>
                                <validationMethod>metaData</validationMethod>
                                <properties>
                                    <property>
                                        <name>DataSourceName</name>
                                        <value>OracleDataSource</value>
                                    </property>
                                    <property>
                                        <name>password</name>
                                        <value>admin</value>
                                    </property>
                                    <property>
                                        <name>user</name>
                                        <value>admin</value>
                                    </property>
                                    <property>
                                        <name>URL</name>
                                        <value>jdbcracle:thindb.....</value>
                                    </property>
                                </properties>
                            </jdbcDataSource>
                        </resources>
                    </domain>
                    <components>
                        <component>
                            <name>web-service</name>
                            <artifact>${project.basedir}/target/web-service.war</artifact>
                        </component>
                    </components>
                </configuration>
                <executions>
                    <execution>
                        <id>deploy-glassfish</id>
                        <phase>pre-integration-test</phase>
                        <goals>
                            <goal>create-domain</goal>
                            <goal>deploy</goal>
                        </goals>
                    </execution>
                    <!-- <execution> <id>cleanup-glassfish</id> <phase>post-integration-test</phase> 
                        <goals> <goal>delete-domain</goal> </goals> </execution> -->
                </executions>
            </plugin>
[/XML]

Gruß
Karl-Heinz Marbaise


----------



## Nud3l (22. Jun 2012)

Danke für deine Hilfe ich habe jetzt versucht alles umzustellen. 

Ich habe jetzt das Problem das die generierten Java Klassen nur im target Ordner auf tauchen. Was muss ich denn machen, dass ich die auch benutzen kann. Einen zusätzlichen Ordner als zusätzliches ziel definieren?

Ich habe noch eine ganz allgemeine Frage zu Maven. Also dies ist mein erstes Maven Projekt und habe alles irgendwie zusammen gebastelt aus irgendwelche Beispielen, die ich über Google gefunden habe. Gibt es irgendwo eine Seite wo man die ganze Plugins findet und suchen kann.


----------



## kama (22. Jun 2012)

Hallo,



Nud3l hat gesagt.:


> Ich habe jetzt das Problem das die generierten Java Klassen nur im target Ordner auf tauchen. Was muss ich denn machen, dass ich die auch benutzen kann. Einen zusätzlichen Ordner als zusätzliches ziel definieren?


Die Klassen solltest Du ohne Probleme nutzen können auch in Eclipse...wenn Du m2e installiert hast...und in IntelliJ oder Netbeans sollte das sowieso gehen....



Nud3l hat gesagt.:


> Ich habe noch eine ganz allgemeine Frage zu Maven. Also dies ist mein erstes Maven Projekt und habe alles irgendwie zusammen gebastelt aus irgendwelche Beispielen, die ich über Google gefunden habe. Gibt es irgendwo eine Seite wo man die ganze Plugins findet und suchen kann.


Zwei primäre Anlauf Punkte:

Maven - Available Plugins
Plugins

(selbstverständlich Tante Google nicht vergessen).

und das hier:

Google Project Hosting


Weiterhin

Books / Support Sonatype.com

Auch ganz gut:
Maven - Users Centre (Index, Kategorie etc.) mal durch gehen da steht eine ganze Menge drin...

Die Guides sind auch zu empfehlen:

Maven - Maven Documentation

Gruß
Karl-Heinz Marbaise


----------



## Nud3l (22. Jun 2012)

Sorry war etwas früh am Morgen, also habe jetzt aus den target/generated-sources/.. ein Sourcefolder gemacht, dass sollte das Problem lösen. 

Bei den jaxws-maven-plugin durfte ich nicht die neustes Version nehmen, da es auf eine andere Version von javax.xml.ws.Service zurückgreift und ich dann einen Fehler in den generierten Code habe.

Danke für die Seiten werde mir das mal ansehen.


----------

