Jersey が特別な処理を提供するインターセプトExceptionMapper<Exception>
しないキャッチオールを登録するにはどうすればよいですか?WebApplicationException
更新: この機能リクエストを提出しました: http://java.net/jira/browse/JERSEY-1607
Jersey が特別な処理を提供するインターセプトExceptionMapper<Exception>
しないキャッチオールを登録するにはどうすればよいですか?WebApplicationException
更新: この機能リクエストを提出しました: http://java.net/jira/browse/JERSEY-1607
私はExceptionMapperを登録することになりました:
import com.google.inject.Singleton;
import com.sun.jersey.api.container.MappableContainerException;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.Response;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider;
/**
* @author Gili Tzabari
*/
@Provider
@Singleton
public class RuntimeExceptionMapper implements ExceptionMapper<RuntimeException>
{
@Override
public Response toResponse(RuntimeException e)
{
if (e instanceof WebApplicationException)
{
// WORKAROUND: Attempt to mirror Jersey's built-in behavior.
// @see http://java.net/jira/browse/JERSEY-1607
WebApplicationException webApplicationException = (WebApplicationException) e;
return webApplicationException.getResponse();
}
// Jetty generates a log entry whenever an exception is thrown. If we don't register an
// ExceptionMapper, Jersey will log the exception a second time.
throw new MappableContainerException(e);
}
}
ReXSL ExceptionTrapクラスでそれがどのように行われるかを見てみましょう。ExceptionMapper
ジャージーによってキャッチされていないすべての例外をキャッチするために登録しません。代わりに、それらをサーブレット コンテナー (Tomcat など) にバブルアップさせると、コンテナーはそれらを適切なサーブレットに転送して、さらに処理します。
の主で唯一の目的ExceptionMapper
は、特定のビジネス固有の例外を HTTP 応答に変換することです。つまり、アプリケーションが例外的なイベント フローを制御できるようにします。一方、サーブレットの例外キャッチ メカニズムの目的は、アプリケーションのフェイルオーバーを制御し、ロギングなどの事後処理を行うことです。言い換えれば、ExceptionMapper
まだ制御している場合は機能しますが、例外をキャッチするサーブレットは、制御が失わ50x
れ、ユーザーに応答コードを表示する必要がある場合に役立ちます。
WebApplicationException
カプセル化されたステータス コードがResponse
500 より大きい場合、Jetty は (JUL を通じて) 毎回ログに記録します。ランタイム例外は Jetty によってログに記録されず、コンテナーにバブル アップします。