CXF и дополнительные параметры объекта

#cxf #jax-rs

#cxf #jax-rs

Вопрос:

Я использую 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 не может найти мой метод, если тело равно нулю. В журналах я могу найти предупреждение о пустом теле сообщения (от 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); 
}
  

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

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

Ответ №1:

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

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

}
  

Ответ №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); 
}