Intro
JAX-WS 2.0 aka JSR-224 is the Web Services specification of the JEE 5 stack. The documentation of Sun is very limited, they basically assume you just generate all code using one of their tools. Here is an attempt to describe a manual-code-centric approach.
Dependencies
<dependency> <groupId>javax.xml</groupId> <artifactId>jaxb-api</artifactId> <version>2.0</version> </dependency> <dependency> <groupId>javax.xml</groupId> <artifactId>jaxb-impl</artifactId> <version>2.0.2</version> </dependency> <dependency> <groupId>javax.xml.ws</groupId> <artifactId>jaxws-api</artifactId> <version>2.0</version> </dependency> <dependency> <groupId>com.sun.xml</groupId> <artifactId>jaxws-rt</artifactId> <version>2.0.1</version> </dependency> <dependency> <groupId>com.sun.xml</groupId> <artifactId>jaxws-tools</artifactId> <version>2.0.1</version> </dependency> <dependency> <groupId>javax.xml.soap</groupId> <artifactId>saaj-api</artifactId> <version>1.3</version> </dependency> <dependency> <groupId>com.sun.xml.messaging.saaj</groupId> <artifactId>saaj-impl</artifactId> <version>1.3</version> </dependency> <dependency> <groupId>com.sun.xml.stream.buffer</groupId> <artifactId>streambuffer</artifactId> <version>0.1</version> </dependency>
Unfortunately the Maven repository is not up-to-date on these libraries so you have to do a lot of mvn install:install-file
.
JAX-WS uses StAX, so you also need to include a StAX implementation. I picked stax-1.2.0.
Basic Client Code with JAXB binding
After days of surfing I concluded that JAX-WS is so poorly documented that I do not have a clue of how to use it. I reverted to writing and the SOAP message myself. I turned out be take only a couple of lines of code. And it enabled me to use my own custom marshaller.
SOAPConnectionFactory connectionFactory = SOAPConnectionFactory.newInstance(); SOAPMessage message = messageFactory.createMessage(); Document document = documentBuilder.newDocument(); jaxbMarshaller.marshalToNode(payload, document); message.getSOAPBody().addDocument(document); SOAPConnection connection = connectionFactory.createConnection(); SOAPMessage response = connection.call(message, url);
Todos
Clean up the list of dependencies now that JAX-WS is not being used.
Resources
- JAXB article: JAXB 2.0 Java-to-Schema with annotations.
- The JEE 5 Tutorial: http://java.sun.com/javaee/5/docs/tutorial/doc/JAXWS.html#wp72279.
- The reference implementation: https://jax-ws.dev.java.net/.
- The forum on java.net http://forums.java.net/jive/forum.jspa?forumID=46.