Web Services com EJB no JBoss 5.1 (JDK 6) - Problemas ao consumir com Classe Cliente para teste

5 respostas
E

Olá pessoal, estou tentando fazer uso de um exemplo que trabalhei em um curso da Caelum, na época com Glassfish, no JBoss 5.1 GA, porém tenho recibo erros e não consigo auxílio ou referências. Vejam abaixo os códigos:

A inteface

package interfaces;

import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.jws.soap.SOAPBinding.Style;

@WebService
@SOAPBinding(style=Style.RPC)
public interface IAgenteDeReserva extends java.rmi.Remote {
	@WebMethod
	public boolean reserva(
			@WebParam(name="nome")
			String nome,
			@WebParam(name = "voo")
			String voo);
}
A classe EJB Web Service
package webservices;

import interfaces.IAgenteDeReserva;

import javax.ejb.Stateless;
import javax.jws.WebService;

@Stateless
@WebService(endpointInterface="interfaces.IAgenteDeReserva")
public class WSAgenteDeReserva implements IAgenteDeReserva {
	public boolean reserva(String nome, String voo) {
		if (voo.equals("3003")) {
			System.out.println("Vôo 3003 reservado com sucesso para " + nome);
			return true;
		}
		return false;
	}
}

O cliente

package clients;

import interfaces.IAgenteDeReserva;

import java.net.MalformedURLException;
import java.net.URL;

import javax.xml.namespace.QName;
import javax.xml.rpc.Service;
import javax.xml.rpc.ServiceException;
import javax.xml.rpc.ServiceFactory;

public class ClienteWS {
	public static void main(String[] args) throws Ma
lformedURLException, ServiceException { URL url = new URL("http://localhost:8085/EJB06/WSAgenteDeReserva?wsdl"); QName qname = new QName("http://webservices/", "WSAgenteDeReservaService"); ServiceFactory factory = ServiceFactory.newInstance(); Service service = factory.createService(url, qname); IAgenteDeReserva agente = (IAgenteDeReserva) service.getPort(IAgenteDeReserva.class); boolean reservado = agente.reserva("Paulete", "3003"); System.out.println("Reservado: " + reservado); } }

Faço o deploy do JAR no JBoss, quando busco o wsdl recebo no navegador o seguinte:

<definitions name="WSAgenteDeReservaService" targetNamespace="http://webservices/">
<import location="http://127.0.0.1:8085/EJB06/WSAgenteDeReserva?wsdl&resource=IAgenteDeReserva_PortType6286197864953226372.wsdl" namespace="http://interfaces/"/>
−
<service name="WSAgenteDeReservaService">
−
<port binding="ns1:IAgenteDeReservaBinding" name="WSAgenteDeReservaPort">
<soap:address location="http://127.0.0.1:8085/EJB06/WSAgenteDeReserva"/>
</port>
</service>
</definitions>

O que me parece incompleto, mas se notarem a tag <import location> ela faz uso de outro wsdl, que tem as operações.

Ao executar o cliente, recebo a seguinte mensagem:

Exception in thread "main" java.lang.reflect.UndeclaredThrowableException
	at $Proxy0.reserva(Unknown Source)
	at clients.ClienteWS.main(ClienteWS.java:23)
Caused by: java.rmi.RemoteException: Call invocation failed with code [Client] because of: Endpoint {http://webservices/}WSAgenteDeReservaPort does not contain operation meta data for: {http://webservices/}reserva; nested exception is: 
	javax.xml.rpc.soap.SOAPFaultException: Endpoint {http://webservices/}WSAgenteDeReservaPort does not contain operation meta data for: {http://webservices/}reserva
	at org.jboss.ws.core.jaxrpc.client.CallImpl.invokeInternal(CallImpl.java:523)
	at org.jboss.ws.core.jaxrpc.client.CallImpl.invoke(CallImpl.java:275)
	at org.jboss.ws.core.jaxrpc.client.PortProxy.invoke(PortProxy.java:154)
	... 2 more
Caused by: javax.xml.rpc.soap.SOAPFaultException: Endpoint {http://webservices/}WSAgenteDeReservaPort does not contain operation meta data for: {http://webservices/}reserva
	at org.jboss.ws.core.jaxrpc.SOAPFaultHelperJAXRPC.getSOAPFaultException(SOAPFaultHelperJAXRPC.java:102)
	at org.jboss.ws.core.jaxrpc.SOAP11BindingJAXRPC.throwFaultException(SOAP11BindingJAXRPC.java:66)
	at org.jboss.ws.core.CommonSOAPBinding.unbindResponseMessage(CommonSOAPBinding.java:579)
	at org.jboss.ws.core.CommonClient.invoke(CommonClient.java:381)
	at org.jboss.ws.core.jaxrpc.client.CallImpl.invokeInternal(CallImpl.java:516)
	... 4 more

Agradeço muito se me ajudarem

5 Respostas

Paulo_Silveira

Ola Everton!

Remova as anotacoes da interface do javax.xml, e deixe os @WebParam e outros apenas dentro da classe de implementacao. Remova tambem o ednpoint= do @WebService (é outra maneira de fazer). Veja agora.

abracos!

E

Paulo, obrigado pelo retorno. Veja, na interface não tinham estas anotações que comentou. Elas estão na classe cliente. Deixei minha interface como segue:

package interfaces;

public interface IAgenteDeReserva extends java.rmi.Remote {
	public boolean reserva(String nome, String voo);
}

A classe do Webservice ficou :

package webservices;

import interfaces.IAgenteDeReserva;

import javax.ejb.Stateless;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;

@Stateless
@WebService
public class WSAgenteDeReserva implements IAgenteDeReserva {
	@WebMethod
	public boolean reserva(
			@WebParam(name="nome")
			String nome,
			@WebParam(name = "voo")
			String voo) {
		if (voo.equals("3003")) {
			System.out.println("Vôo 3003 reservado com sucesso para " + nome);
			return true;
		}
		return false;
	}
}

O WSDL gerado agora realmente mudou.

- &lt;definitions name="WSAgenteDeReservaService" targetNamespace="http://webservices/" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://webservices/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"&gt;
- &lt;types&gt;
- &lt;xs:schema targetNamespace="http://webservices/" version="1.0" xmlns:tns="http://webservices/" xmlns:xs="http://www.w3.org/2001/XMLSchema"&gt;
  &lt;xs:element name="reserva" type="tns:reserva" /&gt; 
  &lt;xs:element name="reservaResponse" type="tns:reservaResponse" /&gt; 
- &lt;xs:complexType name="reserva"&gt;
- &lt;xs:sequence&gt;
  &lt;xs:element minOccurs="0" name="nome" type="xs:string" /&gt; 
  &lt;xs:element minOccurs="0" name="voo" type="xs:string" /&gt; 
  &lt;/xs:sequence&gt;
  &lt;/xs:complexType&gt;
- &lt;xs:complexType name="reservaResponse"&gt;
- &lt;xs:sequence&gt;
  &lt;xs:element name="return" type="xs:boolean" /&gt; 
  &lt;/xs:sequence&gt;
  &lt;/xs:complexType&gt;
  &lt;/xs:schema&gt;
  &lt;/types&gt;
- &lt;message name="WSAgenteDeReserva_reserva"&gt;
  &lt;part element="tns:reserva" name="reserva" /&gt; 
  &lt;/message&gt;
- &lt;message name="WSAgenteDeReserva_reservaResponse"&gt;
  &lt;part element="tns:reservaResponse" name="reservaResponse" /&gt; 
  &lt;/message&gt;
- &lt;portType name="WSAgenteDeReserva"&gt;
- &lt;operation name="reserva" parameterOrder="reserva"&gt;
  &lt;input message="tns:WSAgenteDeReserva_reserva" /&gt; 
  &lt;output message="tns:WSAgenteDeReserva_reservaResponse" /&gt; 
  &lt;/operation&gt;
  &lt;/portType&gt;
- &lt;binding name="WSAgenteDeReservaBinding" type="tns:WSAgenteDeReserva"&gt;
  &lt;soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" /&gt; 
- &lt;operation name="reserva"&gt;
  &lt;soap:operation soapAction="" /&gt; 
- &lt;input&gt;
  &lt;soap:body use="literal" /&gt; 
  &lt;/input&gt;
- &lt;output&gt;
  &lt;soap:body use="literal" /&gt; 
  &lt;/output&gt;
  &lt;/operation&gt;
  &lt;/binding&gt;
- &lt;service name="WSAgenteDeReservaService"&gt;
- &lt;port binding="tns:WSAgenteDeReservaBinding" name="WSAgenteDeReservaPort"&gt;
  &lt;soap:address location="http://127.0.0.1:8085/EJB06/WSAgenteDeReserva" /&gt; 
  &lt;/port&gt;
  &lt;/service&gt;
  &lt;/definitions&gt;

O cliente não mudei nada, mas o erro agora é:

Exception in thread "main" org.jboss.ws.WSException: Cannot obtain java type mapping for: {http://webservices/}reserva
	at org.jboss.ws.metadata.builder.jaxrpc.JAXRPCMetaDataBuilder.processDocElement(JAXRPCMetaDataBuilder.java:625)
	at org.jboss.ws.metadata.builder.jaxrpc.JAXRPCMetaDataBuilder.buildParameterMetaDataDoc(JAXRPCMetaDataBuilder.java:887)
	at org.jboss.ws.metadata.builder.jaxrpc.JAXRPCMetaDataBuilder.setupOperationsFromWSDL(JAXRPCMetaDataBuilder.java:212)
	at org.jboss.ws.metadata.builder.jaxrpc.JAXRPCClientMetaDataBuilder.buildMetaDataInternal(JAXRPCClientMetaDataBuilder.java:221)
	at org.jboss.ws.metadata.builder.jaxrpc.JAXRPCClientMetaDataBuilder.buildMetaData(JAXRPCClientMetaDataBuilder.java:133)
	at org.jboss.ws.metadata.builder.jaxrpc.JAXRPCClientMetaDataBuilder.buildMetaData(JAXRPCClientMetaDataBuilder.java:85)
	at org.jboss.ws.core.jaxrpc.client.ServiceImpl.&lt;init&gt;(ServiceImpl.java:109)
	at org.jboss.ws.core.jaxrpc.client.ServiceFactoryImpl.createService(ServiceFactoryImpl.java:155)
	at org.jboss.ws.core.jaxrpc.client.ServiceFactoryImpl.createService(ServiceFactoryImpl.java:126)
	at clients.ClienteWS.main(ClienteWS.java:19)

Fico ansiosamente no aguardo

Forte abraço

Paulo_Silveira

oi everton!

voce regerou o stub com o wsimport?

E remova o extends java.rmi.Remote da interface, nao precisa mais isso pros ejbs! (mas ta faltando a anotacao @Remote la)

E

Então Paulo, justamente essa é a minha dúvida, pois no material não fazia referência alguma a isso…Pode me passar o procedimento ?

Paulo_Silveira

Aqui tem passo a passo pra gerar o stub:

Criado 7 de dezembro de 2009
Ultima resposta 15 de dez. de 2009
Respostas 5
Participantes 2