2015-10-14 8 views
8

wsdl:faultを使用しようとしていますが、予想されるJavaクラス(例外)を生成できません。私が生成されますクラス(注釈とゲッター/セッターを削除):wsdl:errorCodeとerrorMessageを使用して例外を生成する方法は?

public class ProjectException extends Exception { 
    private com.home.project.generated.Fault fault; 
} 

public class Fault { 
    protected String errorMessage; 
    protected long errorCode; 
} 

私が生成されますことを期待クラス:

public class ProjectException extends Exception { 
    protected String errorMessage; 
    protected long errorCode; 
} 

私のwsdl:

<?xml version="1.0" encoding="UTF-8"?> 
<wsdl:definitions name="ProjectSoapServiceImplService" 
        targetNamespace="http://www.home.com/webservices/v1_0/project/" 
        xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
        xmlns:tns="http://www.home.com/webservices/v1_0/project/" 
        xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"> 
    <wsdl:types> 
     <xs:schema xmlns:tns="http://www.home.com/webservices/v1_0/project/" 
        xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="unqualified" 
        targetNamespace="http://www.home.com/webservices/v1_0/project/" version="1.0"> 

      <xs:element name="createProject" type="tns:projectRequest"/> 
      <xs:element name="projectResponse" type="tns:projectResponse"/> 

      <xs:complexType name="projectRequest"> 
       <xs:sequence> 
        <xs:element minOccurs="0" name="projectName" type="xs:string"/> 
       </xs:sequence> 
      </xs:complexType> 
      <xs:complexType name="projectResponse"> 
       <xs:sequence> 
        <xs:element minOccurs="0" name="projectId" type="xs:long"/> 
       </xs:sequence> 
      </xs:complexType> 
      <xs:element name="fault"> 
       <xs:complexType> 
        <xs:sequence> 
         <xs:element name="errorMessage" type="xs:string"/> 
         <xs:element name="errorCode" type="xs:long"/> 
        </xs:sequence> 
       </xs:complexType> 
      </xs:element> 
     </xs:schema> 

    </wsdl:types> 
    <wsdl:message name="createProject"> 
     <wsdl:part name="parameters" element="tns:createProject"/> 
    </wsdl:message> 
    <wsdl:message name="createProjectResponse"> 
     <wsdl:part name="parameters" element="tns:projectResponse"> 
     </wsdl:part> 
    </wsdl:message> 
    <wsdl:message name="projectException"> 
     <wsdl:part name="faultMessage" element="tns:fault"/> 
    </wsdl:message> 
    <wsdl:portType name="ProjectPort"> 
     <wsdl:operation name="createProject"> 
      <wsdl:input name="createProject" message="tns:createProject"/> 
      <wsdl:output name="createProjectResponse" message="tns:createProjectResponse"/> 
      <wsdl:fault name="fault" message="tns:projectException"/> 
     </wsdl:operation> 
    </wsdl:portType> 
    <wsdl:binding name="ProjectSoapServiceImplServiceSoapBinding" type="tns:ProjectPort"> 
     <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> 
     <wsdl:operation name="createProject"> 
      <soap:operation soapAction="" style="document"/> 
      <wsdl:input name="createProject"> 
       <soap:body use="literal"/> 
      </wsdl:input> 
      <wsdl:output name="createProjectResponse"> 
       <soap:body use="literal"/> 
      </wsdl:output> 
      <wsdl:fault name="fault"> 
       <soap:fault name="fault" use="literal"/> 
      </wsdl:fault> 
     </wsdl:operation> 
    </wsdl:binding> 
    <wsdl:service name="ProjectSoapServiceImplService"> 
     <wsdl:port name="ProjectPortPort" binding="tns:ProjectSoapServiceImplServiceSoapBinding"> 
      <soap:address location="http://localhost:9090/ProjectPortPort"/> 
     </wsdl:port> 
    </wsdl:service> 
</wsdl:definitions> 

任意のアイデアをどのように直接クラスのインラインプロパティ?

おかげで、事前に

+0

wsdlは同じままである必要がありますか? – approxiblue

+0

変更される可能性があります –

答えて

2

仕様JAX-WS 2.1 http://download.oracle.com/otndocs/jcp/jaxws-2.1-mrel2-eval-oth-JSpec/によれば、マップされたフォルトには、フォルトBeanを含むExceptionが必要です。仕様を実装するツールを使用すると、JavaFault Beanを含む@WebFaultでアノテーションされた例外ラッパーが常に提供されます。

0

JAX-WSの障害渡すと例外処理を使用してWebサービスをセットアップする方法を見つけてください。

ニーズによると、私は@WebFault注釈を使用します。

Webサービス・インタフェース:障害を持つ

package foo.bar; 

import javax.jws.WebMethod; 
import javax.jws.WebService; 

@WebService 
public interface MyProjectService { 

    @WebMethod 
    public String createProject(String name) throws ProjectException; 
} 

Webサービス実装:

ここに、私たちは、プロジェクト名に従って例外をシミュレートします。

package foo.bar; 

import javax.jws.WebMethod; 
import javax.jws.WebParam; 
import javax.jws.WebService; 

@WebService(serviceName="MyProjectService", portName="MyProjectServiceService") 
public class MyProjectServiceImpl implements MyProjectService { 

    public MyProjectServiceImpl() { 
    } 

    @WebMethod 
    public String createProject(@WebParam(name="name") String name) throws ProjectException { 
     if (name.equalsIgnoreCase("bad name")) { 
      ProjectFault fault = new ProjectFault(); 
      fault.setFaultCode("123"); 
      fault.setFaultString("Custom error message"); 
      throw new ProjectException("123","Custom error message"); 
     } else { 
      return "Project created : " + name; 
     } 
    } 
} 

ProjectFault豆:

ProjectFaultクラスは、例外を処理するためにJAXBランタイムによって必要とされます。

package foo.bar; 

public class ProjectFault { 

    private String faultCode; 
    private String faultString; 

    public String getFaultCode() { 
     return faultCode; 
    } 

    public void setFaultCode(String faultCode) { 
     this.faultCode = faultCode; 
    } 

    public String getFaultString() { 
     return faultString; 
    } 

    public void setFaultString(String faultString) { 
     this.faultString = faultString; 
    } 
} 

カスタム例外:ProjectException

このクラスは、@WebFaultアノテーションを付けることが必要です。

package foo.bar; 

import javax.xml.ws.WebFault; 

@WebFault(name="ProjectFault") 
public class ProjectException extends Exception { 

    private ProjectFault fault; 

    public ProjectException() { 
    } 

    protected ProjectException(ProjectFault fault) { 
     super(fault.getFaultString()); 
     this.fault = fault; 
    } 

    public ProjectException(String message, ProjectFault faultInfo){ 
     super(message); 
     this.fault = faultInfo; 
    } 

    public ProjectException(String message, ProjectFault faultInfo, Throwable cause){ 
     super(message,cause); 
     this.fault = faultInfo; 
    } 

    public ProjectFault getFaultInfo(){ 
     return fault; 
    } 

    public ProjectException(String message) { 
     super(message); 
    } 

    public ProjectException(String code, String message) { 
     super(message); 
     this.fault = new ProjectFault(); 
     this.fault.setFaultString(message); 
     this.fault.setFaultCode(code); 
    } 

    public ProjectException(Throwable cause) { 
     super(cause); 
    } 

    public ProjectException(String message, Throwable cause) { 
     super(message, cause); 
    } 
} 

最後のステップは、あなたのWSDLを生成し、この例を適応させることです。私の知る限り、あなたが期待するものを生成するために達成することはできません言うことができるように

よろしく、アンドレ・

関連する問題