CXF и необязательные параметры объекта - PullRequest
3 голосов
/ 28 октября 2011

Я использую Apache CXF в качестве реализации JAX-RS, и у меня проблема с необязательными «параметрами объекта».Взгляните на этот фрагмент кода:

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

Если сущность не нулевая, все работает нормально.

Однако я хочу обрабатывать запросы с пустым телом.Я ожидаю, что в таком случае сущность будет нулевой.Но это не правда.Кажется, что CXF не может найти мой метод, если тело имеет значение null.В журналах я могу найти предупреждение о пустом теле сообщения (от 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?

Ответы [ 2 ]

0 голосов
/ 22 июля 2015

Перегрузка метода, как в вашем примере, работает (протестировано в 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 голосов
/ 17 ноября 2011

Я думаю, если вы webservice @Consumes(MediaType.APPLICATION_XML) тело не может быть нулевым.Но вы можете справиться с этим, имея @Provider для чтения MyEntity объекта.

...