2012-01-24 9 views
0

restletサーバーとクライアントがあります。クライアントがエラーステータスコードに応じて適切な処理を実行できるように、エラーステータスと例外トレースをクライアントに渡す必要があります。私はStatusServiceについて読んでresponse.setStatus()メソッドを使用していますが、クライアント側で表示されるサーバー側処理中にスローされる特定の例外を取得できません。サーバーからのDAOレイヤーは、特定のDB関連の例外やクライアントが参照して適切な処置をとる必要がある(一意キー違反など)のステータスコードをスローします。Restlet - サーバーからクライアントにエラーステータスコードと例外トレースを渡す

また、サーバとクライアント側の集中処理エラー処理/処理の一般的な方法は何ですか?フィルター?

簡単な例が本当に役立ちます。あなたが唯一のオプションで、独自の記述メッセージをHTTPステータスコードを送信することができ ディープ

答えて

1

おかげで、。また、StatusService内のgetRepresentationをオーバーライドすることによって、エラーの表現を送信することもできます。

@Override 
public Status getStatus(Throwable throwable, Resource resource) { 
    Status ret = null; 
    Throwable cause = throwable.getCause(); 
    if (cause == null) { 
     Status status = super.getStatus(throwable, resource); 
     ret = new Status(status, throwable.getMessage()); 
     log.log(Level.SEVERE, "Unexpected resource exception <" + ret.toString() + "> for throwable of type <" + throwable + "> at resource <" + resource + ">"); 
    } else if (cause instanceof NotFoundException) { 
     ret = new Status(Status.CLIENT_ERROR_NOT_FOUND, cause, resource.getReference().toString()); 
     log.info("Not found <" + ret.toString() + "> for throwable of type <" + cause + "> at resource <" + resource + ">"); 
    } else if (cause instanceof ConstraintViolationsException) { 
     ConstraintViolationsException e = (ConstraintViolationsException) cause; 
     ret = new Status(Status.CLIENT_ERROR_BAD_REQUEST, cause, e.getViolations().iterator().next().getMessage()); 
     log.log(Level.SEVERE, "Constraint violation <" + e.getViolations().iterator().next().getMessage() + "> at resource <" + resource + ">"); 
    } else if (cause instanceof BusinessRuleException) { 
     ret = new Status(Status.CLIENT_ERROR_BAD_REQUEST, cause, cause.getMessage()); 
     log.log(Level.SEVERE, "Business rule exception: <" + cause.getMessage() + "> at resource <" + resource + ">"); 
    } else { 
     Status status = super.getStatus(throwable, resource); 
     ret = new Status(status, throwable.getMessage()); 
     log.log(Level.SEVERE, "Unexpected server exception <" + ret.toString() + "> for throwable of type <" + throwable + "> at resource <" + resource + ">"); 
    } 
    return ret; 
} 

@Override 
public Representation getRepresentation(Status status, Request request, Response response) { 
    String ret = ""; 
    if (status.getDescription() != null) { 
     ret = status.getDescription(); 
    } else { 
     ret = "unknown error"; 
    } 
    return new StringRepresentation(ret, MediaType.TEXT_PLAIN); 
} 

getRepresentationでエラーの表現を任意の形式(XML、JSON、HTML)で返すことができます。

+0

[OK]をクリックします。ただし、自分の説明メッセージを送信するにはどうすればよいですか? StatusServiceをオーバーライドする必要があるすべての場所が表示されます。これは、私が運があれば乗り越えようとしたものです。カスタムステータスサービスのgetStatusメソッドを実行してステータスを設定して返しました。私はさまざまなことを試しましたが、クライアント側のステータスは常にサーバー内部エラーとして表示され、エラーメッセージや説明は表示されません。 –

+0

私は自分自身を修正する必要がありました。 getRepresentationをオーバーライドすることで、StatusServiceを使用してエラーの表現を送信することもできます。上記の私の例を見てください。 – koma

+0

このコンストラクタ。パブリックステータス(ステータスステータス、文字列の説明)では、説明を渡すことができます。 – koma

関連する問題