Web service - socorooooooo

como faço para que meu web service utilize mais de uma classe que eu defini? Tem este classico exemplo da calculadora, em que eu instanciei dentro da classe da calculadora outras classes para fazer os calculos, por exemplo uma classe SOMAR e outra SUBTRAIR. Gerei o cliente diretinho, mas na hora de rodar aparece Axis Fault / InvocationTargetException. Para fazer meu web service acessar um objeto de negocio vou precisar fazer algo semelhante, certo ?

Alguem poderia me dar uma ajuda?

ei… ninguem nunca fez nada parecido?

socorooooo

É só vc configurar cada classe q vc quer disponibilizar como um serviço no teu arquivo wsdd. Cada classe deve ser uma tag <service>

Depois é só gerar os clientes baseado no wsdl deste serviço. :wink:

[]s

mas as classes que eu vou utilizar devem estar dentro de jwclasses? ou na lib como um .jar?
qual a sintaxe desta tag <service> ? é a mesma tag<wsdl:service> dentro do wsdl que eu gero?

verifiquei em alguns tutoriais a geração interfaces para a parte server… mas eu posso tb apenas indicar no wsdd as classes que qro utilizar?

[quote=“Battousay”]mas as classes que eu vou utilizar devem estar dentro de jwclasses? ou na lib como um .jar?
qual a sintaxe desta tag <service> ? é a mesma tag<wsdl:service> dentro do wsdl que eu gero?[/quote]
Tanto faz, podem estar em um jar, ou no jwclasses.

Um exemplo da tag service:

&lt;service name=&quot;NomeServico&quot; provider=&quot;java&#58;RPC&quot;&gt; &lt;parameter name=&quot;allowedMethods&quot; value=&quot;*&quot;/&gt; &lt;parameter name=&quot;className&quot; value=&quot;pacote.SuaClasseServico&quot;/&gt; &lt;/service&gt;

Ok, vou tentar implementar amanha… desde ja muito agredecido pela ajuda…

ah, soh uma perguntinha… este codigo eu coloco no wsdl, certo?

coloquei as tags das minhas classes no documento wsdl, mas quando tento fazer a geração do cliente, aparece Axis Fault

<service name=“Somar” provider=“java:RPC”>
<parameter name=“allowedMethods” value="*"/>
<parameter name=“Somar” value=“com.teste.Somar”/>
</service>
</wsdl:definitions>

pus minha classe utilizada pelo serviço. Tudo muito simples, apenas para aprender mesmo. Estou fazendo algo errado? Utilizo Axis 1.2 RC1.
Desculpe se estou incomodando, mas preciso muito utilizar web services, e está meio dificil pelo jeito. Na web tb não encontro nada que me ajude. 8O

não, esse código vai no wsdd.

O esquema é o seguinte:
vc cria a sua classe q vai ser um serviço, coloca ela no servidor web, em um jar por exemplo, depois vc configura o arquivo wsdd, ok? A parte que vai fornecer um serviço está pronta.

depois disso, o próprio axis gera o automaticamente o wsdl para o vc, e a partir desse wsdl vc gera as classes que irão consumir o serviço, através do wsdl2java.

o wsdl vc quem criou, ou vc pegou o q o axis gera?
vc configurou o arquivo wsdd?

eu estava criando uma classe, colocando ela no servidor com a extensao .jws, e colocando as demais classes em jwclasses… tenho aqui o plugin lavadora pra gerar o cliente, dai eu pegava o wsdl desta classe jws e gerava o cliente…
posso então colocar o meu pacote com as classes dentro do axis, mas depois como faço para configurar esse arquivo wsdd? nos tutoriais que tenho não menciona isso…

desde ja muito agrdecido pela ajuda…

É q tem essas duas formas de fazer.

dá uma olhada neste tutorial aki:
http://www.conexaojava.com.br/conexaojava04/download/minicursos/Criando.um.Web.Service-Conexao.Java.2004.pdf

qlqr dúvida, é só postar.

[]s

obtive erro pra executar essas linhas de comando do WSDL2Java… existe algum plugin para o eclipse 3 que faça isso?

da forma como eu fazia antes, criando o arquivo .jws, não é possível utilizar mais de uma classe? o web service que tenho em mente é mais ou menos simples… o arquivo jws deve conter toda a informação a ser executada ou ele pode acessar outras classes, como por exemplos DAO’s?

alternativamente, eu não poderia criar minhas classes que vão ser o serviço, criar a mão o WSDD e depois (de alguma forma…) obter o WSDL para gerar o cliente? 8O

o wsdd vai conter apenas akelas tag serice que mapeiam os serviços?

já dizia o Jack algum tempo atrás: vamos por partes :grin:

Qual o erro que deu?
depois q vc pegou o wsdl é simples:

java org.apache.axis.wsdl.WSDL2Java nomearquivo.wsdl

mas é preciso ter alguns jar no classpath: axis.jar, axis-ant.jar, commons-discovery.jar, commons-logging.jar, jaxrpc.jar, log4j-1.2.8.jar, saaj.jar e wsdl4j.jar.

Eu acredito que ser vc pegar outras classes, mudar a extensão, e colocar no diretório jwsClasses deve funcionar.

qdo vc trabalha com arquivos wsdd vc pode acessar outras classes do teu sistema normalmente, acredito que desta outra forma tbm.

sim, vc pode criar as classes, criar o wsdd na mão, e depois pegar o wsdl q o própria axis gera.

não, ele contém outras inf. conf exemplo abaixo q eu utilizo:

[code]<?xml version="1.0" encoding="UTF-8"?>
<deployment name="defaultClientConfig"
xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"
xmlns:handler="http://xml.apache.org/axis/wsdd/providers/handler"
xmlns:tns1="http://generated.entity.business.geral.vendas.support" >

<globalConfiguration>
<requestFlow>
<handler type="java:org.apache.axis.handlers.JWSHandler">
<parameter name="scope" value="session"/>
</handler>
<handler type="java:org.apache.axis.handlers.JWSHandler">
<parameter name="scope" value="request"/>
<parameter name="extension" value=".jwr"/>
</handler>
<!-- uncomment this if you want the SOAP monitor -->

 &lt;handler type=&quot;java&#58;org.apache.axis.handlers.SOAPMonitorHandler&quot;/&gt;

</requestFlow>
<!-- uncomment this if you want the SOAP monitor -->

<responseFlow>
<handler type="java:org.apache.axis.handlers.SOAPMonitorHandler"/>
</responseFlow>

</globalConfiguration>

<handler type="java:org.apache.axis.handlers.http.URLMapper" name="URLMapper"/>
<handler type="java:org.apache.axis.transport.local.LocalResponder" name="LocalResponder"/>
<handler type="java:org.apache.axis.handlers.SimpleAuthenticationHandler" name="Authenticate"/>

<service name="AdminService" provider="java:MSG">
<namespace>http://xml.apache.org/axis/wsdd/</namespace>
<parameter name="allowedMethods" value="AdminService"/>
<parameter name="enableRemoteAdmin" value="false"/>
<parameter name="className" value="org.apache.axis.utils.Admin"/>
</service>

<service name="Version" provider="java:RPC">
<parameter name="allowedMethods" value="getVersion"/>
<parameter name="className" value="org.apache.axis.Version"/>
</service>

<service name="Sync" provider="java:RPC">
<parameter name="allowedMethods" value="*"/>
<parameter name="className" value="support.vendas.sincronizacao.web.webservice.SincronizacaoDadosWebService"/>
<beanMapping qname="tns1:Cliente" languageSpecificType="java:support.vendas.geral.business.entity.generated.Cliente"/>
</service>

<transport name="http">
<requestFlow>
<handler type="URLMapper"/>
<handler type="java:org.apache.axis.handlers.http.HTTPAuthHandler"/>
</requestFlow>
</transport>

<transport name="local">
<responseFlow>
<handler type="LocalResponder"/>
</responseFlow>
</transport>

</deployment>[/code]

ok, então acho que estou chegando lá…mas como vc mesmo disse, vamos por partes…

se eu utilizar mais de uma classe no meu serviço com o esquema de renomear para .jws, todas as classes devem ser renomeadas? se não me engano, dessa forma não pode ter nenhum estrutura de pacotes, certo?

eu posso apenas indicar as classes dentro do arquivo wsdd e colocar um pacote com as mesmas dentro da aplicação web? o nome desse arquivo deve ser deploy.wsdd, certo? mas onde coloco ele? e como vou obter o wsdl?

desculpa se estou fazendo muitas perguntas, mas não vou desistir até aprender… :grin:

quando conseguir, te mando um presente…
:wink: :wink: :wink: :roll: :grin: :grin: :grin: :grin:

acho q vc irá renomear somente as classes q será serviço, as outras ficam na estrutura normal dentro de um jar, ou no diretórios classes.

isso, qdo vc configura pelo deploy.swdd as classes podem estar em um jar ou dentro de classes.
depois para pegar o wsdl, vc acessa pelo navegador: http://localhost/suaApp/services/Servico?wsdl e ele gera o wsdl pra vc. depois é usar o wsdl2java para gerar a parte cliente.

ah tinha esquecido, vc precisa tbm configurar algumas coisas no web.xml:

[code] <servlet>
<servlet-name>AxisServlet</servlet-name>
<display-name>Apache-Axis Servlet</display-name>
<servlet-class>
org.apache.axis.transport.http.AxisServlet
</servlet-class>
</servlet>

<servlet>
<servlet-name>AdminServlet</servlet-name>
<display-name>Axis Admin Servlet</display-name>
<servlet-class>
org.apache.axis.transport.http.AdminServlet
</servlet-class>
<load-on-startup>100</load-on-startup>
</servlet>

<servlet>
<servlet-name>SOAPMonitorService</servlet-name>
<display-name>SOAPMonitorService</display-name>
<servlet-class>
org.apache.axis.monitor.SOAPMonitorService
</servlet-class>
<init-param>
<param-name>SOAPMonitorPort</param-name>
<param-value>5001</param-value>
</init-param>
<load-on-startup>100</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>/servlet/AxisServlet</url-pattern>
</servlet-mapping>

<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>*.jws</url-pattern>
</servlet-mapping>

<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>

<servlet-mapping>
<servlet-name>SOAPMonitorService</servlet-name>
<url-pattern>/SOAPMonitor</url-pattern>
</servlet-mapping>

<mime-mapping>
<extension>wsdl</extension>
<mime-type>text/xml</mime-type>
</mime-mapping>

<mime-mapping>
<extension>xsd</extension>
<mime-type>text/xml</mime-type>
</mime-mapping>

[/code]

[quote=“Battousay”] quando conseguir, te mando um presente…
:wink: :wink: :wink: :roll: :grin: :grin: :grin: :grin:[/quote]Olha q eu cobro hein!!! rsrsrs :okok:
flw

coloquei este trecho dentro do deploy.wsdd:

service name=“Somador” provider=“java:RPC”
parameter name=“allowedMethods” value="*"
parameter name=“className” value=“com.teste.Somador”
beanMapping qname=“tns1:Soma” languageSpecificType=“java:com.teste.Somar”
service

mas na hora de utilizar o comando para fazer o deploy, java org.apache.axis.client.AdminClient deploy.wsdd, o java acusa que não acha a bendita classe, mas ela está no pacote axis.jar. tentei compilar com -cp e indicando o jar, mas não adianta. criei uma variavel de ambiente AXIS_HOME e indiquei o root do axis. preciso configurar mais alguma coisa?

depois vc q cria o deploy.wsdd vc não precisa vc não precisa rodar esse comando, pelo menos eu não me lebro de te-lo rodado, é só colocar o deploy.wsdd dentro do WEB-INF e deve funcionar.

[]s

mais uma perguntinha… indiquei no meu wsdd o pacote do meu serviço, coloquei ele na pasta da minha aplicação (a aplicação que vem junto com o axis), mas quando visualizo os serviços disponíveis, aparecem apenas serviços do proprio axis, como version e outros. Pelo visto eu tenho que executar algum comando para o deploy do serviço ou tem algo errado com o wsdd?

<!-- Use this file to deploy some handlers/chains and services -->
<!-- Two ways to do this: -->
<!-- java org.apache.axis.client.AdminClient deploy.wsdd -->
<!-- after the axis server is running -->
<!-- or -->
<!-- java org.apache.axis.utils.Admin client|server deploy.wsdd -->
<!-- from the same directory that the Axis engine runs -->
<deployment xmlns=“http://xml.apache.org/axis/wsdd/” xmlns:java=“http://xml.apache.org/axis/wsdd/providers/java” xmlns:bid=“http://www.soapinterop.org/Bid” xmlns:reg=“http://www.soapinterop.org/Registry”>
.service name=“Bid” provider=“java:RPC”>
.namespace>http://www.soapinterop.org/Bid./namespace>
.parameter name=“className” value=“samples.bidbuy.BidService”/>
.parameter name=“allowedMethods” value=“RequestForQuote SimpleBuy Buy Ping”/>
./service>
.globalConfiguration>
.requestFlow>
.handler type=“java:org.apache.axis.handlers.JWSHandler”>
.parameter name=“scope” value=“session”/>
./handler>
.handler type=“java:org.apache.axis.handlers.JWSHandler”>
.parameter name=“scope” value=“request”/>
.parameter name=“extension” value=".jwr"/>
./handler>
.!-- uncomment this if you want the SOAP monitor -->

.handler type=“java:org.apache.axis.handlers.SOAPMonitorHandler”/>

./requestFlow>
.!-- uncomment this if you want the SOAP monitor -->

.responseFlow>
.handler type=“java:org.apache.axis.handlers.SOAPMonitorHandler”/>
./responseFlow>

./globalConfiguration>

.beanMapping qname="bid:PurchaseOrder" languageSpecificType="java:samples.bidbuy.PurchaseOrder"/&gt;
.beanMapping qname="bid:Address" languageSpecificType="java:samples.bidbuy.Address"/&gt;
.beanMapping qname="bid:LineItem" languageSpecificType="java:samples.bidbuy.LineItem"/&gt;
.!-- * * * * * * * * * * * * * * * * * * * * * * * * * * * * --&gt;
.service name="BidRegistry" provider="java:RPC"&gt;
    .parameter name="className" value="samples.bidbuy.RegistryService"/&gt;
    .parameter name="allowedMethods" value="Register Unregister Lookup LookupAsString"/&gt;
./service&gt;
.beanMapping qname="reg:Service" languageSpecificType="java:samples.bidbuy.Service"/&gt;
.service name="Somador" provider="java:RPC"&gt; 

.parameter name=“allowedMethods” value="*"/>
.parameter name=“className” value=“com.teste.Somador”/>
.beanMapping qname=“tns1:Soma” languageSpecificType=“java:com.teste.Somar”/>
./service>

./deployment>

É realmente tão fácil assim mesmo publicar o serviço? BAsta colocar o pacote e configurar o wsdd? :grin:

BAsta agora então só obter o wsdd… :lol: :cool:

consegui finalmente executar o deploy do wsdd. sé que agora aparece NullPointerException quando executo o deploy.wsdd… nas minhas classes não tem nenhum erro… aparece uma mensagem que algumas classes do axis estão faltando e que o suporte a anexo está desabilitado… será que pode ser por isso que ele não executa?