web-dev-qa-db-ja.com

JAX-RSジャージExceptionMappersユーザー定義の例外

私はこれに新しいです、いくつかのドキュメントを読むことを達成しようとしていますが、それは機能しません、私と一緒に耐えてください。

次のようにUserNotFoundMapperを使用してExceptionMappersを作成しました。

public class UserNotFoundMapper implements ExceptionMapper<UserNotFoundException> {

@Override
public Response toResponse(UserNotFoundException ex) {
    return Response.status(404).entity(ex.getMessage()).type("text/plain").build();
}

}

私のサービスでこれ:

@GET
@Path("/user")
public Response getUser(@QueryParam("id") String id) throws UserNotFoundException{
    //Some user validation code with DB hit, if not found then
    throw new UserNotFoundException();
}

UserNotFoundExceptionUser-Defined例外。

私はこれを試しました:

public class UserNotFoundException extends Exception {
       //SOME block of code 
}

しかし、サービスを呼び出すと、UserDefinedExceptionMapperは呼び出されません。 UserDefinedExceptionに何かが欠けているようです。この例外をどのように定義するのですか?

UserNotFoundExceptionの定義方法を教えてください。

37
WhoAmI

例外マッパーに @Provider の注釈を付ける必要があります。そうしないと、JAX-RSランタイムに登録されません。

@Provider
public class UserNotFoundMapper implements
        ExceptionMapper<UserNotFoundException> {
    @Override
    public Response toResponse(UserNotFoundException ex) {
        return Response.status(404).entity(ex.getMessage()).type("text/plain")
                .build();
    }
}
56
Perception

APIを作成するときに通常行うことは、 RuntimeException から拡張される独自の例外を作成することです。したがって、必ずしも例外をキャッチする必要はありません。

以下に例を示します。

[〜#〜] note [〜#〜]:ジャージーでJAX-RSを使用しています

First:RuntimeExceptionから拡張する独自の例外を作成します。

public class ExceptionName extends RuntimeException {

private int code;
private String message;

public int getCode(){
    return code;
}

public String getMessage(){
    return message;
}

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

}

ExceptionMapper も実装します

@Provider
public class ExceptionName implements ExceptionMapper<ExceptionName>{

    @Override
    public Response toResponse(ExceptionName exception) {
        return Response.status(exception.getCode()).entity(exception.getMessage()).build();
    }

}

そして、例外をスローしたいときはいつでも、どこでもこのようにします。例外マッパーは、APIを使用しているクライアントに応答を返します。

throw new ExceptionName(500,"there was an error with something here");
1
Nicolas Frugoni