웹 서비스 자원 프레임워크 기본 결함
웹 서비스 자원 프레임워크(WSRF)는 모든 서비스 특정 결함을 유도할 수 있는 권장하는 기본 결함 메시지 요소 유형을 제공합니다. 공통 기본 유형의 이점은 기본적으로 모든 결함이 공통 정보를 포함할 수 있다는 점입니다. 이 동작은 결함이 분석되기 전에 소프트웨어의 여러 계층을 통해 체계적으로 로그되거나 전달되는 복합 시스템에 유용합니다.
- 필수 시간소인
- 결함의 발신원을 나타내는 데 사용할 수 있는 요소.
- 결함을 설명하고 분류할 수 있는 기타 요소.
- ResourceUnkownFault
- 메시지를 수신하는 서비스가 WS-Resource를 알 수 없음을 나타내는 데 사용되는 결함.
- ResourceUnavailableFault
- 이 결함은 웹 서비스가 활성이지만 일시적으로 자원에 대한 액세스를 제공할 수 없음을 나타내는 데 사용됩니다.
<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>
BaseFault 클래스
JAX-RPC 애플리케이션의 경우, WebSphere® Application Server는 각 Java™ 예외가 com.ibm.websphere.wsrf.BaseFault 클래스를 확장하는 예외 계층 구조를 형성하면서 WSRF 스펙에 정의된 모든 기본 결함 요소 유형에 대한 Java 코드 맵핑을 제공합니다. 각 결함 클래스는 유사한 패턴을 따릅니다.
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 인스턴스를 랩핑하여 해당 인스턴스의 직렬화 가능 양식을 제공할 수 있습니다.
// 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 인스턴스도 직렬화 가능 요구사항을 준수해야 합니다.
애플리케이션 특정 결함
<xsd:complexType name="PrinterFaultType">
<xsd:complexContent>
<xsd:extension base="wsrf-bf:BaseFaultType"/>
</xsd:complexContent>
</xsd:complexType>
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)
{
...
}
}
...
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 클래스의 인스턴스로 직렬화 해제하는 방식을 정의할 사용자 정의 바인더를 제공해야 합니다.
<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 데이터의 직렬화 및 직렬화 해제를 위한 추가 로직만 제공해야 합니다.
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;
}
...
}