You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-user@axis.apache.org by mi...@lhsystems.com on 2004/07/15 13:05:35 UTC
Deserialisation from a xml file
> When testing the a webservice, it can come in handy not only to have look at the soap-resonse but also to serialise it to disk (in xml-form). To test the system that makes the SOAP-Requests it might then be even more interesting to take the data from the (maybe modified) xml document as an input. Since I got the answer for this problem from this group and Yves Langisch asked me to present the solution on the list I will now demonstrate how it is possible to do it.
>
> All you really need is your development environment and of course the webservice-classes generated by axis.I created a simple junit-test to deserialize the xml stream and test the result.
>
> public class ReaderTest extends TestCase {
>
> public ShipmentReaderTest(String arg0) {
> super(arg0);
> }
>
> public void testDeserializeFromDisk() {
> File inFile = new File("/yourpath/yourXMLFile.out");
> FileReader reader;
>
> try {
> reader = new FileReader(inFile);
> YourResponseClass yrc = new YourResponseClass();
> QName qname = new javax.xml.namespace.QName(
> "http://www.yourXMLSchema.com", "YourResponseClass");
>
> yrc = (YourResponseClass) deserializeFromSOAPReader(reader, qname,
> YourResponseClass.class);
>
> if (yrc!= null && yrc.getSomeProperty() != null) {
> System.out.println("Got Value!");
> } else {
> System.out.println("Shit!");
> }
> } catch (FileNotFoundException e) {
> e.printStackTrace();
> } catch (AxisFault e) {
> e.printStackTrace();
> } catch (Exception e) {
> e.printStackTrace();
> }
> }
>
> This will call some method that works as it is for AXIS-1.2beta. In AXIS-1.1 you will have to make some modification to the generated stub class in order to be able to get the TypeMapping. This is not necessary in Axis-1.2 anymore.
>
> Add this to your Axis-1.1 Stub-Class:
>
> public TypeMapping getTypeMapping() throws ServiceException, RemoteException{
>
> TypeMapping mapping = createCall().getTypeMapping();
> return mapping;
> }
>
> Then you will need to have some reader method which will be called from the JUnit-Test:
>
> /**
> * Deserializes a SOAP Reader (i.e. a XML file) to the appropriate Java
> * Class generated by Axis.
> *
> * @param reader
> * is the Reader for deserializing (a SOAP envelope)
> * @param qname
> * is the qualified name of the namespace of the XML Type of
> * clazz
> * @param clazz
> * is the Java Type representation of the XML stream
> * @return Object which has to be casted to the specified Java Class (clazz)
> * @throws Exception
> * @throws AxisFault
> */
> public static Object deserializeFromSOAPReader(Reader reader, QName qname,
> Class clazz) throws Exception, AxisFault {
>
> YourAXISStub stub = new YourAXISStub();
>
> MessageContext msgContext = new MessageContext(new AxisServer());
> msgContext.setEncodingStyle(qname.getNamespaceURI());
>
> // get TypeMapping from generated stub so we don't need to build it
> // TypeMapping is not necessary anymore with Axis 1.2, see below
>
> TypeMapping tm = stub.getTypeMapping();
>
> TypeMappingRegistry tmr = msgContext.getTypeMappingRegistry();
> tmr.register(qname.getNamespaceURI(), tm);
>
> msgContext.setTypeMappingRegistry(tmr);
>
> DeserializationContext dser = new DeserializationContextImpl(
> new InputSource(reader), msgContext,
> org.apache.axis.Message.REQUEST);
>
> // parse the InputSource
> dser.parse();
>
> SOAPEnvelope env2 = dser.getEnvelope();
> RPCElement rpcElem = (RPCElement) env2.getFirstBody();
>
> /**
> * yla, 06.02.04; Ab Axis 1.2 getValueAsType auf die zwei-parametrige
> * Version umstellen (Axis 1.2 unterstützt die getValueAsType mit dem
> * zusätzlichen Class Parameter, so dass der Umweg über das TypeMapping
> * (siehe oben) nicht mehr notwendig ist)
> */
> //Object result = rpcElem.getValueAsType(qname, clazz);>
> Object result = rpcElem.getValueAsType(qname);
>
> return result;
> }
>
> }
>
> I hope that someone does find it as useful as I do.
>
>
> Cheers,
>
>
> Michael
>