CXFとオプションのエンティティパラメータ

私はJAX-RS実装としてApache CXFを使用しています。オプションの「エンティティパラメータ」に問題があります。このコードを見てみましょう:

@Path("/")
public class myClass {

    @PUT
    @Path("/{p1}/something/{p2}/something/{p3}/something/{p4}")
    @Consumes(MediaType.APPLICATION_XML)
    Response updateStuff(
                    @PathParam("p1") String p1,
                    @PathParam("p2") Long p2,
                    @PathParam("p3") String p3,
                    @PathParam("p4") Long p4,
                    MyEntity entity); 
}

entityがnullでない場合は、すべて正常に動作します。

しかし、空のボディでリクエストを処理したい。そのような場合、エンティティはnullになると私は期待しています。しかし、それは真実ではありません。 bodyがnullの場合、CXFは私のメソッドを見つけることができないようです。ログでは、(AbstractJAXBProviderの)空のメッセージ本文に関する警告を見つけることができます。

私はまた、updateStuffメソッドをオーバーロードしようとしました:

@Path("/")
public class myClass {

    @PUT
    @Path("/{p1}/something/{p2}/something/{p3}/something/{p4}")
    @Consumes(MediaType.APPLICATION_XML)
    Response updateStuff(
                    @PathParam("p1") String p1,
                    @PathParam("p2") Long p2,
                    @PathParam("p3") String p3,
                    @PathParam("p4") Long p4,
                    MyEntity entity); 

    @PUT
    @Path("/{p1}/something/{p2}/something/{p3}/something/{p4}")
    Response updateStuff(
                    @PathParam("p1") String p1,
                    @PathParam("p2") Long p2,
                    @PathParam("p3") String p3,
                    @PathParam("p4") Long p4); 
}

しかし、それはどちらもうまくいかなかった。

null entitesパラメータを扱う方法はありますか?

3

2 答え

あなたの例のように、メソッドオーバーロードは動作しますが(Apache-cxf 3.0でテストされています)、クライアントはエンティティなしでメソッドをヒットさせたいときに Content-Type:application/xml 署名の中で。

別のメディアタイプがすでにクラスレベルで定義されている場合は、そのメソッドに @Consumes(MediaType.WILDCARD)というアノテーションを付けます(下の例を参照)。

@Path("/")
@Consumes(MediaType.APPLICATION_XML)
public class myClass {

    @PUT
    @Path("/{p1}/something/{p2}/something/{p3}/something/{p4}")
    Response updateStuff(
                    @PathParam("p1") String p1,
                    @PathParam("p2") Long p2,
                    @PathParam("p3") String p3,
                    @PathParam("p4") Long p4,
                    MyEntity entity); 

    @PUT
    @Path("/{p1}/something/{p2}/something/{p3}/something/{p4}")
    @Consumes(MediaType.WILDCARD)
    Response updateStuff(
                    @PathParam("p1") String p1,
                    @PathParam("p2") Long p2,
                    @PathParam("p3") String p3,
                    @PathParam("p4") Long p4); 
}
0
追加された

あなたがWebサービスの @Consumes(MediaType.APPLICATION_XML)の場合、本文はnullにはなりません。 しかし、 @Provider を持つこれを処理すると、 MyEntity オブジェクトを読み取ることができます。

@Provider
@Consumes(MediaType.APPLICATION_XML)
public class XMLReader implements MessageBodyReader{

}
0
追加された