2016-03-31 4 views
0

私はスプリングブートマイクロサービスベースのアプリケーションを構築しています。すべてのビジネスロジックを含むサービスからWebアプリケーションに戻すエラーメッセージが表示されません。私のサービスでは、次のような例外をスローします。マイクロサービスからWebappにHttpエラーメッセージが伝播しない

@ResponseStatus(HttpStatus.BAD_REQUEST) 
public class Http400ServiceException extends Exception { 

    public Http400ServiceException() { 
     super("Some error message"); 
    } 
} 

すべてが期待通りに動作し、応答コードが期待どおりに送信されます。だから私のサービスが403の例外を送信した場合、私はWebアプリケーションで403を取得します。私が今しようとしているのは、私のサービスの例外からエラーメッセージを受け取ることです。

問題、私は403を生成するような方法で、残りのクライアントからの私のサービスを突く

は、(JSONで)応答は次のようになります。しかし

{ 
    "timestamp": 1459453512220 
    "status": 403 
    "error": "Forbidden" 
    "exception": "com.mysite.mypackage.exceptions.Http403ServiceException" 
    "message": "Username Rob must be between 5 and 16 characters long" 
    "path": "/createLogin" 
} 

、何らかの理由で、私は私のwebappから 'メッセージ'フィールドにアクセスすることができません。 httpError.getResponseBodyAsString()がnullを返すされ、

@Override 
public RuntimeException handleException(Exception e) { 
    ... 
    if (e instanceof HttpClientErrorException) { 
     HttpClientErrorException httpError = (HttpClientErrorException) e; 
     LOGGER.info(httpError.getResponseBodyAsString()); 
    } 
    ... 
} 

しかし、私は私のログで見たときに/デバッグ中に私のアプリを実行します。私はこのようになりますWebアプリケーションのコードを処理し、いくつかの一般的なエラーを持っています。それは正しいレスポンスコードを持っています。レスポンスボディはありません。

誰かが何がうまくいかないのかについての洞察があれば、本当に感謝しています。

+0

あなたは '@ ResponseStatus'を持っていますので、ステータスだけが返ってくると思います。また、 '@ ResponseBody'を追加する必要があります。さらにいくつかの設定が可能です。 –

+0

これは私が今見ているものです。これまで運がなかったのに – Rob

+0

[このパッケージ](https://github.com/RawSanj/blogAggr/tree/master/src/main/java/com/rawsanj/blogaggr/web/rest/errors)が役立つかもしれませんが。 '@ControllerAdvice'を使います。 –

答えて

0

私たちはアプリの他の領域で作業していたのですが、この問題を数ヶ月間駐車しました。しかし、同様の問題を解決しようと、私は取ってしまったのアプローチは、以下の

  • を示すために、すべてのサービスからのすべての応答が実装するためのインタフェース、および例外タイプを作成している間に他の誰かがこれを見ているだけの場合には例外は、ユーザー・エラーが原因であること:各サービスのコントローラーで

    public interface IModel { 
        boolean isError(); 
        UserException getError(); 
    } 
    
  • 、任意の例外をキャッチし、それらのうちのIModelをのいくつかの並べ替えを作成します。

    @ResponseStatus(HttpStatus.OK) 
    @ExceptionHandler(UserException.class) 
    public IModel handleException(UserException exception) { 
        return exception.toModel(); 
    } 
    
  • 、Webアプリケーションでは

    public <T extends IModel> T makeCall(Object payload, Endpoint<T> endpoint) throws UserException { 
        ... 
        ResponseEntity<T> response = restTemplate.postForEntity(endpoint.getEndpointUrl(), payload, endpoint.getReturnType()); 
        if (response.getBody().isError()) { 
         throw response.getBody().getError(); 
        } 
        ... 
        return response.getBody(); 
    } 
    
  • 適切な@ExceptionHandlerで例外を処理:応答がそれにUserExceptionを持っている場合、それをスローし、サービスを呼び出すために使用されるコンポーネントで

  • は、そうでない場合はレスポンスボディを返します例えば

    @ExceptionHandler(UserException.class) 
    public ModelAndView handleUserException(UserException e) { 
        ModelAndView modelAndView = new ModelAndView("viewName"); 
        modelAndView.addObject("errorMessage", e.getMessage()); 
        return modelAndView; 
    } 
    

クリーナーアプローチがありますように私はちょっと感じるが、これは私がこれまでに出てくることができました最高です。私はそれを行うより良い方法を見つけるなら、私はこれを更新します。

関連する問題