JBoss Community

Re: Custom exceptions with @WebFault

created by John Fitzpatrick in JBoss Web Services - View the full discussion

Have you tried defining the fault in your wsdl file and then using wsimport to have the JAXB artifacts generated for you?

 

Example that I think should work:

 

wsdl:

 

<?xml version="1.0" encoding="UTF-8"?>

 

<definitions

    name="SubtractNumbers"

    targetNamespace="http://duke.example.org"

    xmlns:tns="http://duke.example.org"

    xmlns="http://schemas.xmlsoap.org/wsdl/"

    xmlns:xsd="http://www.w3.org/2001/XMLSchema"

    xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">

    <types>

        <xsd:schema

            xmlns="http://www.w3.org/2001/XMLSchema"

            targetNamespace="http://duke.example.org"

            elementFormDefault="qualified">

 

            <complexType name="subtractNumbersResponse">

                <sequence>

                    <element name="return" type="xsd:int" />

                </sequence>

            </complexType>

            <element name="subtractNumbersResponse" type="tns:subtractNumbersResponse"/>

 

            <complexType name="subtractNumbers">

                <sequence>

                    <element name="arg0" type="xsd:int" />

                    <element name="arg1" type="xsd:int" />

                </sequence>

            </complexType>

            <element name="subtractNumbers" type="tns:subtractNumbers"/>

 

            <element name="permissionDeniedFault">

                <complexType>

                    <sequence>

                        <element name="message" type="xsd:string"/>

                    </sequence>

                </complexType>

            </element>

 

        </xsd:schema>

    </types>

    <message name="subtractNumbers">

        <part name="parameters" element="tns:subtractNumbers" />

    </message>

    <message name="subtractNumbersResponse">

        <part name="result" element="tns:subtractNumbersResponse" />

    </message>

    <message name="permissionDeniedException">

        <part name="permissionDeniedFault" element="tns:permissionDeniedFault"/>

    </message>

    <portType name="SubtractNumbersPortType">

        <operation name="subtractNumbers">

            <input message="tns:subtractNumbers" />

            <output message="tns:subtractNumbersResponse" />

            <fault name="permissionDeniedFault" message="tns:permissionDeniedException" />

        </operation>

    </portType>

    <binding name="SubtractNumbersBinding" type="tns:SubtractNumbersPortType">

        <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document" />

        <operation name="subtractNumbers">

            <soap:operation soapAction="" />

            <input>

                <soap:body use="literal" />

            </input>

            <output>

                <soap:body use="literal" />

            </output>

            <fault name="permissionDeniedFault">

                <soap:fault use="literal" name="permissionDeniedFault" />

            </fault>

        </operation>

    </binding>

    <service name="SubtractNumbersService">

        <port name="SubtractNumbersPort" binding="tns:SubtractNumbersBinding">

            <soap:address location="REPLACE_WITH_ACTUAL_URL" />

        </port>

    </service>

</definitions>

 

Generated fault/exception related artificats:

 

@XmlAccessorType(XmlAccessType.FIELD)

@XmlType(name = "", propOrder = {

    "message"

})

@XmlRootElement(name = "permissionDeniedFault")

public class PermissionDeniedFault {

 

    @XmlElement(required = true)

    protected String message;

 

    /**

     * Gets the value of the message property.

     *

     * @return

     *     possible object is

     *     {@link String }

     *    

     */

    public String getMessage() {

        return message;

    }

 

    /**

     * Sets the value of the message property.

     *

     * @param value

     *     allowed object is

     *     {@link String }

     *    

     */

    public void setMessage(String value) {

        this.message = value;

    }

 

}

 

@WebFault(name = "permissionDeniedFault", targetNamespace = "http://duke.example.org")

public class PermissionDeniedException

    extends Exception

{

 

    /**

     * Java type that goes as soapenv:Fault detail element.

     *

     */

    private PermissionDeniedFault faultInfo;

 

    /**

     *

     * @param message

     * @param faultInfo

     */

    public PermissionDeniedException(String message, PermissionDeniedFault faultInfo) {

        super(message);

        this.faultInfo = faultInfo;

    }

 

    /**

     *

     * @param message

     * @param faultInfo

     * @param cause

     */

    public PermissionDeniedException(String message, PermissionDeniedFault faultInfo, Throwable cause) {

        super(message, cause);

        this.faultInfo = faultInfo;

    }

 

    /**

     *

     * @return

     *     returns fault bean: provider.server.PermissionDeniedFault

     */

    public PermissionDeniedFault getFaultInfo() {

        return faultInfo;

    }

 

}

 

Implementation class:

 

@WebService (serviceName = "SubtractNumbersService",

        portName = "SubtractNumbersPort",

        endpointInterface = "provider.server.SubtractNumbersPortType" )

public class  SubtractNumbersImpl {

 

    public int subtractNumbers(int arg1, int arg2) throws PermissionDeniedException {

    

          PermissionDeniedFault permissionDeniedFault = new PermissionDeniedFault();

          permissionDeniedFault.setMessage("Your custom message here explain why permission was denied.");

 

         throw new PermissionDeniedException("Permission denied.", permissionDeniedFault);

    }

}

Reply to this message by going to Community

Start a new discussion in JBoss Web Services at Community