[ 
http://issues.apache.org/jira/browse/AXIS2-801?page=comments#action_12415038 ] 

Bille commented on AXIS2-801:
-----------------------------

you mentioned "BTW, set all the fault properties to the in message context when 
you are throwing the fault."

I set those properties, that are obligate as to the SOAP 1.2 specification; 
should I aso set the optional parameters?

> UserException -> AxisFault is not put in details to the SOAP-response ++ 
> Davanum advised me to open an issue
> ------------------------------------------------------------------------------------------------------------
>
>          Key: AXIS2-801
>          URL: http://issues.apache.org/jira/browse/AXIS2-801
>      Project: Apache Axis 2.0 (Axis2)
>         Type: Bug

>   Components: transports
>     Versions: 1.0
>  Environment: WinXP Prof, JDK 1.4.2_09,Tomcat 5.0.28,
>     Reporter: Bille
>     Assignee: Eran Chinthaka

>
> Service works fine in normal use. I did not use code-generation with WSDL; I 
> created it manually.
> When one parameter for the service is not usable, the service should throw a 
> KIDnotFoundException, which then should be transported with all its details 
> as a SOAPFault in the response to the client.
> ------------------------- my UserException -----------------
> import java.rmi.RemoteException;
> public class KIDnotFoundException extends RemoteException {
>               public KIDnotFoundException(String message, Throwable ex){
>                       super(message, ex);                                   
>               }
> }
> ------------------------- my service implementation -----------------
> import de.eonis.bd.ws.util.*;
> import java.util.*;
> import java.util.logging.Logger;
> import javax.naming.NamingEnumeration;   // JDK
> import javax.naming.NamingException;
> import javax.naming.directory.*;
> import javax.xml.namespace.QName;   // aus stax-api-1.0.jar
> import org.apache.axiom.om.*;    // aus axiom-api-1.0.jar
> import org.apache.axiom.soap.*;
> import org.apache.axis2.AxisFault;
> import org.apache.axis2.context.*;
> import org.apache.axis2.context.*;
> import org.apache.axis2.wsdl.WSDLConstants;
> public class LDAPQueryService {
>       private LDAPQuery ldapQuery = null;
>       private MessageContext inMsgCtx = null;
>       private MessageContext outMsgCtx = null;
>       
>       // Konstanten fuer die Market-Units (MU)
>       public static final String MU_EAG = "eonag";
>       public static final String MU_EEA = "eea";
>       public static final String MU_ERG = "ruhrgas";
>       public static final String MU_NOR = "eno";
>       public static final String MU_UK = "eonuk";
>       public static final String MU_US = "lgee";
>       public static final String MU_ALL = "global";
>       // lasse ich init(param in) und setOperationConext drin erhalte ich den 
> Fehler beim Starten des Tomcat
>       /**
>        * - Error in schema generating  Sorry we don't support methods 
> overloading !!!! 
> java.lang.Exception:  Sorry we don't support methods overloading !!!! 
>       at 
> org.apache.ws.java2wsdl.SchemaGenerator.generateSchema(SchemaGenerator.java:143)
>       at 
> org.apache.axis2.deployment.util.Utils.fillAxisService(Utils.java:213)
>       at 
> org.apache.axis2.deployment.ServiceBuilder.populateService(ServiceBuilder.java:149)
>       at 
> org.apache.axis2.deployment.repository.util.ArchiveReader.buildServiceGroup(ArchiveReader.java:76)
>       at 
> org.apache.axis2.deployment.repository.util.ArchiveReader.processServiceGroup(ArchiveReader.java:118)
>       at 
> org.apache.axis2.deployment.DeploymentEngine.doDeploy(DeploymentEngine.java:620)
>       ....
>        */
>       /*
>       public void init(MessageContext msgCtx){
> System.out.println("setting MessageContext: " + msgCtx.toString());           
>               this.MsgCtx = msgCtx;
>       }
> /**   
>       public void init(MessageContext inCtx, MessageContext msgCtx){
>               System.out.println("setting outgoing MessageContext: " + 
> msgCtx.toString());            
>                               this.msgCtx = msgCtx;
>                       }
>                       
> **/
>       
>       /**
>        * Das geht
>        * aus : http://marc.theaimsgroup.com/?l=axis-user&m=114715486422557&w=2
>        */
>       public void setOperationContext(OperationContext opctx) throws 
> AxisFault {
> System.out.println("setting in- & outgoing MessageContext: " + 
> opctx.toString());             
>           this.inMsgCtx =     
> opctx.getMessageContext(WSDLConstants.MESSAGE_LABEL_IN_VALUE);
>           this.outMsgCtx = 
> opctx.getMessageContext(WSDLConstants.MESSAGE_LABEL_OUT_VALUE);
>       }
>       
>       
>       /**
>        * Liefert die Gruppen eines Users im EONGDS, dh fuer alle moeglichen 
> MUs.
>        * Die MU des Users kann noch mit uebergeben werden, dann wird auch nur 
> in diesem Container 
>        * nach dem User gesucht.
>        *  
>        * Das EONGDS ist aktuell noch nicht soweit mit dem GDir 
> synchronisiert, dass darueber
>        * alle MUs abbildbar waeren.
>        * Zur Zeit enthalten GDir und EONGDS nicht die gleichen Gruppen.
>        *   
>        * @param kid String die eindeutige Konzern-ID des Users.
>        * @param mu String Kuerzel fuer die zu durchsuchende MU
>        */
>       public OMElement getEONGDSGroups(OMElement input) throws AxisFault {
>               // String kid, String marketUnit
>               String method = "getEONGDSGroups()";
>               // fully qualified Names
>               QName kidName = new QName(OMHelper.NAMESPACE, "kid");
>               String kid = input.getFirstChildWithName(kidName).getText();
>               QName muName = new QName(OMHelper.NAMESPACE, "mu");
>               String mu = input.getFirstChildWithName(muName).getText();
> System.out.println("Up to search EONGDS-Groups for KID " + kid + " in MU " + 
> mu);             
>               
>               OMElement result;
>               if (Utils.isValidKID(kid)){
>                       try {                   
> System.out.println("up to query directory...");
>                               ldapQuery = new LDAPQuery(false, 
> LDAPQuery.EONGDS, "o=eon,c=de");
>                               // nur Groupmembership-Attribut ist relevant
>                               ldapQuery.setReturnAtts(new String 
> []{"groupmembership"});
>                               String base = "ou=users,ou=" + mu + 
> ",o=eon,c=de";
>                               String filter = "(&(cn=" + kid + 
> ")(objectClass=person))";
>                               NamingEnumeration data = 
> ldapQuery.querySubtree(base, filter);
>                               result = OMHelper.getSOAPFromLDAPResult(data);
>                       } 
>                       catch (NamingException ne){
>                               result = null;
> System.out.println("getEONGDSGroups throws NamingException: " + 
> ne.getMessage());                             
>                               SOAPFactory soapFactory = 
> OMAbstractFactory.getSOAP12Factory(); 
>                               SOAPFault soapFault = 
> soapFactory.createSOAPFault();
>                               SOAPFaultCode faultCode = 
> soapFactory.createSOAPFaultCode(soapFault);
>                               
> faultCode.declareNamespace("http://someuri.org";, "m");
>         SOAPFaultValue soapFaultValue = 
> soapFactory.createSOAPFaultValue(faultCode);
>         soapFaultValue.setText("m:FaultException");   
>                               SOAPFaultReason soapFaultReason = 
> soapFactory.createSOAPFaultReason(soapFault);
>                               SOAPFaultText soapFaultText = 
> soapFactory.createSOAPFaultText(soapFaultReason);
>                               soapFaultText.setText("the reason of the 
> error");
>                   
>                               // setting the outgoing MessageContext
>                               
> outMsgCtx.setProperty(SOAP12Constants.SOAP_FAULT_CODE_LOCAL_NAME, faultCode);
>             
> outMsgCtx.setProperty(SOAP12Constants.SOAP_FAULT_REASON_LOCAL_NAME, 
> soapFaultReason);
>             
> //outMsgCtx.setProperty(SOAP12Constants.SOAP_FAULT_DETAIL_LOCAL_NAME, 
> faultDetail);
>                       
>                               // throw the AxisFault
>                                throw new AxisFault("Exception in 
> service-method :: getEONGDSGrous()", ne);
>                       }
>               }
>               else {
>                       String text = "invalid KID: KID' " + kid + "' not found 
> in MU '" + mu + "'";
>                       result = handleInvalidData(text, method);
>               }
>       
>               return result;
>               
>       }       
>       // ... some more service-methods ...
> }
> ------------------------- the SOAP response -----------------
> <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/";>
> <soapenv:Header />
> <soapenv:Body>
> <soapenv:Fault>
>                 <faultcode>soapenv:Client</faultcode>
>                 <faultstring>unknown</faultstring>
>                 <detail>
>                   <Exception>
>                      org.apache.axis2.AxisFault
>                      at 
> org.apache.axis2.receivers.RawXMLINOutMessageReceiver.invokeBusinessLogic(RawXMLINOutMessageReceiver.java:102)
>                      at 
> org.apache.axis2.receivers.AbstractInOutSyncMessageReceiver.receive(AbstractInOutSyncMessageReceiver.java:37)
>                      at 
> org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:454) 
>                      at 
> org.apache.axis2.transport.http.HTTPTransportUtils.processHTTPPostRequest(HTTPTransportUtils.java:284)
>                      at 
> org.apache.axis2.transport.http.AxisServlet.doPost(AxisServlet.java:136) 
>                      at 
> javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
>                      at 
> javax.servlet.http.HttpServlet.service(HttpServlet.java:802) 
>                      at 
> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237)
>  
>                      at 
> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
>  
>                      at 
> org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214)
>                   
>                      at 
> org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
>                      ....
>                   </Exception>
>                 </detail>
> </soapenv:Fault>
> </soapenv:Body>
> </soapenv:Envelope>
> ------------------------- SOAPFault manually built  -----------------
> The following is set to the outgoing messageContext in my 
> serviceimplementation - outMsgCtx.setProperty():
> <soapenv:Fault xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope";>
> <soapenv:Code xmlns:m="http://someuri.org";>
>       <soapenv:Value>m:FaultException</soapenv:Value>
> </soapenv:Code>
> <soapenv:Reason>
>       <soapenv:Text>the reason of the error</soapenv:Text>
> </soapenv:Reason>
> </soapenv:Fault>
> ------------------------- issues I wonder about -----------------
> 1)  My details aren't reaching the client. The following I found out while 
> debugging the service:
> In class RawXMLINOutMessageReceiver::invokeBusinessLogic() my service-method 
> is called and throws an exception as expected. The exception is of type
> InvocationTargetException and has as a member variable called "target" an 
> object of type AxisFault, with the detailvariable set to the originally 
> thrown exception and the detailmessage set to my individuel errormessage.
> The invokeBusinessLogic() catches this exception and throws an AxisFault 
> using mentioned InvocationTargetException, like this:
> throw new AxisFault(e.getMessage());
> The message member of the InvocationTargetException is null !! so all my user 
> definitions are gone.
> 2) The above depicted response looks like SOAP 1.1 and not 1.2.  I thought 
> Axis2 would work with SOAP 1.2 per default ?
> 3) In addition the faultCode says CLIENT !!!
> 4) I could access the messageContext only by setOperationContext(). I 
> formerly tried the init(param1); if so I get a serious error while starting 
> the server:
>  - Error in schema generating  Sorry we don't support methods overloading 
> !!!! 
> java.lang.Exception:  Sorry we don't support methods overloading !!!! 
>       at 
> org.apache.ws.java2wsdl.SchemaGenerator.generateSchema(SchemaGenerator.java:143)
>       at 
> org.apache.axis2.deployment.util.Utils.fillAxisService(Utils.java:213)
>       at 
> org.apache.axis2.deployment.ServiceBuilder.populateService(ServiceBuilder.java:149)
>       at 
> org.apache.axis2.deployment.repository.util.ArchiveReader.buildServiceGroup(ArchiveReader.java:76)
>       at 
> org.apache.axis2.deployment.repository.util.ArchiveReader.processServiceGroup(ArchiveReader.java:118)
>       at 
> org.apache.axis2.deployment.DeploymentEngine.doDeploy(DeploymentEngine.java:620)
> Maybe I'm missing something; unfortunately I could not find any sample for 
> using UserExeptions the right way.
> Could someone clear these issues please - Thanks a lot

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
   http://www.atlassian.com/software/jira


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to