2011-11-03 61 views
1

我開發了一個使用Apache CXF的web服務,該服務將很快投入生產。 我很關心這個異常處理,我不知道我跟的是否正確。Apache CXF Web服務中的異常處理

我已經展示的方法如下,我暴露我的web服務

import javax.jws.WebService; 

@WebService 
public interface TataWebService { 
    public String distragery()throws Exception; 

} 
public String distrager throws Exception { 
    int a = 30; 
    strategyData = "currentlyhadcoced" ; 

    if(a==30) { 
     throw new IncorrectProjectIdsException("The Value of a is 30"); 
    } 

    return strategyData; 
} 

而且我定義了用戶定義的異常的方法是這樣

@WebFault(name = "IncorrectProjectIdsDetails")  
public class IncorrectProjectIdsException extends Exception { 

    private java.lang.String incorrectProjectIdsDetails; 

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

    public java.lang.String getFaultInfo() { 
     return this.incorrectProjectIdsDetails; 
    } 
} 

請告訴我,如果這是正確的,關於方法簽名中的拋出聲明或shuld,我們以任何其他方式處理?

非常感謝您

回答

6

你應該拋出的Exception特定的子類中的接口,這樣JAX-WS引擎知道發佈關於該故障是可能的信息與@WebService註解。這是因爲這是通過檢查聲明靜態發現的信息,而不是動態發現實際拋出的異常。

如果您遇到可能拋出任何東西的低級API(事實上它確實發生了很多),那麼您應該封裝該低級異常。下面是這樣做的一個簡單的方法:

@WebFault(name = "ImplementationFault")  
public class ImplementationException extends Exception { 
    public ImplementationException(Exception cause) { 
     super(cause.getMessage(), cause); 
    } 
} 

您希望這個使用Web方法中:

public String fooMethod(String example) throws ImplementationException { 
    try { 
     return doRealThingWith(example); 
    } catch (Exception e) { 
     throw new ImplementationException(e); 
    } 
} 

(有這樣做的異常映射的其他方式,但他們相當包裝至少很容易)

+0

非常感謝,但是如果某個方法拋出異常(如IOException或某些已檢查的異常),怎麼辦? (所以一個方法應該拋出一個業務以及所有這些檢查的異常)? – Revathi

+0

上述技術適用於此;這就是我包括它的原因。 (你不能做的就是直接把一個'IOException'變成一個錯誤,沒有太多的詭計,我想,我只是使用上面的技巧,有時在很多層次上。) –

+0

非常感謝。 – Revathi