7

@POST、@PUT で注釈が付けられた Web サービス リソース メソッドに到達する前に、Jersey でマーシャリングされていないエンティティ (およびその注釈) をインターセプトするエレガントな方法 (フィルター、フック) はありますか。

エンティティ自体とそれに含まれるアノテーションが本当に必要であり、バリデータ アノテーションのプロパティを使用してそのエンティティの検証を実行します (JSR 303 のように見えますが、Bean 全体にメタデータでアノテーションを付けることはしません)。リソースの実装の観点から、私の目標は、リソース メソッドでこれを入力できるようにすることです。

@Path("/people")
@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
public class PeopleService {
        @POST
        public Response createPerson(@CustomValidator("personValidator") Person person) throws URISyntaxException {
            String uri = someService.createPerson(person);
            return Response.created(new URI(uri)).entity(uri).build();
        }
    }

カスタム MessageBodyReader を作成する道を歩み始めましたが、ObjectMapper に委譲して JSON を逆シリアル化しただけなので、JSON を完全に機能させることができました。それ以外は、パラメーターの注釈が渡され、物事は完全に機能します。しかし、XML をデシリアライズする必要が生じたとき、状況は崩壊しました。ジャージーが使用していたであろう元のデシリアライザーを取得して、それに委譲する方法がわかりません。また、ジャージーの一部を不必要に書き直しているように感じます。ジャージーに MessageBodyReader の後、実装が Web リソース サービスを呼び出す前にレイヤーがある場合、MessageBodyReader をハッキーな統合ポイントとして使用するのをやめたいと思います。カスタム動作をフローに追加できます。

最終的に、ジャージーには、マーシャリングされていないエンティティとそのパラメーターの注釈を渡して、カスタム処理を実行できる拡張ポイントがありますか? または、自分でエンティティをアンマーシャリングする方法を理解する必要がありますか (JAXBContext を使用するかどうか)。おそらくAOPに頼りますか?バリデーターをリソース クラスに挿入して、そのアノテーションのアイデアをあきらめますか?

ジャージのバージョン: 1.5

4

2 に答える 2

0

EJB インターセプターをご覧ください: http://www.adam-bien.com/roller/abien/entry/interceptors_ejb_3_for_absolute

于 2013-05-28T11:11:20.430 に答える