38

私はこれに不慣れで、いくつかのドキュメントを読むことを達成しようとしていますが、機能していません。ご容赦ください。

私はこのような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

4

3 に答える 3

56

例外マッパーに注釈を付ける必要があります。注釈を付け@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();
    }
}
于 2013-03-03T12:25:37.763 に答える
3

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

次に例を示します。

:私はジャージーでJAX-RSを使用しています

最初に: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");
于 2017-07-13T18:08:22.267 に答える
-1

ちょっとした注意点として、404などを使用するのではなくResponse.Status.NOT_FOUNDを使用してみてください。コードは読みやすくなり、タイプミスが発生しにくくなります。同じことが「テキスト/プレーン」にも当てはまります。以下は、あなたが述べたように例外を処理するコードです。 ああ、もう1つ、インターフェイスでメソッド@Produces(MediaType.TEXT_PLAIN)に注釈を付けることを忘れないでください。

    パブリッククラスUserNotFoundExceptionはException{を拡張します
        //..。
    }

    パブリッククラスUserServiceImplはUserServiceを実装します{

        @オーバーライド
        public Response getUser(@QueryParam( "id")String id){
            最終応答応答;
            試す{
                //ユーザーメソッドを呼び出す
                //すべてが大丈夫なら
                response = Response.status(Response.Status.OK).entity(whateverYouWant).type(MediaType.TEXT_PLAIN).build();
            } catch(UserNotFoundException ex){         
                response = new UserNotFoundMapper()。toResponse(ex);
            }

            応答を返します。
        }
    }

    クライアントスライドで確認できます

    public static boolean isUserExists(final Response serverResp){
        return serverResp!= null && serverResp.getStatus()== Response.Status.NOT_FOUND.getStatusCode();
    }

于 2013-03-03T12:25:51.210 に答える