NotFoundException 、BadRequestException、
そして、それらのそれぞれに対して、 NotFoundExceptionMapper 、 BadRequestExceptionMapper、およびGenericExceptionMapperのような独自の ExceptionMapper を実装しました。
@Provider
public class GenericExceptionMapper implements ExceptionMapper<Throwable> {
@Override
@Produces( {MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON} )
public Response toResponse(Throwable ex) {
ErrorResponseWrapper errorResponse = new ErrorResponseWrapper(ex.getMessage(), 500, "");
return Response.status(Status.INTERNAL_SERVER_ERROR).entity(errorResponse).build();
}
}
まず、ここでの問題は、GenericExceptionMapperが期待どおりに機能せず、JAX-RS によってスローされた一般的な例外をキャッチしないことです。そのようなマッパーによってキャッチされる各例外は、 getResource() スローなどのメソッドから早期に明示的にスローされる必要があると考えているためです。いくつかの例外 {
さらに問題は、RestEasyでは例外マッパーをweb.xmに登録する必要があることです。下記参照:
<!-- Custom exception handling provider -->
<context-param>
<param-name>resteasy.providers</param-name>
<param-value>pl.salonea.jaxrs.exceptions.GenericExceptionMapper</param-value>
</context-param>
定義した各カスタム ExceptionMapper を登録できない (または登録方法がわからない) ため、別の問題があります。SINGLE カスタム ExceptionMapper しか登録できません。 それらをすべて登録するにはどうすればよいですか?つまり、NotFoundExceptionMapper、BadRequestExceptionMapper などです。
したがって、各例外は Generic Exception Mapper によってのみマップされます。これが最初の問題です。
これは RESTEasy の制限ですか? いくつかのチュートリアルのジャージーでは、そのような ExceptionMappers を登録する必要性を見ていませんが、複数の例外 Mapper が存在する可能性があるかどうかもわかりません。
私の頭に浮かんだ別の解決策(回避策)は、単一の GenericExceptionMapper を持ち、メソッドtoResponse(Throwable ex)で次のようなチェックを行うことです。
if(ex instanceof NotFoundException) { // send response type 1
if(ex instanceof BadRequestException) { // send response type 2
助けてくれてありがとう