2017-12-01 17 views
1

IMHOの例外は例外的な場合です。シナリオが例外なく処理できる場合、例外はスローされません。Spring RESTのエラーシナリオの処理

例外を作成するには少なくとも1ms必要となり、パフォーマンスに影響します。だから、エラーシナリオを処理する最善の方法は何ですか?

シナリオ#1:

ResponseEntity createOrder(@RequestBody Order order){ 
if(order.items == null) 
    return ResponseEntity.badRequest().build(); 
... 
} 

シナリオ#2:Error Handling for REST with Spring

ResponseEntity createOrder(@RequestBody Order order){ 
    if(order.items == null) 
     throw new CustomException(); 
    ... 
    } 

@ControllerAdvice 
public class RestResponseEntityExceptionHandler extends ResponseEntityExceptionHandler { 

    @ExceptionHandler(value = { CustomException.class }) 
    protected ResponseEntity<Object> handleConflict(RuntimeException ex, WebRequest request) { 
     String bodyOfResponse = "Error"; 
     return handleExceptionInternal(ex, bodyOfResponse, 
      new HttpHeaders(), HttpStatus.BAD_REQUEST, request); 
    } 
} 
+1

スタックトレースなしで例外を試しましたか?そのようなケースではより効率的です。 – dev4Fun

+0

提案のおかげで@ xsx4u – jaks

答えて

1

個人的にはシナリオ#2を選択するのは集中化されているためです。その後、その特定の例外に対する応答コードを変更したり、詳細ログを追加することができます。パフォーマンスのシナリオでは、明らかに速いですが、私はその時間差を無視します

0

で述べたように@ControllerAdviceとResponseEntityExceptionHandlerを提供まあ、特定のケースでは、あなたが私を持っていますHibernateを使用して検証し、無効なデータをコントローラに開始させません。

public class Order { 
... 
    @NotNull 
    @NotEmpty 
    private List<Integer> items; 
} 

ケースアイテムが空またはnull(内部でも例外を使用していますが)の場合、400エラーが自動的に作成されます。

他の例外を処理するには、コントローラーごとにまたは@ControllerAdvice(グローバルにキャッチする)のいずれかを使用して、@ExceptionHandlerを使用します。例外を作成

は、少なくとも1msの

例外をとる遅い遅いが、そうではありません。

+0

入力はビジネスルールによって検証され、それに基づいてエラーステータスが返されます。私の質問は、例外をスローして処理するのではなく、通常のプログラムフローでこれらのエラーと検証のケースを自分で処理できるということです。 – jaks

+0

私はまだこの場合例外を好むでしょう。より良いデザインが可能になります。検証ロジックをValidatorクラスに抽出します。また、他の回答が指摘したように、応答形式は集中管理されています。 – helospark

関連する問題