I have had no problem using JDOM with Apache/AXIS although I do all my deployment through jws files. Note: I am trying to write services that the lowest common denominator (cf Visual Basic) can understand. Thus, for the most part, my interface is String in, String out where the strings are either just simple parameters or XML object trees represented as a string. (This may in fact be your problem: you don't want to send an Element across the wire but rather a String whose content is the XML for the Element.)
I enclose the complete client super class which does the work. The encode methods take an appropriate Java class tree (all of whose members are subclasses of XMLType) and, using JDOM converts it to XML: see in particular encodeAsString. The analyze methods do the inverse: take an XML tree as represented by JDOM, parse it and return an object of type XMLType (which is probably a tree of objects of type XMLType).
The method getResponseFromServer does the actual transmission to the server.
/** * The <code>XMLType</code> class is an abstract base class * performing creation and manipulation of java classes from stringified XML sent from the axis/siRNA server. * @version 0.01; 1/28/04 * @author C. Robinson */
abstract class XMLType { /** The path of the objects from this package */ static final String objectPath = "xmlobjects."; /** A Log4J logging instance for this class */ static final org.apache.commons.logging.Log LOG = org.apache.commons.logging.LogFactory.getLog(XMLType.class); /** The URL of the SOAP service supplying the muscle */ static final String urlString = "http://ppdapf07.northamerica.intra.abbott.com:8071/axis/SIRNARelationalService.jws";
/** The XML attributes representing variable data for this class */ protected Hashtable attributes = new Hashtable(); /** The children of this class if this is a standard container class */ protected ArrayList children = null;
/** * Generate an instance of the class represented by this XML element * * @param el an XML element * * @return an instantion of the class represented by the Element * */ public XMLType analyze(Element el) throws Exception,Throwable { analyzeAttributes(el); analyzeChildren(el); dirty = false; return this; }
/** Dirty is true if the object has been modified since fetch. Initialized to true. */ boolean dirty = true; /** * Return the state of dirtyness * * @return the dirtyness state * */ public boolean isDirty() {return dirty;}
/** * Set the state of dirtyness * * @param x the dirtyness state * */ public void setDirty(boolean x) {dirty = x;} /** * Get the attributes (name/value pairs) * * @return the Hashtable of attributes * */
protected Hashtable getAttributes() {return attributes;} protected void setAttributes(Hashtable h) {attributes=h;} /** * Save an attribute in the set of attribute (remove same if null or "") * set dirty = true if old attribute and the new one disaagree * * @param attri the name of the attribute to be set * @param value the value of the attribute to be set (null is represented by null or "") * */ public void putAttribute(String attri,String value) { String x = getAttribute(attri); if (x==null) { if ((value == null) || value.equals("")) return; } else if (x.equals(value)) { return; } if ((value == null) || value.equals("")) { attributes.remove(attri); } else { attributes.put(attri,value); } dirty = true; }
public String getAttribute(String attri) { return (String)attributes.get(attri); } public String encodeAsString() throws Exception { StringWriter sw = new StringWriter(); Document outdoc = new Document(encode()); XMLOutputter outputter = new XMLOutputter("",true); outputter.setIndent(" "); outputter.output(outdoc, sw); return sw.toString(); } protected Element encode() throws Exception { // LOG.info("encode "+this.getClass().getName()); StringTokenizer st = new StringTokenizer(getClass().getName(),"."); String lastName ="?"; while (st.hasMoreTokens()) lastName=st.nextToken(); Element el = new Element(lastName); encodeAttributes(el); encodeChildren(el); return el; } protected void encodeAttributes(Element el) { for (Iterator i = attributes.keySet().iterator();i.hasNext();) { String a = (String)i.next(); el.setAttribute(a,getAttribute(a)); } }
protected void encodeChildren(Element el) throws Exception { if (children != null) for (Iterator i = children.iterator();i.hasNext();) { XMLType child = (XMLType)i.next(); el.addContent(child.encode()); } }
protected void analyzeAttributes(Element el) throws Exception { List t = el.getAttributes(); for (Iterator i = t.iterator();i.hasNext();) { Attribute a = (Attribute)i.next(); attributes.put(a.getName(),a.getValue()); } }
protected void analyzeChildren(Element el) throws Exception, Throwable { children = new ArrayList(); // all of type XMLType List t = el.getChildren(); for (Iterator i = t.iterator();i.hasNext();) { Element e = (Element)i.next(); String name = e.getName(); XMLType x = (XMLType)Class.forName(objectPath+e.getName()).newInstance(); children.add(x.analyze(e)); } }
public void putChild(XMLType x) throws Exception,Throwable { if (children==null) children = getChildren(); // in case we are only partially fetched children.add(x); } public ArrayList getChildren() throws Exception { if (children==null) children = new ArrayList(); // we have no current chilren --> create a list for same return children; }
Send jdom-interest mailing list submissions to
jdom-interest@jdom.org
To subscribe or unsubscribe via the World Wide Web, visit
http://lists.denveronline.net/mailman/listinfo/jdom-interest
or, via email, send a message with subject or body 'help' to
jdom-interest-request@jdom.org
You can reach the person managing the list at
jdom-interest-admin@jdom.org
When replying, please edit your Subject line so it is more specific
than "Re: Contents of jdom-interest digest..."
I'm fairly new to using JDOM to generate XML, so bear with me. I'm in the
processing of writing a web service using Apache Axis. As part of my
'learning' process, I've been able to have a dotNet client hit my web
service and retrieve a basic String, a basic JavaBean, and an Array object
from the JavaBean. I'm now trying to generate a XML document using JDOM,
and pass it back to the client. Here's my basic 'HelloWorld'
implementation:
package ws;
import org.jdom.Element;
/**
* @author jjalenak
*
*/
public class HelloWorldImpl implements HelloWorld
{
/* (non-Javadoc)
* @see ws.HelloWorld#hello()
*/
public Document hello() throws Exception
{
Document _d = new Document();
Element _e = new Element("root");
_e.setText("Hi There!");
_d.setRootElement(_e);
return _d;
}
/* (non-Javadoc)
* @see ws.HelloWorld#goodbye()
*/
public Document goodbye() throws Exception
{
Document _d = new Document();
Element _e = new Element("root");
_e.setText("Good Bye!");
_d.setRootElement(_e);
return _d;
}
}
When I ran the WSDL2JAVA emitter, it created a 'Document' bean in my 'ws'
package, and removed the import for the org.jdom.Document. The web service
deploys on Tomcat (5.0.18) without any problems. When I try to call the web
service from my test Java web app, I get the following exception:
exception is (500)Internal Server Error
AxisFault
faultCode: {http://xml.apache.org/axis/}HTTP
faultSubcode:
faultString: (500)Internal Server Error
faultActor:
faultNode:
faultDetail:
{}string: return code: 500
Digging into this, I found what I think is the 'true' problem :
java.io.IOException: No serializer found for class org.jdom.Element in
registry org.apache.axis.encoding.TypeMappingImpl@6c2308. It appears that
although WSDL2JAVA converted the Document object to a proper bean, it didn't
do the Element object. I not quite sure where to go from here, so if anyone
has some guidance, I'd sure appreciate it. Better yet, if someone has a
working example of an Axis-based webservice using JDOM that they can share,
I'd also appreciate being able to get a look at it.
Thanks!
Jerry Jalenak
Development Manager, Web Publishing
LabOne, Inc.
10101 Renner Blvd.
Lenexa, KS 66219
(913) 577-1496
jerry.jalenak@labone.com
This transmission (and any information attached to it) may be confidential and
is intended solely for the use of the individual or entity to which it is
addressed. If you are not the intended recipient or the person responsible for
delivering the transmission to the intended recipient, be advised that you
have received this transmission in error and that any use, dissemination,
forwarding, printing, or copying of this information is strictly prohibited.
If you have received this transmission in error, please immediately notify
LabOne at the following email address: securityincidentreporting@labone.com
--__--__--
_______________________________________________
To control your jdom-interest membership:
http://lists.denveronline.net/mailman/options/jdom-interest/youraddr@yourhost.com