JAX-WS Soap错误没有出现在WSDL中

我正在使用JAX-WS创建一个Web服务(我使用Java到WSDL方法创建它)。

我无法按照我的要求让我的例外工作。

我创建了以下exception类:

@WebFault public class MyWebServiceException extends SOAPFaultException { private static final long serialVersionUID = 8234753208722614057L; protected MyWebServiceException(SOAPFault fault) { super(fault); } protected MyWebServiceException(SOAPFault fault, Throwable throwable) { this(fault); super.setStackTrace(throwable.getStackTrace()); } } 

这允许我在SOAP响应中包含以下内容:

 E0010 Invalid Report   Invalid Report   

但是,因为我的exception是扩展RuntimeExceptionSOAPFaultException ,所以它没有被添加到WSDL中,因此当服务的用户生成其客户端存根时,不包括exception。

有谁知道如何创建此exception以给我预期的输出(即包括faultcode和faultstring),但也出现在WSDL中(我想它需要是一个经过检查的exception)

我搜索了高低,想出了我已经拥有的东西!

如果声明WebMethod抛出MyWebServiceException,它将出现在WSDL上。

但是你可能不应该使用SOAPFault代码。 如果您创建了一个业务exception并抛出它,您可以在客户端获取错误代码,并使用soap内部进行操作。

你的网络方法看起来像:

 @WebMethod public String sayHello(@WebParam String name, @WebParam String thing) throws MyException { // TODO Auto-generated method stub if ("err".equals(name)) throw new MyException("E0010","Report not found"); return null; } 

您的业​​务例外:

 public class MyException extends Exception { private static final long serialVersionUID = -923394585528818428L; public MyException(String errorCode,String errorMessage) { this.errorCode = errorCode; this.errorMessage = errorMessage; } public String getErrorCode() { return errorCode; } public void setErrorCode(String errorCode) { this.errorCode = errorCode; } public String getErrorMessage() { return errorMessage; } public void setErrorMessage(String errorMessage) { this.errorMessage = errorMessage; } String errorCode; String errorMessage; } 

返回的onexception将是:

    soap:Server Fault occurred while processing.   Report not found E0010      

您还可以添加堆栈跟踪,但最好是登录服务器,如果需要,可以使用GUUID与客户端错误相关联。

假设您使用的是JAX-WS而不是JAX-RPC,则可以删除extends SOAPFaultException 。 然后将必填字段添加到您自己的exception中:

这是一个StackTraceElement(仅作为示例):

  public class SOAPStackElement implements Serializable { private static final long serialVersionUID = 1L; @XmlAttribute(name="class") private String class; @XmlAttribute(name="file") private String file; @XmlAttribute(name="methodname") private String methodName; @XmlAttribute(name="line") private Integer line; } 

这是SOAP-Info:

  public class SOAPFaultInfo implements Serializable { @XmlElementWrapper(name="stackTrace") private SOAPStackElement[] stackTrace; @XmlElement(name="faultcode") private String faultCode; @XmlElement(name="faultstring") private String faultString; /* what else your heart desires. :-) */ } 

这是一个真正的例外:

  @WebFault public class MyWebServiceException extends Exception { private static final long serialVersionUID = 1L; private SOAPFaultInfo faultInfo; protected MyWebServiceException(SOAPFaultInfo fault) { super(); this.faultInfo = fault; } protected MyWebServiceException(SOAPFaultInfo fault, Throwable cause) { super(cause); this.faultInfo = fault; } public SOAPFaultInfo getFaultInfo() { return faultInfo; } } 

老实说,我没有把它变成一个测试项目。 所以你可能需要解决一些编译问题。 但我希望你能得到这张照片。