2015-12-16 11 views
6

私は、@RestControllerと注釈を付けられたコントローラを持たず、Springブート1.3.0を使用してthis questionと同じ問題が発生しました。ちょうど@Pathとです。その問題のOPが言うように、Springブートの/ errorへのリダイレクトを処理するには?

これは、私には、彼らはそれが/エラーにリダイレクトする必要がありますなぜ私も理解できない賢明な

何でもあります。そしては、私が何かを紛失している可能性が非常に高いです、私はクライアントに戻って404または200を与えることができるため。

私の問題は、彼のソリューションは1.3.0で動作しないようです。次の要求フローがあります。NullPointerExceptionをスローします。それは私のExceptionMapper秒の1

@Provider 
public class GeneralExceptionMapper implements ExceptionMapper<Throwable> { 

    private static final Logger LOGGER = LoggerFactory.getLogger(GeneralExceptionMapper.class); 

    @Override 
    public Response toResponse(Throwable exception) { 
     LOGGER.error(exception.getLocalizedMessage()); 
     return Response.status(Response.Status.INTERNAL_SERVER_ERROR).build(); 
    } 
} 

そして、私のコード500を返しますが、その代わりに、クライアントにそれを送信する、それは/エラーにリダイレクトしようとすることで処理されます。私が持っていない場合を除きだから、404は常にだ

$ curl -v http://localhost:8080/nullpointerexception 
* STATE: INIT => CONNECT handle 0x6000572d0; line 1090 (connection #-5000) 
* Added connection 0. The cache now contains 1 members 
* Trying ::1... 
* STATE: CONNECT => WAITCONNECT handle 0x6000572d0; line 1143 (connection #0) 
* Connected to localhost (::1) port 8080 (#0) 
* STATE: WAITCONNECT => SENDPROTOCONNECT handle 0x6000572d0; line 1240 (connection #0) 
* STATE: SENDPROTOCONNECT => DO handle 0x6000572d0; line 1258 (connection #0) 
> GET /nullpointerexception HTTP/1.1 
> Host: localhost:8080 
> User-Agent: curl/7.45.0 
> Accept: */* 
> 
* STATE: DO => DO_DONE handle 0x6000572d0; line 1337 (connection #0) 
* STATE: DO_DONE => WAITPERFORM handle 0x6000572d0; line 1464 (connection #0) 
* STATE: WAITPERFORM => PERFORM handle 0x6000572d0; line 1474 (connection #0) 
* HTTP 1.1 or later with persistent connection, pipelining supported 
< HTTP/1.1 404 Not Found 
* Server Apache-Coyote/1.1 is not blacklisted 
< Server: Apache-Coyote/1.1 
< Content-Length: 0 
< Date: Wed, 16 Dec 2015 17:33:37 GMT 
< 
* STATE: PERFORM => DONE handle 0x6000572d0; line 1632 (connection #0) 
* Curl_done 
* Connection #0 to host localhost left intact 

:私はそのための別のリソースを持っていない場合、それは404

2015-12-16 18:33:21.268 INFO 9708 --- [nio-8080-exec-1] o.glassfish.jersey.filter.LoggingFilter : 1 * Server has received a request on thread http-nio-8080-exec-1 
1 > GET http://localhost:8080/nullpointerexception 
1 > accept: */* 
1 > host: localhost:8080 
1 > user-agent: curl/7.45.0 

2015-12-16 18:33:29.492 INFO 9708 --- [nio-8080-exec-1] o.glassfish.jersey.filter.LoggingFilter : 1 * Server responded with a response on thread http-nio-8080-exec-1 
1 < 500 

2015-12-16 18:33:29.540 INFO 9708 --- [nio-8080-exec-1] o.glassfish.jersey.filter.LoggingFilter : 2 * Server has received a request on thread http-nio-8080-exec-1 
2 > GET http://localhost:8080/error 
2 > accept: */* 
2 > host: localhost:8080 
2 > user-agent: curl/7.45.0 

2015-12-16 18:33:37.249 INFO 9708 --- [nio-8080-exec-1] o.glassfish.jersey.filter.LoggingFilter : 2 * Server responded with a response on thread http-nio-8080-exec-1 
2 < 404 

そして、クライアント側(カール)を送り返しますそのような/エラーリソースは、何ですか?私は何を返すと思いますか?その時点で私が持っているのは、/ errorに対するGET要求です。そして、私は余分な要求がリソースを消費し、私のログを汚染することを望んでいません。

私は何をしないのですか?もし何もなければ、私の例外処理はどうすればいいですか?

答えて

2

ServerProperties.RESPONSE_SET_STATUS_OVER_SEND_ERRORtrueに設定できます。

応答ステータスは、コンテナ固有の応答の実装にsendErrorまたはsetStatusの間で選択することが可能である4xx5xxある時はいつでも。例えば。サーブレットコンテナJerseyではHttpServletResponse.setStatus(...)またはHttpServletResponse.sendError(...)と呼ぶことができます。

sendError(...)メソッドを呼び出すと、通常、エンティティ、応答ヘッダーがリセットされ、指定されたステータスコード(例:サーブレットerror-pageコンフィグレーション)にエラーページが表示されます。ただし、レスポンスを後処理する場合(サーブレットフィルタなど)は、コンテナのResponseオブジェクトに対してsetStatus(...)を呼び出すしかありません。

プロパティ値がtrueの場合、Response.sendError(...)にはResponse.setStatus(...)メソッドが使用されます。

プロパティ値のタイプはbooleanです。デフォルト値はfalseです。

ResourceConfigサブクラスコンストラクタでproperty(key, value)を呼び出すだけで、Jerseyプロパティを設定できます。

+0

魅力的な作品 – mark951131b