1

プロジェクトで以下のカスタム例外クラスを使用しています

public class BadRequestException extends WebApplicationException {
    private static final long serialVersionUID = 1L;
    private String message;
    public BadRequestException(String message) {
        super();
        this.message = message;
    }
    public String getMessage() {
        return message;
    }
    public void setMessage(String message) {
        this.message = message;
    }
}

Mapper クラスも作成しました。

public class BadRequestExceptionMapper implements ExceptionMapper<BadRequestException> {
    public Response toResponse(BadRequestException brexec) {
        return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(brexec.getResponse().getEntity()).type(MediaType.APPLICATION_JSON).build();
    }
}

サーブレットを介してサービスを呼び出していますが、そのメソッドの 1 つによって例外がスローされますが、サーブレット クラスでキャッチできません。以下のコードを使用して例外をキャッチしました。

    try{
    //Some Business logic then
    service.path("restful").path("jwbservice/" + methodName + "/" + id).header("lid", lid).delete(String.class);
    }
    catch (BadRequestException ex) {
    out.println(ex);
    } 
   catch(Exception exe){
    out.println(exe);
    }

そして、例外をスローするサービスクラスでこのコードを使用したサービスメソッド。

@DELETE
    @Path("/deleteLink/{id}")
    @Produces(MediaType.APPLICATION_JSON)
    public String deleteLink(@PathParam("id") int id, @HeaderParam("lid") String lid) throws BadRequestException {
    if (id<= 0) {
        throw new BadRequestException("Required Parameter: id");
        }
//Some Business Logic
}

私のサービスはBadRequestExceptionをスローしますが、サーブレットではBadRequestException Catchブロックではなく例外キャッチになります。誰でも私が間違っていることを知ることができますか?

4

1 に答える 1

0

サーブレットでその例外が発生することはありません。これは、サーブレットが実質的に REST クライアントであり、データを取得するためにリモート リソース メソッドを呼び出しているためです。リソース呼び出しは成功するか (一部のデータがマップされます)、失敗してデータが取得されない (またはクライアント側のエラー) かのいずれかです。

ちなみに、サーバー側の例外マッパーに問題があります。呼び出す前に、例外に実際に応答エンティティがあることを確認しません。

brexec.getResponse().getEntity()

例外に応答がない場合、上記のコードはヌル ポインター例外を引き起こします。


簡単なメモ:

  • 例外クラスには既にmessageプロパティがあります。追加のものを定義する必要はありません
  • 例外マッパーは、response何かをしようとする前に、存在しないプロパティをチェックする必要があります
  • サーブレットのリソース パスがサーバー側のパスと一致していないようです。コピペミスだと思います。
于 2013-03-25T13:44:10.490 に答える