action="http://www.helloplanet.com.br/jaxws/sayHello") @WebResult(name="Greeting", targetNamespace="http://www.helloplanet.com.br/jaxws/sayhello/result") public String sayHello(@WebParam(name="PlanetName", targetNamespace="http://www.helloplanet.com.br/jaxws/domain/planet") @XmlElement(required=true, nillable=false) Planet planet);}Repare que a nossa interface renomeia o metodo, parametro e resultado retornado. Outro ponto importante e a anotacao @XmlElement que efetuara a validacao do parametro para o servico (necessario ter sobrescrito a jaxb api conforme descrito no comeco do artigo). Agora vamos criar o codigo da nossa classe. Para isso, clique com o botao direito sobre a pasta "src/main/java" e selecione New -> Class, configure o package como "br.com.exemplo.ws.impl", nomeie a classe como HelloPlanetImpl e adicione o seguinte codigo:package br.com.exemplo.ws.impl;import javax.jws.WebService;import com.sun.xml.ws.developer.SchemaValidation;import br.com.exemplo.ws.HelloPlanet;import br.com.exemplo.ws.domain.Planet;@SchemaValidation@WebService(endpointInterface="br.com.exemplo.ws.HelloPlanet", portName="HelloPlanetPort", serviceName="HelloPlanet")public class HelloPlanetImpl implements HelloPlanet { public String sayHello(Planet planet) { return "Hello " + planet.getName() + "! Your id is: " + planet.getId() + " and your distance is: " + planet.getDistance(); }}Neste ponto, voce ainda deve estar vendo um erro no seu projeto. A classe Planet, que e recebida como parametro pelo metodo (operacao do servico) ainda nao existe, entao vamos cria-la. Para isso, clique com o botao direito sobre a pasta "src/main/java" e selecione New -> Class, configure o package como "br.com.exemplo.ws.domain", nomeie a classe como Planet e adicione o seguinte codigo:package br.com.exemplo.ws.domain;import javax.xml.bind.annotation.XmlAccessType;import javax.xml.bind.annotation.XmlAccessorType;import javax.xml.bind.annotation.XmlElement;import javax.xml.bind.annotation.XmlRootElement;@XmlRootElement(name="Planet", namespace="http://www.helloplanet.com.br/jaxws/domain/planet")@XmlAccessorType(XmlAccessType.FIELD)public class Planet { @XmlElement(name="ID", required=true, nillable=true) private Integer id; @XmlElement(name="Name", required=false, nillable=false) private String name; @XmlElement(name="Distance", required=true, nillable=false) private Double distance; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Double getDistance() { return distance; } public void setDistance(Double distance) { this.distance = distance; } }Pronto! Agora vamos compilar o projeto. Para isso, clique com o botao direto sobre o arquivo pom.xml e selecione "Run as -> Maven Install". Aguarde o maven baixar as dependencias e compilar o projeto. Ao final do processo de compilacao voce devera ver uma mensagem semelhante a esta:[INFO] ------------------------------------------------------------------------[INFO] BUILD SUCCESS[INFO] ------------------------------------------------------------------------[INFO] Total time: 5.439s[INFO] Finished at: Wed Dec 12 20:10:13 BRST 2012[INFO] Final Memory: 10M/25M[INFO] ------------------------------------------------------------------------Verifique a pasta target do seu projeto, e dentro, devera existir o arquivo helloplanet-jaxws.war. Este arquivo sera jogado dentro da pasta webapps do tomcat. Apos copiar o arquivo, acesse a URL:http://localhost:8080/helloplanet-jaxws/hello?wsdlE voce vera o wsdl pertinente ao seu servico. Parabens, voce criou seu primeiro servico utilizando JaxWS e ele esta disponivel em: http://localhost:8080/helloplanet-jaxws/helloCaso tenha percebido, o @XmlElement nao gerou a validacao corretamente para o servico (xml retirado de exemplo de consumo utilizando SoapUI). <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:jax="http://www.helloplanet.com.br/jaxws" xmlns:plan="http://www.helloplanet.com.br/jaxws/domain/planet"> <soapenv:Header/> <soapenv:Body> <jax:SayHello> <!--Optional:--> <plan:PlanetName> <ID>?</ID> <!--Optional:--> <Name>?</Name> <Distance>?</Distance> </plan:PlanetName> </jax:SayHello> </soapenv:Body></soapenv:Envelope>Repare que o parametro PlanetName esta demarcado como opcional (trecho retirado do contrato gerado) enquanto que a validacao foi respeitada para o parametro planetId:<xs:element ref="ns1:PlanetName" minOccurs="0"/>Este e um bug do JaxWS (a validacao atraves de @XmlElement e respeitada para tipos primitivos da linguagem mas nao para objetos) e a para sanar o problema, podemos utilizar CXF para a construcao do nosso servico, como veremos no proximo post.