2011-01-31 2 views
1

현재 EJB3 기반 SOAP 웹 서비스를 개발 중이며, 검색되지 않은 예외를 처리하고 클라이언트에 형식화 된 SOAP 응답을 반환하는 모범 사례가 무엇인지 궁금합니다.ejb 3 기반 비누 웹 서비스에서 예외를 처리하는 방법

예 :

@WebMethod 
public SomeResponse processSomeService(
     @WebParam(name = "someParameters") SomeParameters someParameters) 
{ 
    // the EJB do something with the parameters 
    // and retrieve a response fot the client 
    SomeResponse theResponse = this.doSomething(someParameters); 

    return theResponse; 
} 

내가 좋아하는 일반적인 예외를 잡을 수 있습니까 :

@WebMethod 
public SomeResponse processSomeService(
     @WebParam(name = "someParameters") SomeParameters someParameters) 
{ 
    // the EJB do something with the parameters 
    // and retrieve a response to return to the client 
    try 
    { 
     SomeResponse theResponse = this.doSomething(someParameters); 
    } 
    catch (Exception ex) 
    { 
     // log the exception 
     logger.log(Level.SEVERE, "something is going wrong {0}", ex.getMessage()); 
     // get a generic error response not to let the 
     // technical reason going to the client 
     SomeResponse theResponse = SomeResponse.createError(); 
    } 

    return theResponse; 
} 

이것을 달성하기 위해 "모범 사례"어떤 종류가 있습니까? 당신이

답변

1

오류가 발생했을 때 SOAP 메시지를 반환하려면 해당 메시지를 만들어야합니다. 컨테이너가 당신이 필요로하는 것을 알기를 기대하지 않습니다.

귀하의 디자인이 적절하다고 말합니다. 내가 가진 비판 중 하나는 오류의 본질에 대해 구체적으로 설명 할 수 없다는 것입니다.

+0

아이디어는 일반적인 오류를 반환하는 것입니다 "서버 과부하"와 같은 메시지가 아니라 실제 오류가 클라이언트를 통과하게합니다. 귀하의 응답에 대한 감사합니다 –

+0

@ Alexandre : 오류 코드를 클라이언트에 반환하여 실제 오류의 의미를 숨길 수 있습니다. 이것은 나중에 문제를 해결하는 데 도움이 될 수 있습니다. – Qwerky

+0

마침내 일반 예외를 catch하고 예외 유형에 따라 오류 코드를 추가합니다. 제안 해줘서 고마워. –

0

을 잡을 필요가 없습니다,은 EJB 컨테이너가이 문제를 처리 할

는 감사드립니다. 는 EJB 3.1 사양에서

, 장 14.2.2 예외 처리 알렉상드르 GUIDET에 의해 주석 # 1에 대한

UPDATE가 -> 시스템 예외 :

  • 가 빈 메소드가 발생하는 경우 시스템 예외 또는 오류 인 경우 은 bean 메소드의 오류를 컨테이너로 간단히 전파해야합니다 (예 : bean 메소드는 예외를 잡으십시오). 콩 방법은 콩 방법은 복구되지 수있는 체크 예외 야기 동작을 수행하는 경우

  • , 빈 방법 원래 예외 랩 에 javax.ejb.EJBException를 발생한다.

  • 다른 예기치 않은 오류 조건은 은 에 javax.ejb.EJBException를 사용하여보고해야한다.

이렇게 RuntimeException을 컨테이너에 전파하는 것은 EJB 사양에서 권장하는 방법입니다.

+0

불행히도 일부 예외는 ejb 컨테이너에 의해 catch되지 않고 SOAP 응답을 통해 클라이언트에 반환됩니다. –

+0

@Alexandre : 예, 물론입니다. 이것이 컨테이너가 수행하는 것으로, 런타임 예외가 SOAPFault로 반환됩니다. –

+0

@Alexandre 공정하게하려면 투표 수를 0으로 재설정했습니다. 귀하의 질문은 특히 ejb 3.0 웹 서비스가 아니라 일반적으로 웹 서비스를 개발하는 모범 사례에 관한 것입니다 ... – CMR

2

응답에서 오류를 반환하는 것은 좋지 않지만 SOAP은 오류 반환을 처리하기위한 SOAP 오류를 정의합니다. Michael Konietzka가 지적한 것처럼 컨테이너는 throw 된 예외를 처리하고 SOAP 오류로 변환 할 수 있습니다.

당신의 경우에는 예외를 먼저 잡아 로그에 남기고 싶습니다. 원래 예외를 래핑하는 새로운 EJBException을 던집니다.

관련 문제