jersey 2.0 を使用して REST サービスを作成しています。私は WebApplicationException を拡張しています
特定の例外を発生させるメソッド
if(json.equals("") || json.equals(" ")) {
throw new ArgumentException("bad post data");
}
public class ArgumentException extends RestException {
.....
public ArgumentException(String message) {
super(Status.BAD_REQUEST,message);
}
}
public class RestException extends WebApplicationException {
...........
public RestException(Status status, String message) {
super(Response.status(status)
.entity(message)
.type("text/plain")
.build());
/*
super(Response.status(status)
.entity(new ErrorBean(status.getStatusCode(),message))
.type(MediaType.APPLICATION_JSON)
.build()); */
}
ErrorBean is a POJO
RestException 内のプレーン文字列としてエラーを返すメソッドが機能します (正しい http コード 400 とメッセージ)。ただし、ErrorBean POJO を渡して応答で MediaType.APPLICATION_JSON を使用しようとすると、「ヘッダーは既に送信されています」というエラーが表示され、http エラーコード 500 (配管に関する内部問題) と空の応答が表示されます。
私はこの質問も見ましたジャージーの例外に対してJSONまたはXMLを返す
JSON のようなコードとメッセージで例外を返すにはどうすればよいですか
{「コード」: 400、「メッセージ」: .... }
アップデート
SO とジャージー ユーザーのメーリング リストで回答を受け取りました。ステップは
- 非 AJXB POJO にはアノテーションは必要ありません
- アプリケーションに JacksonFeature を登録する
ResourceConfig rc = new ResourceConfig().packages("test").register(JacksonFeature.class);