2017-09-06 15 views
0

モバイルアプリケーション用のサーバー側RESTアプリケーションを作成しています。私はセットアップに代わり、いくつかのHTTPエラーページを表示するので、クライアントは、これと同じJSONオブジェクトを受け取り、説明hereを、次の例外ハンドラをしようとしている:Spring RESTコントローラでベストプラクティスエラーメッセージを実装する

{ 
    "status": 404, 
    "code": 40483, 
    "message": "Oops! It looks like that file does not exist.", 
    "developerMessage": "File resource for path /uploads/foobar.txt does not exist. Please wait 10 minutes until the upload batch completes before checking again.", 
    "moreInfo": "http://www.mycompany.com/errors/40483" 
} 

私は詳述したもので、私の例外をモデル化していますガイドでは、彼らはうまくいっているようです(カスタムエラーはコンソールに表示されています)。しかし、私はthisポイントで立ち往生しています。なぜなら、私はどこでBeanの設定をするのか分からないからです。

私が例外ハンドラやリゾルバなどを持っているとすれば、私はそれを別の方法で試してみると思っていました。この時点で、無効なHTTPリクエストを入力しても、私はまだSpringのWhitelabelエラーページを取得しますが、今回は例外からのカスタムエラーメッセージが表示されます。だから、自分でErrorHandlerを実装しようとした場合、hereのように、前の記事で説明した方法ではなく、Gsonや何かを使ってJSONオブジェクトを構築できるかもしれません。

私は最低限ErrorHandler作業を取得しようとしました:

package com.myapp.controllers; 

import org.springframework.boot.autoconfigure.web.ErrorController; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RestController; 

import javax.servlet.http.HttpServletRequest; 

@RestController 
public class ErrorMessageController implements ErrorController { 

    private static final String ERROR_PATH = "/error"; 

    @Override 
    public String getErrorPath(){ 
     return ERROR_PATH; 
    } 

    @RequestMapping(value = ERROR_PATH) 
    public String renderErrorPage(HttpServletRequest request){ 

     String errorPage = (String) request.getAttribute("javax.servlet.error.status_code"); 

     return errorPage; 
    } 

} 

だから私は、Webページ上に表示さ孤独404ような何かを得るために期待。

Tomcat Error Page

これはなぜです:しかし、その代わりに、私は、Tomcatのエラーページを取得していますか?私はどんな助けにも感謝しています。

答えて

2

これは、request.getAttribute("javax.servlet.error.status_code")Integerで、Stringとしているためです。これにより、エラー処理中にエラーが発生し、デフォルトのTomcatエラーハンドラがポップアップします。あなたはintとしてそれをキャストした場合

、それは動作します:

@RequestMapping(value = ERROR_PATH) 
public int renderErrorPage(HttpServletRequest request){ 

    int errorPage = (int) request.getAttribute("javax.servlet.error.status_code"); 

    return errorPage; 
} 

を別の方法として、あなただけの特定のJSON構造を返すようにしたい場合は、あなたがErrorControllerを実装する代わりに@ExceptionHandlerメソッドを使用することができます。

たとえば、あなたが次のコントローラを持っているとしましょう:

@GetMapping 
public String getFoo() throws FileNotFoundException { 
    throw new FileNotFoundException("File resource for path /uploads/foobar.txt does not exist"); 
} 

あなたが特定の方法ですべてのFileNotFoundExceptionsを処理したい場合は、@ExceptionHandlerアノテーションでメソッドを書くことができる:

@ExceptionHandler(FileNotFoundException.class) 
@ResponseStatus(HttpStatus.NOT_FOUND) 
public ErrorResponse notFound(FileNotFoundException ex) { 
    return new ErrorResponse(HttpStatus.NOT_FOUND.value(), 40483, "Oops! It looks like that file does not exist.", ex.getMessage(), "http://www.mycompany.com/errors/40483"); 
} 

この場合、は、必要なフィールドを含むPOJOです。すべてのコントローラでこれを再利用したい場合は、@ControllerAdviceに入力してください。

+0

だから、どこで '@ ExceptionHandler'メソッドを置くのですか?新しいRestControllerで? –

+1

あなたはそれを選ぶことができます。 1つのコントローラにしか適用されない場合、そのコントローラを同じコントローラクラスに入れることができます。すべてのコントローラに適用される場合は、新しい単純なクラスを作成し、 '@ ControllerAdvice'だけで注釈を付けます。 – g00glen00b

関連する問題