RESTサービスがJerseyを使用して構築されています。
サーバーに送信されたMIMEに応じて、カスタム例外ライターのMIMEを設定できるようにしたい。 application/json
は、jsonを受信すると返され、application/xml
xmlを受信したとき。
今私はハードコードapplication/json
、しかしそれはXMLクライアントを暗闇の中に置き去りにしています。
public class MyCustomException extends WebApplicationException {
public MyCustomException(Status status, String message, String reason, int errorCode) {
super(Response.status(status).
entity(new ErrorResponseConverter(message, reason, errorCode)).
type("application/json").build());
}
}
現在のリクエストを取得するためにどのようなコンテキストを利用できますかContent-Type
?
ありがとう!
完全なソリューションに興味のある人のために:
public class MyCustomException extends RuntimeException {
private String reason;
private Status status;
private int errorCode;
public MyCustomException(String message, String reason, Status status, int errorCode) {
super(message);
this.reason = reason;
this.status = status;
this.errorCode = errorCode;
}
//Getters and setters
}
ExceptionMapper
とともに
@Provider
public class MyCustomExceptionMapper implements ExceptionMapper<MyCustomException> {
@Context
private HttpHeaders headers;
public Response toResponse(MyCustomException e) {
return Response.status(e.getStatus()).
entity(new ErrorResponseConverter(e.getMessage(), e.getReason(), e.getErrorCode())).
type(headers.getMediaType()).
build();
}
}
ErrorResponseConverterはカスタムJAXB POJOです。
@ javax.ws.rs.core.Context javax.ws.rs.core.HttpHeadersフィールド/プロパティをルートリソースクラス、リソースメソッドパラメータ、またはカスタムjavax.ws.rs.ext.ExceptionMapperに追加してみてください。 HttpHeaders.getMediaType()を呼び出します。
headers.getMediaType()は、Acceptヘッダーではなく、エンティティのメディアタイプで応答します。例外を変換する適切な方法は、Acceptヘッダーを使用することです。これにより、クライアントは要求した形式で応答を受け取ります。上記のソリューションの場合、リクエストが次のようになった場合(JSONはヘッダーを受け入れますが、XMLエンティティに注意)、XMLが返されます。
POST http:// localhost:8080/service/giftcard/invoice?draft = true HTTP/1.1 受け入れ:application/json 承認:基本dXNlcjp1c2Vy Content-Type:application/xml User-Agent:Jakarta Commons-HttpClient/3.1 Host:localhost:8080 Proxy-Connection:Keep-Alive Content -長さ:502 <?xml version = "1.0" encoding = "UTF-8" standalone = "yes"?> <sample> <node1> </ node1> </ sample>
Acceptヘッダーを使用する場合も、正しい実装は次のとおりです。
public Response toResponse(final CustomException e) {
LOGGER.debug("Mapping CustomException with status + \"" + e.getStatus() + "\" and message: \"" + e.getMessage()
+ "\"");
ResponseBuilder rb = Response.status(e.getStatus()).entity(
new ErrorResponseConverter(e.getMessage(), e.getReason(), e.getErrorCode()));
List<MediaType> accepts = headers.getAcceptableMediaTypes();
if (accepts!=null && accepts.size() > 0) {
//just pick the first one
MediaType m = accepts.get(0);
LOGGER.debug("Setting response type to " + m);
rb = rb.type(m);
}
else {
//if not specified, use the entity type
rb = rb.type(headers.getMediaType()); // set the response type to the entity type.
}
return rb.build();
}