2013-02-01 5 views
0

서버에서 호스팅되는 일련의 웹 서비스가 있습니다.래퍼 라이브러리를위한 예외 클래스 디자인하기

본인은 웹 서비스 (java org.apache.axis.wsdl.WSDL2Java http://whatever1?wsdl, java org.apache.axis.wsdl.WSDL2Java http://whatever2?wsdl 등)

이 내가 jar 파일을 만들 수있는 많은 클래스를 생성하기위한 클래스 및 스텁을 생성하는 축을 사용합니다.

특정 프로젝트의 경우, jar의 다른 클래스를 사용하여 3 가지 작업을 수행하는 래퍼 클래스를 만들어야합니다. 이것은 자루에있는 모든 다른 클래스를 추상화하는 것입니다. & 현재 3 가지 다른 작업을 수행하기 위해 3 가지 다른 메소드를 호출하는 1 클래스가 있습니다.

랩퍼 클래스에 대한 코딩을 완료했지만 웹 서비스 클라이언트 jar 파일에서 발생한 예외를 처리하는 방법에 대해 매우 혼란 스럽습니다.

내 래퍼의 클라이언트가 원래 웹 서비스 클라이언트 jar의 클래스를 알 필요가 없다는 것이 하나의 요구 사항입니다. 그래서 래퍼 항아리 이외에 몇 가지 예외 클래스를 추가로 작성해야합니다. WebService에 클라이언트 항아리

차례에 org.apache.axis.AxisFault로부터 유도 WSException에서 유래 모두 사용자 정의 예외 클래스 3-4 상이한 타입 (I 클라이언트 항아리를 생성하도록 축을 사용하고 있기 때문이다)가있다.

이제는 예외 클래스를 어떻게 디자인 할 수 있는지 알아 내려고 노력하고 있습니다. 래퍼를 호출하는 코드가 웹 서비스 클라이언트를 직접 호출하는 경우 가질 수있는 정보를 잃지 않도록합니다.

세 가지 다른 작업을 수행하는 래퍼에 3 가지 방법 (예 : m1, m2, m3)이 있으므로 3 가지 예외 클래스 (m1exc, m2exc, m3exc)가 있다고 생각했습니다.

은, 내가 모든 것을 할 수 & WSException를 잡을 것이다 어디 시도의 catch 블록을 것, 래퍼 코드에서

class Wrap 
{ 
    void m1() throws m1exc, javax.xml.rpc.ServiceException, java.rmi.RemoteException 
    { 
     try 
     { 
      // call stuff from the webservice client jar to get things done 
     } 
     catch(WSException w) 
     { 
      throw new m1exc(w); 
     } 
    } 
} 

것 내 래퍼에서 샘플 예외 클래스

public class m1exc 
{ 
    WSException ws; 

    public m1exc(WSException e) 
    { 
     ws = e; 
    } 

    public String toString() 
    { 
     return ws.toString(); 
    } 
    // Returns the error code 
    public int getCode() 
    { 
     return ws.getCode(); 
    } 

} 

입니다 그렇지 않으면 통과합니다.

이 전략이 올바른 것 같습니까? 이것을 수행하는 더 좋은 방법이 있습니까? 주요 기준은 내 래퍼를 호출하는 코드가 예외 정보를 잃지 않아야한다는 것입니다. 이 목적을위한 표준 설계가 있습니까?

답변

1

당신은 당신이 성취하고자하는 것으로 믿는 WSException 클래스를 클라이언트에서 숨기지 않을 것입니다.

대신 m1exc 클래스에서 WSException에서 전달하는 인수로 codetoString을 인수로 허용하십시오. WSException 클래스에서 원하는 다른 필드를 추가 할 수 있습니다.

m1exc가 프로그래머가 원하는 값이 아닌 WSExceptions에 의해 생성되도록하려면 WSException을 허용하고 m1exc를 생성하는 m1exc 팩터 리를 만들 수 있습니다. 팩토리와 m1exc는 패키지 내에서 m1exc 생성자 만 액세스 할 수있게하는 m1exc 클래스의 생성자에 액세스 한정자 (public)가없는 동일한 패키지에 있어야합니다.숨기기 오른쪽 단어 인 경우

public class m1excFactory { 

    public static m1exc createM1Exc(WSExcetion e){ 
    return new m1exc(e.toString(), e.getCode()); 
    } 
} 

public class m1exc{ 
    String message; 
    int code; 

    m1exc(String message, int code) 
    { 
    this.message = message; 
    this.code = code; 
    } 

    public String toString() 
    { 
    return message; 
    } 
    // Returns the error code 
    public int getCode() 
    { 
     return code; 
    } 
} 
+0

확실하지 - 나는 단지에서 여러 클래스를 사용하고 대신 1 개 클래스를 사용의 복잡성에서 그들을 보호하기 위해 찾고 있어요 - 내 래퍼 및 관련 예외. 내 주요 관심사는 달리 사용할 수있는 예외 정보를 잃고 싶지 않다는 것입니다. 나는 위의 변화가 나를 어떻게 돕는 지 아직도 명확하지 않다. – user93353

+0

래퍼가 WSException 클래스를 사용하기 때문에 래퍼를 사용하는 모든 코드에서 클래스 패스에 액세스 할 수 있어야합니다. "내 랩퍼의 클라이언트가 원래 웹 서비스 클라이언트 항아리의 클래스를 알 필요가 없다"고 말할 때 원하는 내용이라고 생각합니다. – dsc

+0

m1exc 클래스에서 WSException 객체를 private로 만들 수 있습니다. 그러면 클라이언트는 그것에 대해 알 필요가 없습니다. – user93353