웹 서비스 자원 프레임워크 기본 결함

웹 서비스 자원 프레임워크(WSRF)는 모든 서비스 특정 결함을 유도할 수 있는 권장하는 기본 결함 메시지 요소 유형을 제공합니다. 공통 기본 유형의 이점은 기본적으로 모든 결함이 공통 정보를 포함할 수 있다는 점입니다. 이 동작은 결함이 분석되기 전에 소프트웨어의 여러 계층을 통해 체계적으로 로그되거나 전달되는 복합 시스템에 유용합니다.

공통 정보는 다음 항목을 포함합니다.
  • 필수 시간소인
  • 결함의 발신원을 나타내는 데 사용할 수 있는 요소.
  • 결함을 설명하고 분류할 수 있는 기타 요소.
다음 두 가지 표준 결함은 모든 WSRF 조작에 사용하도록 정의된 것입니다.
ResourceUnkownFault
메시지를 수신하는 서비스가 WS-Resource를 알 수 없음을 나타내는 데 사용되는 결함.
ResourceUnavailableFault
이 결함은 웹 서비스가 활성이지만 일시적으로 자원에 대한 액세스를 제공할 수 없음을 나타내는 데 사용됩니다.
다음 XML 단편은 기본 결함 요소의 예를 표시합니다.
 <wsrf-bf:BaseFault>
    <wsrf-bf:Timestamp>2005-05-31T12:00:00.000Z</wsrf-bf:Timestamp>
    <wsrf-bf:Originator>
      <wsa:Address>
        http://www.example.org/Printer
      </wsa:Address>
      <wsa:ReferenceParameters>
        <pr:pr-id>P1</pr:pr-id>
      </wsa:ReferenceParameters>
    </wsrf-bf:Originator>
    <wsrf-bf:Description>Offline for service maintenance</wsrf-bf:Description>
    <wsrf-bf:FaultCause>OFFLINE</wsrf-bf:FaultCause>
 </wsrf-bf:BaseFault>
중요사항: 이 주제의 나머지에서 설명되는 요소 및 클래스는 JAX-RPC 애플리케이션에만 적용됩니다. 애플리케이션이 JAX-WS를 사용하는 경우, 특정 BaseFault 유형을 정의하고 사용하는 애플리케이션 WSDL 문서 및 XML 스키마에서(예: wsimport 도구로) 생성된 아티팩트를 사용하십시오.

BaseFault 클래스

JAX-RPC 애플리케이션의 경우, WebSphere® Application Server는 각 Java™ 예외가 com.ibm.websphere.wsrf.BaseFault 클래스를 확장하는 예외 계층 구조를 형성하면서 WSRF 스펙에 정의된 모든 기본 결함 요소 유형에 대한 Java 코드 맵핑을 제공합니다. 각 결함 클래스는 유사한 패턴을 따릅니다.

예를 들어, BaseFault 클래스는 다음 두 가지 생성자를 정의합니다.
package com.ibm.websphere.wsrf; 
public class BaseFault extends Exception
{
    public BaseFault()
    {
       ...
    }
    public BaseFault(EndpointReference originator,
                     ErrorCode errorCode,
                     FaultDescription[] descriptions,
                     IOSerializableSOAPElement faultCause,
                     IOSerializableSOAPElement[] extensibilityElements,
                     Attribute[] attributes)
    {
       ...
    }
    ...
}

IOSerializableSOAPElement 클래스

BaseFault 클래스는 java.lang.Exception 클래스를 확장하기 때문에 BaseFault 클래스는 java.io.Serializable 인터페이스를 구현해야 합니다. 이 요구사항을 충족시키려면 BaseFault 인스턴스의 모든 특성이 직렬화 가능해야 합니다. javax.xml.soap.SOAPElement 클래스가 직렬화가 가능하지 않으므로 WebSphere Application Server는 IOSerializableSOAPElement 클래스를 제공하며, 이 클래스를 사용하여 javax.xml.soap.SOAPElement 인스턴스를 랩핑하여 해당 인스턴스의 직렬화 가능 양식을 제공할 수 있습니다.

다음과 같이 IOSerializableSOAPElementFactory 클래스를 사용하여 IOSerializableSOAPElement 인스턴스를 작성하십시오.
// Get an instance of the IOSerializableSOAPElementFactory class
IOSerializableSOAPElementFactory factory = IOSerializableSOAPElementFactory.newInstance();

// Create an IOSerializableSOAPElement from a javax.xml.soap.SOAPElement
IOSerializableSOAPElement serializableSOAPElement = factory.createElement(soapElement);

// You can retrieve the wrapped SOAPElement from the IOSerializableSOAPElement
SOAPElement soapElement = serializableSOAPElement.getSOAPElement();

모든 애플리케이션 특정 BaseFault 인스턴스도 직렬화 가능 요구사항을 준수해야 합니다.

애플리케이션 특정 결함

애플리케이션은 BaseFault 요소의 자체 확장을 정의할 수 있습니다. XML 유형 확장을 사용하여 BaseFaultType 요소를 확장하는 애플리케이션 결함에 대한 새 XML 유형을 정의하십시오. 예를 들어, 다음 XML 단편은 새 PrinterFaultType 요소를 작성합니다.
 <xsd:complexType name="PrinterFaultType">
   <xsd:complexContent>
     <xsd:extension base="wsrf-bf:BaseFaultType"/>
   </xsd:complexContent>
 </xsd:complexType>
다음 예제는 WSDL 정의가 두 가지 wsdl:fault 메시지를 선언하는 인쇄 조작을 정의할 수 있는 웹 서비스 애플리케이션이 PrinterFault 오브젝트를 구성하는 방식을 보여줍니다.
import com.ibm.websphere.wsrf.BaseFault;
import com.ibm.websphere.wsrf.*;
import javax.xml.soap.SOAPFactory;
...
    public void print(PrintRequest req) throws PrinterFault, ResourceUnknownFault
    {
        // Determine the identity of the target printer instance.
        PrinterState state = PrinterState.getState ();
        if (state.OFFLINE)
        {       
            try 
            {      
                // Get an instance of the SOAPFactory
                SOAPFactory soapFactory = SOAPFactory.newInstance();
      
                // Create the fault cause SOAPElement
                SOAPElement faultCause = soapFactory.createElement("FaultCause");
                faultCase.addTextNode("OFFLINE");

                // Get an instance of the IOSerializableSOAPElementFactory
                IOSerializableSOAPElementFactory factory = IOSerializableSOAPElementFactory.newInstance();

                // Create an IOSerializableSOAPElement from the faultCause SOAPElement
                IOSerializableSOAPElement serializableFaultCause = factory.createElement(faultCause);

                FaultDescription[] faultDescription = new FaultDescription[1];
                faultDescription[0] = new FaultDescription("Offline for service maintenance");
                throw new PrinterFault(
                         state.getPrinterEndpointReference(),
                         null, 
                         faultDescription,
                         serializableFaultCause,
                         null, 
                         null);             }
            catch (SOAPException e)
            {
               ...
            }
        }
        ...
다음 코드는 기본 결함 계층 구조가 Java 예외 계층 구조로 처리되는 방식을 보여줍니다.
import com.ibm.websphere.wsrf.BaseFault;
import com.ibm.websphere.wsrf.*;
...
try 
{
   printer1.print(job1);
}
catch (ResourceUnknownFault exc)
{
   System.out.println("Operation threw the ResourceUnknownFault"); 
}
catch (PrinterFault exc)
{
   System.out.println("Operation threw PrinterFault"); 
}
catch (BaseFault exc)
{
   System.out.println("Exception is another BaseFault"); 
}
catch (Exception exc)
{
   System.out.println("Exception is not a BaseFault"); 
}

사용자 정의 바인더

이전에 표시된 PrinterFaultType 유형의 PrinterFault 결함과 같이 새 애플리케이션 레벨 기본 결함을 정의할 때에는 웹 서비스 런타임이 Java 클래스를 적절한 XML 메시지로 직렬화하는 방식 및 반대로 XML 메시지를 Java 클래스의 인스턴스로 직렬화 해제하는 방식을 정의할 사용자 정의 바인더를 제공해야 합니다.

사용자 정의 바인더는 com.ibm.wsspi.webservices.binding.CustomBinder 인터페이스를 구현해야 합니다. JAR 파일의 /META-INF/services 디렉토리에 있는 선언 메타데이터 파일인 CustomBindingProvider.xml과 함께 Java 아카이브(JAR) 파일에 바인더를 패키지하십시오. 이 메타데이터 파일은 사용자 정의 바인더, Java BaseFault 구현 및 BaseFault 유형 사이의 관계를 정의합니다. 예를 들어, 다음과 같이 PrinterFaultTypeBinder라는 사용자 정의 바인더를 정의하여 XML PrinterFaultType 요소와 Java 구현, PrinterFault 사이를 맵핑할 수 있습니다.
<customdatabinding:provider
   xmlns:customdatabinding="http://www.ibm.com/webservices/customdatabinding/2004/06"
   xmlns:pr="http://example.org/printer.xsd"
   xmlns="http://www.ibm.com/webservices/customdatabinding/2004/06">
 <mapping>
  <xmlQName>pr:PrinterFaultType</xmlQName>
  <javaName>PrinterFault</javaName>
  <qnameScope>complexType</qnameScope>
  <binder>PrinterFaultTypeBinder</binder>
 </mapping>
</customdatabinding:provider>

BaseFaultBinderHelper 클래스

WebSphere Application Server는 직렬화된 모든 BaseFault 클래스가 확장해야 하는 루트 BaseFault 클래스에 고유한 데이터에 대한 직렬화 및 직렬화 해제 지원을 제공하는 BaseFaultBinderHelper 클래스를 제공합니다. 사용자 정의 바인더가 BaseFaultBinderHelper 클래스를 사용하면 확장된 BaseFault 데이터의 직렬화 및 직렬화 해제를 위한 추가 로직만 제공해야 합니다.

다음 코드는 BaseFaultBinderHelper 클래스 지원을 이용하기 위해 PrinterFaultType 요소에 대한 사용자 정의 바인더를 구현하는 방식을 보여 줍니다.
import com.ibm.wsspi.wsrf.BaseFaultBinderHelper;
import com.ibm.wsspi.wsrf.BaseFaultBinderHelperFactory;
import com.ibm.wsspi.webservices.binding.CustomBinder;
import com.ibm.wsspi.webservices.binding.CustomBindingContext;
...
 
public PrinterFaultTypeBinder implements CustomBinder
{
   // Get an instance of the BaseFaultBinderHelper
   private BaseFaultBinderHelper baseFaultBinderHelper = BaseFaultBinderHelperFactory.getBaseFaultBinderHelper();
 
   public SOAPElement serialize(Object data, SOAPElement rootNode, CustomBindingContext context) throws SOAPException
   {
     // Serialize the BaseFault specific data
     baseFaultBinderHelper.serialize(rootNode, (BaseFault)data);
 
     // Serialize any PrinterFault specific data 
     ...
 
     // Return the serialized PrinterFault
     return rootNode;
   }
 
   public Object deserialize(SOAPElement rootNode, CustomBindingContext context) throws SOAPException
   {
     // Create an instance of a PrinterFault
     PrinterFault printerFault = new PrinterFault();
 
     // Deserialize the BaseFault specific data - any additional data that 
     // forms the PrinterFault extension will be returned as a SOAPElement[].
     SOAPElement[] printerFaultElements = baseFaultBinderHelper.deserialize(printerFault, rootNode);
 
     // Deserialize the PrinterFault specific data contained within the printerFaultElements SOAPElement[]
     ...
 
     // Return the deserialized PrinterFault
     return printerFault;
   }
 
  ...
 
}

주제 유형을 표시하는 아이콘 개념 주제



시간소인 아이콘 마지막 업데이트 날짜: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=cwbs_wsrf_basefault
파일 이름:cwbs_wsrf_basefault.html