CXF ve isteğe bağlı varlık parametreleri

Apache CXF'yi JAX-RS uygulaması olarak kullanıyorum ve isteğe bağlı "varlık parametreleri" ile ilgili bir sorunum var. Bu kod parçasına bir göz atın:

@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); 
}

Varlık null değilse, her şey iyi çalışır.

Ancak istekleri boş gövdeyle işlemek istiyorum. Böyle bir durumda varlığın boş olacağını umuyorum. Ama bu doğru değil. CXF, beden boşsa, yöntemimi bulamıyor gibi görünüyor. Günlüklerde boş mesaj gövdesi (AbstractJAXBProvider'dan) hakkında uyarı bulabilirim ve hepsi bu.

Ayrıca updateStuff yöntemini aşırı yüklemeye çalıştım:

@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); 
}

Ama işe yaramadı.

Boş giriş parametrelerini nasıl kullanabileceğimiz hakkında bir fikriniz var mı?

3

2 cevap

Örneğinizde olduğu gibi, yöntem aşırı yüklemesi (Apache-cxf 3.0'da test edilmiştir), ancak istemci, metodu varlık olmadan vurmak istediğinde Content-Type: application/xml başlığını göndermemelidir. İmzada.

Sınıf düzeyinde başka bir ortam türü önceden tanımlanmışsa, yöntemi @Consumes (MediaType.WILDCARD) ile not alın, aşağıdaki örneğe bakın.

@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
katma

Sanırım, @Consumes (MediaType.APPLICATION_XML) webservice varsa, gövde boş olamaz. Ancak MyEntity nesnesini okumak için @Provider koduna sahip olursunuz.

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

}
0
katma