Hello Axis Users,
I am posting this simple cookbook because it's the type of thing I think
lots of people need, and I haven't found a straitforward example that
describes explicitly.
This cookbook covers how to use a axis client and server with complex
serialized beans as a return type.
######################################################
1. Create your service.
This is just a simple stateful service (see previous post) that will
return a custom (complex) java type.
/*
* StatefulService.java
*/
package com.noi.mailservlet.web.services;
import com.noi.mailservlet.web.bl.NameValue;
public class StatefulService
{
private NameValue nv;
public NameValue getNameValue(NameValue nv)
{
nv.setName("name1");
nv.setValue("VALUE1");
this.nv = nv;
return this.nv;
}
}
/*
* NameValue.java
*/
package com.noi.mailservlet.web.bl;
import java.io.*;
public class NameValue implements Serializable {
/** Holds value of property name. */
private String name;
/** Holds value of property value. */
private String value;
/** Creates a new instance of NameValue */
public NameValue() {
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public String getValue() {
return this.value;
}
public void setValue(String value) {
this.value = value;
}
}
######################################################
2. Define the deployment for the service, in this case I am using
BasicSessionHandler to provide a stateful service. Notice the "ns1"
namespace mapping in the deployment tag, this is required to ultimately
map the type to the client qname Later.
<?xml version="1.0" encoding="UTF-8"?>
<deployment
xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"
xmlns:xsd="http://www.w3.org/2000/10/XMLSchema"
xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance"
xmlns:ns1="StatefulService">
<service name="StatefulService" provider="java:RPC">
<namespace>http://meis/mailservlet/</namespace>
<parameter name="scope" value="session"/>
<requestFlow>
<handler
type="java:org.apache.axis.handlers.SimpleSessionHandler"/>
</requestFlow>
<responseFlow>
<handler
type="java:org.apache.axis.handlers.SimpleSessionHandler"/>
</responseFlow>
<parameter name="className"
value="com.noi.mailservlet.web.services.StatefulService"/>
<parameter name="allowedMethods" value="*"/>
<operation name="getNameValue" returnQName="returnqname"
returnType="ns1:NameValue" >
<parameter name="nv" type="ns1:NameValue"/>
</operation>
<typeMapping
deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"
languageSpecificType="java:com.noi.mailservlet.web.bl.NameValue"
qname="ns1:NameValue"
serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</service>
</deployment>
This should generate the wsdl complex type:
<schema targetNamespace="http://bl.web.mailservlet.noi.com"
xmlns="http://www.w3.org/2001/XMLSchema">
<import namespace="http://schemas.xmlsoap.org/soap/encoding/" />
<complexType name="NameValue">
<sequence>
<element name="name" nillable="true"
type="xsd:string" />
<element name="value" nillable="true"
type="xsd:string" />
</sequence>
</complexType>
</schema>
######################################################
3. invoke the "getNameValue" method via call in the client application
Service service = new Service();
//configure the stateful client engine ommitted, in previous
post
//get name value object;
Call call = (Call) service.createCall();
call.setTargetEndpointAddress( new java.net.URL(endpointURL)
);
call.setOperationName( new QName("StatefulService",
"getNameValue") );
NameValue nv = new NameValue();
QName qn = new QName("StatefulService", "NameValue");
call.registerTypeMapping(
NameValue.class,
qn,
new
org.apache.axis.encoding.ser.BeanSerializerFactory(NameValue.class, qn),
new
org.apache.axis.encoding.ser.BeanDeserializerFactory(NameValue.class,
qn)
);
call.addParameter("source", qn,
ParameterMode.IN);
call.setReturnType(qn);
nv = (NameValue)call.invoke( new Object[] { (Object)nv } );
System.out.println("name:"+nv.getName()+"
value:"+nv.getValue());
######################################################
That's it, I have whole java and wsdd files also, and can send them you
if you want them.
-----------------------------------------
Clay Graham
President
newObjectivity, Inc.
making the mobile-world-office
http://www.newobjectivity.com/
-----Original Message-----
From: Clay Graham [mailto:[EMAIL PROTECTED]
Sent: Friday, April 04, 2003 1:18 PM
To: [EMAIL PROTECTED]
Subject: [newbie] Empty parameter client?
I have a service, its really just a simple bean pattern:
public class StatefulService
{
private String value;
public void setValue(String value)
{
this.value = value;
}
public String getValue()
{
return this.value;
}
}
I am having a hard time figuring out what you would do from the client
side to use the "getValue" method of the service, it produces the
following wsdl operation:
<wsdl:operation name="getValue">
<wsdlsoap:operation soapAction="" />
<wsdl:input name="getValueRequest">
<wsdlsoap:body
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
namespace="http://meis/mailservlet/" use="encoded" />
</wsdl:input>
<wsdl:output name="getValueResponse">
<wsdlsoap:body
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
namespace="http://meis/mailservlet/" use="encoded" />
</wsdl:output>
</wsdl:operation>
I tried this:
call.setOperationName( new QName("StatefulService",
"getValue") );
//why do I have to do this?
call.addParameter( "testval", XMLType.XSD_ANY,
ParameterMode.IN);
call.setReturnType(
org.apache.axis.encoding.XMLType.XSD_STRING);
//why does invoke require an object array if there are
no parameters?
//shouldn't there be an overloaded method with no
parameters?
String ret = (String)call.invoke( new Object[] { null } );
But it doesn't work, I can't find any services without parameters in the
examples, any ideas?
-----------------------------------------
Clay Graham
President
newObjectivity, Inc.
making the mobile-world-office
http://www.newobjectivity.com/
-----Original Message-----
From: Clay Graham [mailto:[EMAIL PROTECTED]
Sent: Friday, April 04, 2003 10:13 AM
To: [EMAIL PROTECTED]
Subject: RE: Stateful web services.
This has been filed as bug# 18718
Hope it helps!
-----------------------------------------
Clay Graham
President
newObjectivity, Inc.
making the mobile-world-office
http://www.newobjectivity.com/
-----Original Message-----
From: Davanum Srinivas [mailto:[EMAIL PROTECTED]
Sent: Thursday, April 03, 2003 5:44 PM
To: [EMAIL PROTECTED]; [EMAIL PROTECTED]
Subject: RE: Stateful web services.
See directions for patches at
http://nagoya.apache.org/wiki/apachewiki.cgi?AxisProjectPages/SubmitPatc
hes
--- Clay Graham <[EMAIL PROTECTED]> wrote:
> Absolutely.
>
> I am not real familiar with the development process of axis, but I am
> more than willing to try!
>
> What I will try to do is make a nice package based on the existing
> docs, and then submit it (where?).
>
>
>
> -----------------------------------------
> Clay Graham
> President
> newObjectivity, Inc.
> making the mobile-world-office
> http://www.newobjectivity.com/
>
>
>
> -----Original Message-----
> From: Tom Jordahl [mailto:[EMAIL PROTECTED]
> Sent: Thursday, April 03, 2003 1:50 PM
> To: '[EMAIL PROTECTED]'
> Subject: RE: Stateful web services.
>
>
>
> Clay,
>
> This is great. Do you think you could check out the current Axis HTML
> docs and see if you can put together a patch that would integrate this
> in to it?
>
> Your code could just be new files in the samples directory.
>
> If you could do that, then put the info in a Bugzilla report, that
> would increase the chances that someone (me) would check it in to the
> tree for others.
>
> --
> Tom Jordahl
> Macromedia Server Development
>
> -----Original Message-----
> From: Clay Graham [mailto:[EMAIL PROTECTED]
> Sent: Thursday, April 03, 2003 3:22 PM
> To: [EMAIL PROTECTED]
> Subject: RE: Stateful web services.
>
> [SOLUTION]
>
> I am including the full solution because I think this is the type of
> thing everybody wants....
>
> #####################################################################
>
> 1. Create your service
>
> /*
> * NOIMailService.java
> *
> * Created on April 2, 2003, 5:19 PM
> */
>
> package com.noi.mailservlet.web.services;
> import javax.activation.*;
> import java.util.*;
> import javax.ejb.*;
> import javax.mail.*;
> import javax.mail.internet.*;
> import javax.mail.search.*;
> import java.io.*;
>
> /**
> *
> * @author clay
> */
> public class NOIMailService {
>
> /** Holds value of property username. */
> private String username;
>
> /** Holds value of property password. */
> private String password;
>
> /** Holds value of property hostname. */
> private String hostname;
>
> private boolean connected;
>
> /** Holds value of property protocol. */
> private String protocol;
>
> private static final String loginmbox = "INBOX";
>
> private Store store;
> private Session session;
> private URLName url;
>
> /** Creates a new instance of NOIMailService */
> public NOIMailService() {
> this.connected = false;
> this.protocol = "imap";
> }
>
>
> public boolean login(String protocol, String username, String
> password, String hostname)
> {
>
> this.protocol = protocol;
> this.username = username;
> this.password = password;
> this.hostname = hostname;
>
> try{
> url = new URLName(
> this.protocol,
> this.hostname,
> -1,
> this.loginmbox,
> this.username,
> this.password);
>
> Properties props = System.getProperties();
>
> if (hostname != null)
> props.put("mail.smtp.host", this.hostname);
> else if (props.getProperty("mail.smtp.host") == null)
> props.put("mail.smtp.host", "localhost");
>
> this.session = Session.getDefaultInstance(props, null);
> this.session.setDebug(true);
>
> PasswordAuthentication pw = new
> PasswordAuthentication(url.getUsername(), this.url.getPassword());
> this.session.setPasswordAuthentication(url, pw);
>
> this.store = this.session.getStore(url);
> this.store.connect();
> this.connected = true;
> return this.connected;
> }
> catch(Exception e)
> {
> this.connected = false;
> return this.connected;
> }
>
> }
>
> public boolean isConnected()
> {
> return this.connected;
> }
>
> public boolean sendStatelessMessage(String protocol, String
> username, String password, String hostname, String to, String cc,
> String bcc, String subject, String body)
> {
> if(this.login(protocol, username, password, hostname))
> {
> try {
>
> Message msg = new MimeMessage(this.session);
>
> //to
> InternetAddress[] toAddrs = null;
> if ((to != null) && !to.equals("")) {
> toAddrs = InternetAddress.parse(to, false);
> msg.setRecipients(Message.RecipientType.TO,
> toAddrs);
> }
> else
> return false;
>
>
> //sent date
> msg.setSentDate(Calendar.getInstance().getTime());
>
> //from
> String fromAddress = url.getUsername() +
> "@"+url.getHost();
> msg.setFrom(new InternetAddress(fromAddress));
>
> //cc
> InternetAddress[] ccAddrs = null;
> if ((cc != null) && !cc.equals("")) {
> ccAddrs = InternetAddress.parse(cc, false);
> msg.setRecipients(Message.RecipientType.CC,
> ccAddrs);
> }
>
> InternetAddress[] bccAddrs = null;
> if ((bcc != null) && !bcc.equals("")) {
> bccAddrs = InternetAddress.parse(bcc, false);
> msg.setRecipients(Message.RecipientType.BCC,
> toAddrs);
> }
>
> //subject
>
=== message truncated ===
=====
Davanum Srinivas - http://webservices.apache.org/~dims/
__________________________________________________
Do you Yahoo!?
Yahoo! Tax Center - File online, calculators, forms, and more
http://tax.yahoo.com