4

私はSpringMVCRESTプロジェクトを遊んで変換し、Jerseyを使用するようにしています。また、クラスの1つにメソッドがあります。

@ExceptionHandler(HttpMessageNotReadableException.class)

これは、XMLメッセージの逆シリアル化中に例外をキャッチします。このようにして、ユーザーがPOSTリクエストで不正なXMLを送信したことを検出し、400/500の標準HTMLエラーページではなく、XMLエラー応答を返すことができます。

ジャージーに似たようなものはありますか?例外マッピングクラスを作成してみました

@Provider
public class HttpMessageNotReadableException 
      implements ExceptionMapper<org.xml.sax.SAXNotRecognizedException> {

しかし、リソースクラス内から例外をスローしたときだけ、着信エラーはキャッチされないようです。

そこで、メソッドで文字列を取得し、逆シリアル化を実行してエラーをキャッチすることを考えました。

@POST
@Path("/product")
public Response createProduct(String createRequest) {
      try {
         // de-serialize
         // do work ...
      } catch ...

それ以外の

@POST
@Path("/product")
public Response createProduct(CreateProduct createRequest) {
    // do work ...

しかし、それは正しくないようです。同じエラーチェックですべてのクラスを汚染するだけです。

また、を使用して自分のリーダーを実装することについて読みました

@Provider
class MyXmlReader implements MessageBodyReader {

しかし、JAXBはすでに逆シリアル化を行っているので、それは車輪の再発明のように思えます。エラーをキャッチしたいだけです。

悪い着信XMLをキャッチするためのより良い方法があるかどうか誰かが知っていますか?

4

1 に答える 1

3

@ProviderJerseyは、 Spring(JAX-RSで定義されている)とまったく同じアプローチを使用します。Springがどのようにオブジェクトをアン/マーシャルするかはわかりませんが、JerseyはデフォルトでXMLとJSONにJAXBを使用します(JSONにJacksonを使用するように指示すれば使用できます)。

JAXB例外をキャッチしようとしましたか?

import javax.ws.rs.core.Response;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider;
import javax.xml.bind.JAXBException;

@Provider
public class JAXBExceptionMapper implements ExceptionMapper<JAXBException> {
    public Response toResponse(JAXBException exception) {
        return Response.status(Status.BAD_REQUEST).build();
    }
} 
于 2012-10-09T16:39:25.790 に答える