DO NOT REPLY TO THIS EMAIL, BUT PLEASE POST YOUR BUG RELATED COMMENTS THROUGH THE WEB INTERFACE AVAILABLE AT <http://nagoya.apache.org/bugzilla/show_bug.cgi?id=10219>. ANY REPLY MADE TO THIS MESSAGE WILL NOT BE COLLECTED AND INSERTED IN THE BUG DATABASE.
http://nagoya.apache.org/bugzilla/show_bug.cgi?id=10219 RemoteException detail field does not contain real exception Summary: RemoteException detail field does not contain real exception Product: Axis Version: current (nightly) Platform: PC OS/Version: Windows NT/2K Status: NEW Severity: Normal Priority: Other Component: Basic Architecture AssignedTo: [EMAIL PROTECTED] ReportedBy: [EMAIL PROTECTED] When an impl throws a java.lang.IllegalArgumentException, the client receives a java.rmi.RemoteException. However, the detail field of the RemoteException contains null instead of the exception. I tested with the 2002-06-24 Axis nightly build. The test/wsdl/addrNoImplSEI functional test verifies this functionality, but the test does not allow the exception generated to reach the *TestCase class. Therefore, the failure is not reported by Junit. I added the following fixes to my build (lines are marked with ** New **): org/apache/axis/AxisFault.java public AxisFault(QName code, String str, String actor, Element[] details) { super (str); setFaultCode( code ); setFaultString( str ); setFaultActor( actor ); setFaultDetail( details ); setExceptionDetail( str ); //** New ** if (details == null) initFromException(this); } // ** New Method ** public void setExceptionDetail(String exception) { if ((exception != null) && (exception != "")) { try { Object exceptionCls = ClassUtils.forName(exception).newInstance (); detail = (Exception) exceptionCls; } catch (Exception e) { } } } org/apache/axis/message/SOAPFaultBuilder.java public void endElement(String namespace, String localName, DeserializationContext context) throws SAXException { super.endElement(namespace, localName, context); AxisFault f = null; if (faultClassName != null) { try { Class exClass = ClassUtils.forName(faultClassName); if (AxisFault.class.isAssignableFrom(exClass)) { f = (AxisFault) exClass.newInstance(); f.setFaultCode(faultCode); f.setFaultString(faultString); f.setFaultActor(faultActor); f.setFaultDetail(faultDetails); f.setExceptionDetail(faultString); // ** New ** } } catch (Exception e) { // Don't do anything here, since a problem above means // we'll just fall through and use a plain AxisFault. } } if (f == null) { f = new AxisFault(faultCode, faultString, faultActor, faultDetails); } element.setFault(f); } test/wsd/addrNoImplSEI/Main.java public static void main (String[] args) throws Exception { try { Options opts = new Options(args); System.err.println ("Using proxy without session maintenance."); System.err.println ("(queries without session should say: \"ADDRESS NOT FOUND!\")"); AddressBookNoImplSEIService abs = new AddressBookNoImplSEIServiceLocator(); opts.setDefaultURL( abs.getAddressBookNoImplSEIAddress() ); URL serviceURL = new URL(opts.getURL()); AddressBookNoImplSEI ab1 = null; if (serviceURL == null) { ab1 = abs.getAddressBookNoImplSEI(); } else { ab1 = abs.getAddressBookNoImplSEI(serviceURL); } Object ret = doit (ab1); if (ret != null) { throw new Exception("non-session test expected null response, got "+ret); } System.err.println ("\n\nUsing proxy with session maintenance."); AddressBookNoImplSEI ab2 = null; if (serviceURL == null) { ab2 = abs.getAddressBookNoImplSEI(); } else { ab2 = abs.getAddressBookNoImplSEI(serviceURL); } ((AddressBookNoImplSEISoapBindingStub) ab2).setMaintainSession (true); ret = doit (ab2); if (ret == null) { throw new Exception("session test expected non-null response, got "+ret); } } catch (Exception e) { e.printStackTrace(); throw e; // ** New ** } }