JAX-RS(Jersey)で、例外をXML形式で戻す方法
JerseyでのRestのサービスで、
例外が発生した場合、例外をスローするとレスポンスとして、
例外が呼び出しもとに通知されます。
通知の形式は、そのまま通常のExceptionだと、スタックトレースになります。
Jerseyの場合、下記の様にWebApplicationExceptionクラスをスローするとHTTPステータスコードの400や500を呼び出し元へ戻します。
throw new WebApplicationException(400);
又は、独自例外クラスでやる場合は、WebApplicationExceptionクラスを継承して、下記のような方法でも可能です。
import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; public class ApplicationFaultException extends WebApplicationException { public ApplicationFaultException(String message) { super(Response.status(Responses.NOT_FOUND).entity(message).type("text/plain").build()); } }
最後に、XML形式で、戻したい場合は、JAXBのクラスとWebApplicationExceptionクラスを使います。
JAXBのクラスオブジェクトを生成して、javax.ws.rs.core.Responseクラスを利用して、WebApplicationExceptionがスローされた時に、
XML形式で戻すように設定しておくと、例外時のレスポンスがXML形式になります。
実装方法は、下記の記述になります。
ApplicationFault fault = new ApplicationFault(); fault.setFaultMessage("例外が発生しました。"); throw new WebApplicationException(Response.status(400).entity(fault).type(MediaType.TEXT_XML).build());
余り、きれいじゃない?ので、WebApplicationExceptionを継承した例外クラスを作成し内部でやった方がいいかもしれません。
下記の様にWebApplicationExceptionクラスを継承したクラスを作成し、XML形式への設定部分を例外クラス側に記述しておきます。
import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; public class ApplicationFaultException extends WebApplicationException { public ApplicationFaultException(String faultMessage) { ApplicationFault fault = new ApplicationFault(); fault.setFaultMessage(faultMessage); super(Response.status(400).entity(fault).type(MediaType.TEXT_XML).build()); } }
あとは、ロジックとかで、
throw new ApplicationFaultException("例外が発生しました。");
とするだけで済みます。