Issue in using Annotate Plugin(Annox) with "cxf-codegen-plugin" - web-services

I am developing RESTFul services in my application. We are using 'cxf-codegen-plugin' to generate the JAXB classes from the schema. For a given requirement, I need to add some annotation to the generated JAXB classes and I was trying to use Annotate Plugin(Annox) for this but having issue in using it. I am getting org.xml.sax.SAXParseException: Using "http://annox.dev.java.net" customizations requires the "-Xannotate" switch to enable this plug-in.
This is how I have the setup in my codebase:
1. The WSDL refer to a XSD where I have the definitions of annotations.
2. pom.xml is using 'cxf-codegen-plugin' to generate the jabx classes.
3. The RESTFul service need some additional annotation on the generated classes, so I am trying ti use Annox to get the work done.
This is the snippet from the XSD:
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="gov.nih.nci.po.webservices.types"
xmlns:tns="gov.nih.nci.po.webservices.types" elementFormDefault="qualified"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" jaxb:version="2.1"
xmlns:annox="http://annox.dev.java.net"
xmlns:ja="http://annox.dev.java.net/org.codehaus.jackson.annotate"
xsi:schemaLocation="http://java.sun.com/xml/ns/jaxb http://java.sun.com/xml/ns/jaxb/bindingschema_2_0.xsd
http://www.w3.org/2001/XMLSchema http://www.w3.org/2001/XMLSchema.xsd"
jaxb:extensionBindingPrefixes="xjc annox">
<complexType name="PersonRole" abstract="true">
<annotation>
<appinfo>
<annox:annotate>
<ja:JsonTypeInfo use="CLASS" include="PROPERTY" property="#class"/>
</annox:annotate>
</appinfo>
</annotation>
<complexContent>
<extension base="tns:Role">
<sequence>
<element name="personId" type="long" />
</sequence>
</extension>
</complexContent>
</complexType>
</schema>
and this is how I want my generated class to look like:
#XmlAccessorType(XmlAccessType.FIELD)
#XmlType(name = "PersonRole", propOrder = { "personId" })
#XmlSeeAlso({ HealthCareProvider.class, OrganizationalContact.class,
ClinicalResearchStaff.class })
#JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "#class")
public abstract class PersonRole extends Role {
And below is the entry from pom.xml:
<plugin>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-codegen-plugin</artifactId>
<version>${cxf.version}</version>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
<executions>
<execution>
<id>generate-sources</id>
<phase>generate-sources</phase>
<configuration>
<sourceRoot>${project.build.directory}/generated-sources</sourceRoot>
<wsdlOptions>
<wsdlOption>
<wsdl>${basedir}/src/main/resources/PersonService.wsdl</wsdl>
<extraargs>
<extraarg>-xjc-Xannotate</extraarg> </extraargs>
</wsdlOption>
</wsdlOption>
</wsdlOptions>
</configuration>
<goals>
<goal>wsdl2java</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>org.jvnet.jaxb2_commons</groupId>
<artifactId>jaxb2-basics-annotate</artifactId>
<version>0.6.0</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-core-asl</artifactId>
<version>${jackson.version}</version>
<scope>compile</scope>
</dependency>
</dependencies>
</plugin>
Also I noticed that if I give some wrong value/configuration in xsd under JsonTypeInfo section, the build fail & complains (like mandatory field 'use' is missing etc) -- so I am assuming that the Annox plug-in is enabled & trying to do something. but then when I use above configurations, the build is failing with SAXParseException: Using "http://annox.dev.java.net" customizations requires the "-Xannotate" switch to enable this plug-in.
Could anybody please suggest as how this can be fixed?

Related

How to fix ClassCastException when XMLSignatureFactory used in a WSO2-AM Mediator?

I've created a new WSO2 Api Manager Mediator, which'll responsible for filtering Signed SOAP Envelopes. In the request, I receive a tag, which I want to parse with XMLSignatureFactory.
Digital Signature API:
https://www.oracle.com/technetwork/articles/javase/dig-signature-api-140772.html
Input:
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
Id="SIG-1F873A0D2A87BCE8721558280884557279">
<ds:SignedInfo>
...
<ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha512"/>
<ds:Reference URI="#id-349F63E22F25E7CF2915581003601374">
<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha512"/>
<ds:DigestValue>..Base64 encoded value...</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>..Base64 encoded value...</ds:SignatureValue>
<ds:KeyInfo Id="KI-1F873A0D2A87BCE8721558280884517277">
...
</ds:KeyInfo>
</ds:Signature>
Source code:
XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM");
// Find Signature element.
NodeList nl = doc.getElementsByTagNameNS(XMLSignature.XMLNS, "Signature");
if (nl.getLength() == 0) {
throw new Exception("Cannot find Signature element");
}
// Create a DOMValidateContext and specify a KeySelector
// and document context.
DOMValidateContext valContext = new DOMValidateContext(cert.getPublicKey(), nl.item(0));
// Unmarshal the XMLSignature.
XMLSignature signature = fac.unmarshalXMLSignature(valContext);
// Validate the XMLSignature.
boolean coreValidity = signature.validate(valContext);
// Check core validation status.
if (coreValidity == false) {
System.err.println("Signature failed core validation");
}
In a standard Java SE program it works fine, but when I use it in a Mediator, I've got the following error:
Exception occured! java.lang.ClassCastException: org.jcp.xml.dsig.internal.dom.DOMXMLSignatureFactory cannot be cast to javax.xml.crypto.dsig.XMLSignatureFactory
at javax.xml.crypto.dsig.XMLSignatureFactory.findInstance(XMLSignatureFactory.java:202)
at javax.xml.crypto.dsig.XMLSignatureFactory.getInstance(XMLSignatureFactory.java:250)
Maven config:
...
<java.version>1.8</java.version>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<bouncycastle.version>1.61</bouncycastle.version>
...
<dependency>
<groupId>org.apache.synapse</groupId>
<artifactId>synapse-core</artifactId>
<version>2.1.7-wso2v80</version>
</dependency>
<dependency>
<groupId>org.apache.ws.commons.axiom.wso2</groupId>
<artifactId>axiom</artifactId>
<version>1.2.11.wso2v11</version>
</dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>${bouncycastle.version}</version>
</dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcpkix-jdk15on</artifactId>
<version>${bouncycastle.version}</version>
</dependency>
...
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<version>2.3.7</version>
<extensions>true</extensions>
<configuration>
<instructions>
<Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
<Bundle-Name>${project.artifactId}</Bundle-Name>
<!-- <Export-Package>mediator</Export-Package> -->
<!--<DynamicImport-Package>*</DynamicImport-Package>-->
<Import-Package>
!javax.xml.crypto.*; version="???",
org.apache.xml.security;version="0.0.0",
*
</Import-Package>
</instructions>
</configuration>
</plugin>
I guess this is happening due to package javax.xml.crypto.; version="xxx" exported with wso2 wss4j bundle is conflicting with the default javax.xml.crypto. package exported by the JDK.
In order to overcome this issue, you may pack the mediator as bundle ( OSGI bundle and place it in dropins folder ) and restrict that specific import in the mediator as follows.
Please start the AM in osgiConsole ( with flag -DosgiConsole ) and check the version of the javax.xml.crypto.* package which is being exported by wss4j. Then exclude that specific version from the import section of the mediator.
A sample code is as follows.
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<version>2.3.7</version>
<extensions>true</extensions>
<configuration>
<instructions>
<Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
<Bundle-Name>${project.artifactId}</Bundle-Name>
<Import-Package>
!javax.xml.crypto.*; version="xxx",
org.apache.xml.security;version="0.0.0",
*
</Import-Package>
</instructions>
</configuration>
</plugin>
Thanks

JWSC for weblogic 12c with Maven

We are in the process of upgrading from Weblogic 10g to 12c. A portion of our code base is webservices so we were using weblogic-maven-plugin:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>weblogic-maven-plugin</artifactId>
<version>2.9.5</version>
<configuration>
<contextPath>ws</contextPath>
<keepGenerated>true</keepGenerated>
</configuration>
<executions>
<execution>
<phase>compile</phase>
<goals>
<goal>jwsc</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>com.sun</groupId>
<artifactId>tools</artifactId>
<version>1.5</version>
<scope>system</scope>
<systemPath>${java.home}/../lib/tools.jar</systemPath>
</dependency>
<dependency>
<groupId>weblogic</groupId>
<artifactId>weblogic</artifactId>
<version>${weblogic.version}</version>
<scope>system</scope>
<systemPath>${bea.lib}/weblogic.jar</systemPath>
</dependency>
</dependencies>
</plugin>
The build error I see is
[ERROR] Failed to execute goal org.codehaus.mojo:weblogic-maven-plugin:2.9.5:jwsc (default) on project webService: Execution default of goal org.codehaus.mojo:weblogic-maven-plugin:2.9.5:jwsc failed: Plugin org.codehaus.mojo:weblogic-maven-plugin:2.9.5 or one of its dependencies could not be resolved: Failure to find weblogic:webservices:jar:10.3.6 in http://ccicusbuild1/nexus/content/groups/public/ was cached in the local repository, resolution will not be reattempted until the update interval of central has elapsed or updates are forced -> [Help 1]
Deeper inspection shows that the plugin has a dependency on weblogic:weblogic:10.3.6 and weblogic:webservices:10.3.6. As shown in the previous code, I can override weblogic:weblogic:10.3.6 with weblogic:weblogic:12.1.1. The problem is webservices.jar is no longer apart of weblogic 12c, so I have nothing to override the dependency with, nor can I exclude it.
The page for weblogic-maven-plugin (http://mojo.codehaus.org/weblogic-maven-plugin/) mentions support for 12c, but doesn't give any details.
The goal is to be able to run JWSC through maven. Is there a tweak to the plugin configuration that I can do to make it work, or is there another plugin, or do I need to bite the bullet and run the code with the ant plugin?
This was the eventual solution we used. If some one else has something better, please post it.
plugins portion of pom.xml
<plugins>
<!--
Below contains a work around to build web services for Weblogic 12c.
weblogic-maven-plugin was how things were done (and was much cleaner)
but at the time of this work around, it doesn't appear to support Weblogic 12c.
If in the future, weblogic-maven-plugin or some other plugin become known,
it should replace both parts of the work around.
-->
<!-- START OF WORK AROUND part 1-->
<plugin>
<groupId>org.codehaus.gmaven</groupId>
<artifactId>gmaven-plugin</artifactId>
<version>1.3</version>
<executions>
<execution>
<id>set-main-artifact</id>
<phase>package</phase>
<goals>
<goal>execute</goal>
</goals>
<configuration>
<source>
project.artifact.setFile(new File(project.build.directory+'/'+project.artifactId+'-'+project.version+'.war'))
</source>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.6</version>
<executions>
<execution>
<phase>prepare-package</phase>
<configuration>
<target>
<property name="maven.compile.classpath" refid="maven.compile.classpath" />
<property name="maven.runtime.classpath" refid="maven.runtime.classpath" />
<property name="maven.test.classpath" refid="maven.test.classpath" />
<property name="maven.plugin.classpath" refid="maven.plugin.classpath" />
<ant antfile="src/main/ant/build.xml" target="all" />
</target>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>org.apache.ant</groupId>
<artifactId>ant</artifactId>
<version>1.7.1</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>ant-contrib</groupId>
<artifactId>ant-contrib</artifactId>
<version>1.0b2</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>weblogic</groupId>
<artifactId>weblogic</artifactId>
<version>${weblogic.version}</version>
<scope>system</scope>
<systemPath>${bea.lib}/weblogic.jar</systemPath>
</dependency>
<dependency>
<groupId>com.sun</groupId>
<artifactId>tools</artifactId>
<version>1.5.0</version>
<scope>system</scope>
<systemPath>${java.home}/../lib/tools.jar</systemPath>
</dependency>
</dependencies>
</plugin>
<!-- END OF WORK AROUND part 1 -->
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>2.1.1</version>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
<!-- START OF WORK AROUND part 2 -->
<executions>
<execution>
<id>default-war</id>
<phase>none</phase>
</execution>
</executions>
<!-- END OF WORK AROUND part 2 -->
</plugin>
</plugins>
build.xml
<project name="build-webservice" default="all">
<target name="all" depends="build.webService" />
<path id="maven_plugin_classpath">
<pathelement path="${maven.plugin.classpath}" />
</path>
<path id="maven_runtime_classpath">
<pathelement path="${maven.compile.classpath}" />
<pathelement path="${maven.runtime.classpath}" />
<pathelement path="${maven.plugin.classpath}" />
<pathelement path="${weblogic.jar}" />
</path>
<taskdef name="jwsc"
classname="weblogic.wsee.tools.anttasks.JwscTask"
classpath="${weblogic.jar}"
classpathref="maven_plugin_classpath"
/>
<target name="build.webService" description="Compile the web services if not up2date">
<!--
Eclipse compiles and places classes into target/classes when the workspace is building.
If this folder exists when jwsc runs, then any classes that are already compiled will NOT
be included in the final WAR file. Thus, this directory is removed prior to created the
webServices WAR fie.
-->
<delete dir="target/classes" />
<jwsc srcdir="${project.build.sourceDirectory}"
destDir="target"
classpathref="maven_runtime_classpath"
keepGenerated="yes"
applicationxml="${project.build.directory}/application.xml"
fork="true"
memorymaximumsize="256m"
verbose="true"
debug="on"
>
<module contextPath="ws" name="${project.artifactId}-${project.version}">
<jwsfileset srcdir=".">
<include name="**/*.java" />
<exclude name="**/*Test.java" />
</jwsfileset>
</module>
</jwsc>
</target>
</project>
Overall description:
War plugin execution is overwritten so that it isn't run
The compiling and packaging is handled in ant by JwscTask
gmaven plugin is used inform maven that it should use the ant generated war as the artifact
Notes:
Alternatives for gmaven were attachartifact ant task and build-helper-maven-plugin as specified in How to register a custom built jar file as maven main artifact?, but neither worked. Both resulted in An attached artifact must have a different ID than its corresponding main artifact.

wsimport fail with maven

I'm trying to create an ssl webservice client using maven and netbeans(7.2).
The webservice is perfectly working and I test it using an ant project.
When I try to build the project and generate webservice stubs I get this error:
Failed to execute goal org.jvnet.jax-ws-commons:jaxws-maven-plugin:2.2:wsimport (wsimport-generate-test_project_ws_v1) on project mavenproject3: Error executing: wsimport [-keep, -s, C:\Users\no_name\Documents\NetBeansProjects\mavenproject3\target\generated-sources\jaxws-wsimport, -verbose, -encoding, UTF-8, -extension, -Xnocompile, -catalog, C:\Users\no_name\Documents\NetBeansProjects\mavenproject3\src\jax-ws-catalog.xml, -wsdllocation, https://localhost:8181/test_project_ws_v1/test_project_ws_v1?wsdl, file:/C:/Users/no_name/Documents/NetBeansProjects/mavenproject3/src/wsdl/localhost_8181/test_project_ws_v1/test_project_ws_v1.wsdl]: UndeclaredThrowableException: javax.xml.bind.annotation.XmlElementRef.required() -> [Help 1]
This is my pom (generated by netbeans)
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.procc</groupId>
<artifactId>mavenproject3</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>mavenproject3</name>
<url>http://maven.apache.org</url>
<build>
<resources>
<resource>
<targetPath>META-INF</targetPath>
<directory>src</directory>
<includes>
<include>jax-ws-catalog.xml</include>
<include>wsdl/**</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.jvnet.jax-ws-commons</groupId>
<artifactId>jaxws-maven-plugin</artifactId>
<version>2.2</version>
<executions>
<execution>
<goals>
<goal>wsimport</goal>
</goals>
<configuration>
<wsdlFiles>
<wsdlFile>localhost_8181/test_project_ws_v1/test_project_ws_v1.wsdl</wsdlFile>
</wsdlFiles>
<wsdlLocation>https://localhost:8181/test_project_ws_v1/test_project_ws_v1?wsdl</wsdlLocation>
<staleFile>${project.build.directory}/jaxws/stale/test_project_ws_v1.stale</staleFile>
</configuration>
<id>wsimport-generate-test_project_ws_v1</id>
<phase>generate-sources</phase>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>javax.xml</groupId>
<artifactId>webservices-api</artifactId>
<version>1.4</version>
</dependency>
</dependencies>
<configuration>
<sourceDestDir>${project.build.directory}/generated-sources/jaxws-wsimport</sourceDestDir>
<xnocompile>true</xnocompile>
<verbose>true</verbose>
<extension>true</extension>
<catalog>${basedir}/src/jax-ws-catalog.xml</catalog>
</configuration>
</plugin>
</plugins>
</build>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.sun.xml.ws</groupId>
<artifactId>webservices-rt</artifactId>
<version>1.4</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>
Thanks.
I was having the same error recently.
It seems that it happens because wsimport messes with 2.1 and 2.2 versions of jaxb.
I was able to generate the Web Services sources correctly by editing the project pom.xml and adding a <target>2.1</target> tag to the configuration of each imported wsdl, like this:
<execution>
<goals>
<goal>wsimport</goal>
</goals>
<configuration>
<wsdlFiles>
<wsdlFile>path/to/file.wsdl</wsdlFile>
</wsdlFiles>
<wsdlLocation>http://path/to/webservice?wsdl</wsdlLocation>
<staleFile>path/to/file.stale</staleFile>
<target>2.1</target>
</configuration>
<id>wsimport-generate-WebServiceName</id>
<phase>generate-sources</phase>
</execution>
Hope it helps whoever is having this issue.
We had a similar issue. When doing a wsimport we got a command line error stating -encoding was an invalid parameter.
Looking in the POM, and the plugin section for jaxws-maven-plugin the following dependency existed:
<dependencies>
<dependency>
<groupId>com.sun.xml.ws</groupId>
<artifactId>jaxws-tools</artifactId>
<version>2.2.5</version>
</dependency>
</dependencies>
Removing this fixed the issue. We were also using version 2.3 of jaxws-maven-plugin
I could build on one machine but not another - the issue was caused by environment variables
Check your maven environment variables, M2 and M2_HOME
M2_HOME - "<Apache-maven-root-directory>" e.g. ("C:\Tools\apach-maven")
M2 - "%M2_HOME%\bin" (For windows machine)

externally create jaxb annotations for class

So, usually I apply JAXB annotations in the code as follows:
package com.example;
#XmlRootElement(name = "Foo", namespace = "example.com")
#XmlType(name = "Foo", namespace = "example.com")
public class Foo {
...
}
Foo is a java class that is used to communicate with web services (via Spring/CXF). The above annotations, help generate the XML Schema in the wsdl appropriately.
I have hit a situation where I can not modify the class itself, but I can provide an jaxb external binding file to the code that generates the schema. Note that the #XmlRootElement exists in the class.
How do I write an equivalent binding file that does what the above annotations do?
If you just need to add #XmlType(name = "Foo", namespace = "example.com") annotation to the generated class you can use JAXB Annotate Plugin.
Here is documentation about how to define annotations in external binding files.
If you're using CXF and maven you can also you cxf-codegen-plugin somehow like this
<plugin>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-codegen-plugin</artifactId>
<version>${cxf.version}</version>
<executions>
<execution>
<id>generate-sources</id>
<phase>generate-sources</phase>
<goals>
<goal>wsdl2java</goal>
</goals>
<configuration>
<sourceRoot>${service.src.dir}</sourceRoot>
<wsdlOptions>
<wsdlOption>
<wsdl>service.wsdl</wsdl>
<extraargs>
<extraarg>-xjc-Xannotate</extraarg>
<extraarg>-b</extraarg>
<extraarg>${wsdl.dir}/bindings.xjb</extraarg>
</extraargs>
</wsdlOption>
</wsdlOptions>
</configuration>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>org.jvnet.jaxb2_commons</groupId>
<artifactId>jaxb2-basics-annotate</artifactId>
<version>${jaxb.commons.version}</version>
</dependency>
</dependencies>
</plugin>
You can also use maven-jaxb2-plugin:
<plugin>
<groupId>org.jvnet.jaxb2.maven2</groupId>
<artifactId>maven-jaxb2-plugin</artifactId>
<version>${maven-jaxb2.version}</version>
<executions>
<execution>
<id>process-xsd</id>
<goals>
<goal>generate</goal>
</goals>
<phase>generate-sources</phase>
<configuration>
<schemaIncludes>
<include>**/*.xsd</include>
</schemaIncludes>
<bindingIncludes>
<include>**/*.xjb</include>
</bindingIncludes>
<generateDirectory>${jaxb.src.dir}</generateDirectory>
<extension>true</extension>
<args>
<arg>-Xannotate</arg>
</args>
<plugins>
<plugin>
<groupId>org.jvnet.jaxb2_commons</groupId>
<artifactId>jaxb2-basics-annotate</artifactId>
<version>${jaxb.commons.version}</version>
</plugin>
</plugins>
</configuration>
</execution>
</executions>
</plugin>
Here is sample binding file:
<jaxb:bindings
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
xmlns:annox="http://annox.dev.java.net"
version="2.0">
<jaxb:bindings schemaLocation="schema.xsd" node="/xs:schema">
<jaxb:bindings node="//xs:complexType[#name='Foo']">
<annox:annotate target="class">
<annox:annotate annox:class="javax.xml.bind.annotation.XmlType" name="Foo" namespace = "example.com"/>
</annox:annotate>
</jaxb:bindings>
</jaxb:bindings>
</jaxb:bindings>
If you need to modify #XmlRootElement too, just add another one annox:annotate element:
<annox:annotate annox:class="javax.xml.bind.annotation.XmlRootElement" name="Foo" namespace = "example.com"/>
Note: I'm the EclipseLink JAXB (MOXy) lead and a member of the JAXB (JSR-222) expert group.
The MOXy implementation of JAXB has an external mapping file that you can use to provide the metadata.
<?xml version="1.0"?>
<xml-bindings
xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"
package-name="com.example">
<java-types>
<java-type name="Customer">
<xml-type name="Foo" namespace="example.com"/>
</java-type>
</java-types>
</xml-bindings>
For More Information
http://blog.bdoughan.com/2010/12/extending-jaxb-representing-annotations.html

accessing a web service using axis and maven

Im trying to figure out how to access Web Services in Java using Axis.
As far as I understand, Here's what I need to do :
Use WSDL File + Axis tools to generate Java files.
Compile and package generated Java files and then consume those objects by using connection methods on these.
In trying to do this, here's where I'm stuck:
I picked a random Web Service from http://www.service-repository.com/
I used the axistools-maven-plugin in the following manner:
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>axistools-maven-plugin</artifactId>
<configuration>
<urls>
<!--<url>http://soap.amazon.com/schemas2/AmazonWebServices.wsdl</url>-->
<!--<url>http://ws.xwebservices.com/XWebEmailValidation/V2/XWebEmailValidation.wsdl</url>-->
<url>http://mathertel.de/AJAXEngine/S02_AJAXCoreSamples/OrteLookup.asmx?WSDL</url>
</urls>
<!--<sourceDirectory>${project.build.sourceDirectory}/wsdl</sourceDirectory>-->
<packageSpace>com.company.wsdl</packageSpace>
<testCases>true</testCases>
<serverSide>true</serverSide>
<subPackageByFileName>true</subPackageByFileName>
<outputDirectory>${project.build.directory}/src/generated-sources</outputDirectory>
</configuration>
<executions>
<execution>
<phase>generate-sources</phase>
<goals>
<goal>wsdl2java</goal>
</goals>
</execution>
</executions>
</plugin>
Here's the issue:
I can successfully run mvn generate-sources and it does generate the Java files. But I can't seem to compile these Java files.
When I run mvn clean install it gives me a bunch of compile errors. What step am I missing ?
Based on your answer to one of my comment, my suggestion would be to use a JAX-WS implementation like JAX-WS RI - which is included in Java 6 - or Apache CXF (both are IMO much better WS stacks than the outdated Axis).
Here is an example based on JAX-WS RI and its jaxws-maven-plugin:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.stackoverflow</groupId>
<artifactId>Q3479139</artifactId>
<version>1.0-SNAPSHOT</version>
<name>Q3479139</name>
<url>http://maven.apache.org</url>
<repositories>
<repository>
<id>maven2-repository.dev.java.net</id>
<name>Java.net Repository for Maven 2</name>
<url>http://download.java.net/maven/2</url>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>maven2-repository.dev.java.net</id>
<url>http://download.java.net/maven/2</url>
</pluginRepository>
</pluginRepositories>
<dependencies>
<dependency>
<groupId>com.sun.xml.ws</groupId>
<artifactId>jaxws-rt</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jaxws-maven-plugin</artifactId>
<version>1.12</version>
<executions>
<execution>
<goals>
<goal>wsimport</goal>
</goals>
<configuration>
<wsdlUrls>
<wsdlUrl>http://ws.xwebservices.com/XWebEmailValidation/V2/XWebEmailValidation.wsdl</wsdlUrl>
</wsdlUrls>
<!-- The name of your generated source package -->
<packageName>com.example.myschema</packageName>
<!-- generate artifacts that run with JAX-WS 2.0 runtime -->
<target>2.0</target>
<!-- Specify where to place generated source files -->
<sourceDestDir>${project.build.directory}/generated-sources/wsimport</sourceDestDir>
</configuration>
</execution>
</executions>
<!-- if you want to use a specific version of JAX-WS, you can do so like this -->
<dependencies>
<dependency>
<groupId>com.sun.xml.ws</groupId>
<artifactId>jaxws-tools</artifactId>
<version>2.2.1</version>
</dependency>
</dependencies>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
And here is a very basic test case (part of the maven project) demonstrating the invocation of the web service using the generated classes:
package com.example.myschema;
import junit.framework.TestCase;
public class EmailValidationTest extends TestCase {
XWebEmailValidationInterface service = new EmailValidation().getEmailValidation();
ValidateEmailRequest request = new ValidateEmailRequest();
ValidateEmailResponse response = null;
public void testEmails() {
request.setEmail("foo#bar.com");
response = service.validateEmail(request);
assertEquals("EMAIL_SERVER_NOT_FOUND", response.getStatus());
request.setEmail("foo#gmail.com");
response = service.validateEmail(request);
assertEquals("NOT_VALID", response.getStatus());
}
}