CXF и необязательные параметры сущности

Я использую 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); 
}

Но это тоже не сработало.

У вас есть идеи, как обрабатывать нулевые параметры?


person Sebastian Łaskawiec    schedule 28.10.2011    source источник


Ответы (2)


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

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

}
person cgalleguillosm    schedule 17.11.2011

Перегрузка метода, как в вашем примере, работает (проверено в 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); 
}
person Christophe Weis    schedule 22.07.2015