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
>